sql >> Database teknologi >  >> RDS >> Sqlserver

UNION ALL Performance I SQL Server 2005

Sørg for at rydde eksekveringen + datacachen mellem hver testkørsel.

f.eks.

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Hvis du først kører med UNION ALL og derefter kører de 2 valg separat bagefter, vil dataene allerede være cachelagret i hukommelsen, hvilket gør ydeevnen meget bedre (det giver derfor det falske indtryk, at den efterfølgende tilgang er hurtigere, når den måske ikke er det).

Hvis du brugte en UNION, kan det meget vel være langsommere, da den skal anvende en DISTINCT, men UNION ALL behøver ikke at gøre det, så det burde ikke være anderledes.

Opdatering:
Kig på udførelsesplanerne og sammenlign dem – se om der er forskel. Du kan se eksekveringsplanen ved at klikke på knappen "Inkluder faktisk eksekveringsplan" i SSMS, før du kører forespørgslen

Opdatering 2:
Baseret på de givne CTE'er tror jeg, at jeg ville overveje at optimere dem - jeg tror ikke, at UNION ALL faktisk er problemet.

IMHO, den bedste ting at prøve er at arbejde gennem CTE'erne en efter en og prøve at optimere hver enkelt individuelt, så når du derefter kombinerer dem alle i hovedforespørgslen, yder de bedre.

for eksempel. for tDictionaryStreets, hvad med at prøve dette:

SELECT DISTINCT
    r.KladrItemName AS RegionName,
        a.KladrItemName AS AreaName,
        c.KladrItemName AS CityName,
        sc.KladrItemName AS SubCityName,
        s.StreetName      
FROM StreetNames s
    JOIN tFoundStreets fs ON s.StreetName = fs.KladrItemName
    LEFT JOIN tFoundRegions r ON s.RegionName = r.KladrItemName
    LEFT JOIN tFoundAreas a ON s.AreaName = a.KladrItemName
    LEFT JOIN tFoundCities c ON s.CityName = c.KladrItemName
    LEFT JOIN tFoundSubCities sc ON s.SubCityName = scc.KladrItemName

KladrItemName på hver tabel skal som minimum have et indeks på. Prøv også at omarbejde tDictionarySubCities på samme måde med joins.



  1. Et første kig på den nye SQL Server Cardinality Estimator

  2. XMLAGG med RTRIM-problem

  3. hæve applikationsfejl Trigger i MySQL DBMS

  4. Er det bedre at udføre mange sql-kommandoer med én forbindelse, eller oprette forbindelse igen hver gang?