sql >> Databasteknik >  >> RDS >> Sqlserver

Två radikalt olika frågor mot 4 miljoner poster körs samtidigt - en använder brute force

Lita på optimeraren.

Skriv den fråga som enklast uttrycker vad du försöker uppnå. Om du har prestandaproblem med den frågan bör du titta på om det saknas några index. Men du ska fortfarande inte behöva explicit arbeta med dessa index.

Bry dig inte om hur du är kan implementera en sådan sökning.

I mycket sällsynta omständigheter kan du behöva ytterligare tvinga frågan att använda särskilda index (via tips), men detta är förmodligen <0,1 % av frågorna.

I dina publicerade planer orsakar din "optimerade" version skanningar mot 2 index av din (förmodar jag) Params-tabell (PK_Params_1, IX_Params_1). Utan att se frågorna är det svårt att veta varför detta händer, men om du jämför med att ha en enda skanning mot en tabell ("Brute force") och två, är det lätt att se varför den andra inte är mer effektiv.

Jag tror att jag skulle försöka:

        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]

d.v.s. introducera en anti-join som eliminerar de resultat du inte vill ha.



  1. Övervintra användning med många trådar

  2. Arbeta runt MySQL-felet Deadlock hittades när man försökte få lås; försök starta om transaktionen

  3. DBD::Oracle-installationen orsakar fel

  4. Hur tar jag bort ett fast antal rader med sortering i PostgreSQL?