Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Две коренно различни заявки срещу 4 милиона записа се изпълняват едновременно - едната използва груба сила

Доверете се на оптимизатора.

Напишете заявката, която най-просто изразява това, което се опитвате да постигнете. Ако имате проблеми с производителността с тази заявка, тогава трябва да погледнете дали има липсващи индекси. Но все пак не трябва да го правите изрично работа с тези индекси.

Не се безпокойте от съображения за това как вие може да приложи такова търсене.

В много в редки случаи може да се наложи допълнително да принудите заявката да използва конкретни индекси (чрез подсказки), но това вероятно е <0,1% от заявките.

Във вашите публикувани планове вашата „оптимизирана“ версия причинява сканиране срещу 2 индекса на вашата (предполагам) таблица с параметри (PK_Params_1, IX_Params_1). Без да виждате заявките, е трудно да разберете защо това се случва, но ако сравнявате едно сканиране срещу таблица („Груба сила“) и две, лесно е да разберете защо второто не е по-ефективно.

Мисля да опитам:

        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]

т.е. въведете анти-съединяване, което елиминира резултатите, които не искате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:множество индекси за една и съща производителност на колони

  2. SQL Server, намерете произволна последователност от стойности

  3. Тип данни за съхраняване на IP адрес в SQL Server

  4. Добавете колона към съществуваща таблица и ги номерирайте уникално в MS SQL Server

  5. Избягване на SQL инжектиране без параметри