Pa ovo je svetlosna brzina

Ja ne mogu da se setim niceg vise, ako neko zna jos neki stos, samo napred. nece bas sve da radi na svim platformama, ali ideje su tu. Secam se jedne knjige o MS SQL 6.5 (!!!!) gde je autor uporedio dve varijante sa subkverijima:
SELECT students.studentid
FROM students
WHERE NOT (EXISTS ( SELECT ministredstudents.studentid
FROM ministredstudents
WHERE ministredstudents.studentid = students.studentid));
i
SELECT * FROM Students
WHERE StudentId
NOT IN (SELECT StudentId FROM MinistredStudents)
Varijanta sa NOT IN se lakse razume, ali moze da bude sporija od varijante sa EXISTS. U varijanti sa NOT IN, unutrasnji kveri se izvrsava ceo za svaki red iz vanjskog kverija i vrsi se uporedjenje. Zamislite da Students ima 2 miliona redova i da nekih 90% studentata postoji u tabeli ministredstudents. NOT IN varijanta bi za svaki od 2 miliona rdova u Students izvrsila SELECT StudentId FROM MinistredStudents, sto vraca 1,800,000 redova, i onda se tekuci rediz Students poredi sa rezultatom SELECT StudentId FROM MinistredStudents. Uz korektno indeksiranje, poredjenje je brzo, medjutim problem je vracanje 1,800,000 redova 2 miliona puta da bi se jedan red uporedio s tim. Varijanta sa EXISTS takodje zahteva da se subkveri (unutrasnji) izvrsi 2,000,000 puta, ali ce vratiti samo jedan red. Kveri koji vraca jedan red uvek je brzi od kverija koji vraca 1,800,000 redova. Ovo je vazilo za SQL Server 6.5. Probao sam isto na MS SQL 2005 i razlike nema. Zasto? Pa query optimizer za 2005 je postao pametniji. Optimizer u 2005 prvo odradi subkveri jednom, to sacuva u memoriji i onda svaki red poredi sa tim 'medju rezultatom'. Optimizer u verziji 6.5 ocigledno nije bio toliko pametan.
Naravoucenije: posto znate nekoliko varijanti, pre nego sto se odlucite, probajte da analizirate kveri i vidite sta cete dobiti. Za ad-hoc zahteve je svejedno, ali ako ce vas kveri da vraca podatke za neku web aplikaciju, onda vam je brzina itekako od znacaja.