Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dwa radykalnie różne zapytania dotyczące rekordów 4 mln są wykonywane w tym samym czasie - jedno wykorzystuje brute force

Zaufaj optymalizatorowi.

Napisz zapytanie, które najprościej wyraża to, co chcesz osiągnąć. Jeśli masz problemy z wydajnością z tym zapytaniem, powinieneś sprawdzić, czy nie ma brakujących indeksów. Ale nadal nie powinieneś wyraźnie pracuj z tymi indeksami.

Nie przejmuj się rozważaniami o tym, jak ty może zaimplementować takie wyszukiwanie.

W bardzo W rzadkich przypadkach może być konieczne dalsze wymuszenie użycia w zapytaniu określonych indeksów (poprzez podpowiedzi), ale prawdopodobnie jest to <0,1% zapytań.

W opublikowanych planach Twoja „zoptymalizowana” wersja powoduje skanowanie 2 indeksów Twojej (przypuszczam) tabeli Params (PK_Params_1, IX_Params_1). Bez oglądania zapytań trudno jest zrozumieć, dlaczego tak się dzieje, ale jeśli porównujesz z pojedynczym skanowaniem tabeli ("Brute force") i dwoma, łatwo zrozumieć, dlaczego drugi nie jest bardziej wydajny.

Myślę, że spróbuję:

        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]

Tj. wprowadź zabezpieczenie przed sprzężeniem, które eliminuje niepożądane rezultaty.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przechowywanie formuły (równań) w bazie danych do późniejszej oceny (SQL Server 2005)

  2. Wybierz wiersz, którego wartość wyrażenia kolumny jest poprawna

  3. Architektura programu SQL Server AlwaysOn (grupa dostępności) i instalacja krok po kroku — 3 kroki ręcznego przełączania awaryjnego

  4. Uruchamianie dużych zapytań w tle MS SQL

  5. Korzystanie z PIVOT w SQL Server 2008