sql >> Base de Datos >  >> RDS >> Sqlserver

Dos consultas radicalmente diferentes contra registros de 4 mil se ejecutan al mismo tiempo:una usa fuerza bruta

Confía en el optimizador.

Escriba la consulta que exprese de manera más simple lo que está tratando de lograr. Si tienes problemas de rendimiento con esa consulta, entonces debe ver si faltan índices. Pero aun así no deberías tener que explícitamente trabajar con estos índices.

No se preocupe por consideraciones de cómo usted podría implementar tal búsqueda.

En muy En circunstancias excepcionales, es posible que deba forzar aún más la consulta para que use índices particulares (a través de sugerencias), pero esto probablemente sea <0.1% de las consultas.

En sus planes publicados, su versión "optimizada" está causando escaneos en 2 índices de su (supongo) tabla Params (PK_Params_1, IX_Params_1). Sin ver las consultas, es difícil saber por qué sucede esto, pero si compara con tener un solo escaneo contra una tabla ("Fuerza bruta") y dos, es fácil ver por qué el segundo no es más eficiente.

Creo que intentaría:

        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]

Es decir. introduzca un anti-join que elimine los resultados que no desea.