Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dua kueri yang sangat berbeda terhadap 4 juta catatan dieksekusi dalam waktu yang sama - satu menggunakan kekuatan kasar

Percayai pengoptimal.

Tulis kueri yang paling sederhana mengungkapkan apa yang ingin Anda capai. Jika Anda mengalami masalah kinerja dengan kueri itu, maka Anda harus melihat apakah ada indeks yang hilang. Tapi Anda tetap tidak harus secara eksplisit bekerja dengan indeks ini.

Jangan khawatirkan diri Anda dengan pertimbangan tentang bagaimana Anda mungkin menerapkan penelusuran semacam itu.

Dalam sangat keadaan langka, Anda mungkin perlu memaksa kueri lebih lanjut untuk menggunakan indeks tertentu (melalui petunjuk), tetapi ini mungkin <0,1% kueri.

Dalam paket yang Anda posting, versi "dioptimalkan" Anda menyebabkan pemindaian terhadap 2 indeks tabel Params (saya kira) Anda (PK_Params_1, IX_Params_1). Tanpa melihat kueri, sulit untuk mengetahui mengapa ini terjadi, tetapi jika Anda membandingkan dengan pemindaian tunggal terhadap tabel ("Brute force") dan dua, mudah untuk melihat mengapa yang kedua tidak lebih efisien.

Saya pikir saya akan mencoba:

        SELECT      p.ProductID, ptr.[Rank]
        FROM        dbo.SearchItemsGet(@SearchID, NULL) AS si
                    JOIN dbo.ProductDefs AS pd
        ON          pd.ParamTypeID = si.ParamTypeID
                    JOIN dbo.Params AS p
        ON          p.ProductDefID = pd.ProductDefID
                    JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
        ON          ptr.ProductTypeID = pd.ProductTypeID

LEFT JOIN Params p_anti
    on p_anti.ProductDefId = pd.ProductDefID and
         (p_anti.ParamLo < si.LowMin or p_anti.ParamHi > si.HiMax)


        WHERE       si.Mode IN (1, 2)

AND p_anti.ProductID is null

        GROUP BY    p.ProductID, ptr.[Rank]

Yaitu. memperkenalkan anti-gabung yang menghilangkan hasil yang tidak Anda inginkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memilih N baris di SQL Server

  2. Bagaimana CAST() Bekerja di SQL Server

  3. Agregasi string yang dikelompokkan / LISTAGG untuk SQL Server

  4. Dari .NET saya bisa mendapatkan string SQL lengkap yang dihasilkan oleh objek SqlCommand (dengan Parameter SQL)?

  5. SQL Server - klausa IN dengan banyak bidang