sql >> Databasteknik >  >> RDS >> Sqlserver

val av operatör för frågeoptimerare - kapslade loopar kontra hashmatchning (eller sammanfogning)

ABSOLUT. En hashmatch skulle vara en enorm förbättring. Att skapa hash på den mindre tabellen med 19 223 rader och sedan söka i den med den större tabellen med 65 991 rader är en mycket mindre operation än den kapslade slingan som kräver 1 268 544 993 radjämförelser.

Den enda anledningen till att servern skulle välja de kapslade slingorna är att den kraftigt underskattade antalet inblandade rader. Har dina tabeller statistik över dem, och i så fall uppdateras de regelbundet? Det är statistik som gör det möjligt för servern att välja bra genomförandeplaner.

Om du har åtgärdat statistik korrekt och fortfarande har ett problem kan du tvinga den att använda en HASH-koppling så här:

SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Observera att i samma ögonblick som du gör detta kommer det också att tvinga fram anslutningsordern. Det betyder att du måste ordna alla dina bord korrekt så att deras sammanfogningsordning är vettig. I allmänhet skulle du undersöka exekveringsplanen som servern redan har och ändra ordningen på dina tabeller i frågan för att matcha. Om du inte är bekant med hur man gör detta är grunderna att varje "vänster" ingång kommer först, och i grafiska exekveringsplaner är den vänstra ingången den nedre ett. En komplex koppling som involverar många tabeller kan behöva gruppera kopplingar inom parentes, eller använda RIGHT JOIN för att få exekveringsplanen att bli optimal (byt vänster och höger ingångar, men introducera tabellen vid rätt punkt i sammanfogningsordningen).

Det är i allmänhet bäst att undvika att använda anslutningstips och tvinga fram ordningsföljd, så gör vad du kan först! Du kan titta på indexen på tabellerna, fragmentering, minska kolumnstorlekar (som att använda varchar istället för nvarchar där Unicode inte krävs), eller dela upp frågan i delar (infoga först i en temporär tabell och gå sedan med i den).



  1. Ruby Gem för mysql 5.5 i windows

  2. Returnera alla icke-beräknade kolumner från en tabell i SQL Server

  3. Inga mappade Doctrin ORM-entiteter enligt den aktuella konfigurationen

  4. Hur kan jag fixa min Python F-sträng i min fråga så att den inte är sårbar för SQL-injektioner?