jddipqd
Čuven
- Učlanjen(a)
- 17.10.2000
- Poruke
- 2,555
- Poena
- 725
Oduvek sam mislio da kada uslov u WHEREu sigurno postane tačan ili sigurno netačan (1 OR nesto ili 0 AND nesto) da se to nesto neće evaluirati.
Međutim, ispada da nije tako... recimo imam ovakav nekakav upit
i taj upit se izvršava 20+ sekundi za tabelu koja ima ~45k recorda.
Međutim, ako upit preformulišem kao
isti rezultat dobijem za 2-3 sekunde
Jedino objašnjenje koje imam je da se u prvom slucaju EXISTS primenjuje na svaki od 45k recorda, bez obriza da li bi ga prost_uslov isekao, dok u drugom ja garantujem da će se primeniti samo na one koji su prošli prost_uslov.
Zar je moguće da SQL Server optimizer nije u stanju da uradi ovaku jednostavnu optimizaciju, ili to treba negde ručno da se uključi?
Edit... Zaboravih, u pitanju je SQL Server 2000.
Međutim, ispada da nije tako... recimo imam ovakav nekakav upit
Kod:
SELECT nesto
FROM tabela t1
INNER/LEFT JOIN x20
WHERE prost_uslov
AND (
EXISTS (
SELECT 1 FROM tabela t2
INNER JOIN x5
WHERE t1.id = t2.id
AND jos_uslova
)
OR prost_uslov_2
)
i taj upit se izvršava 20+ sekundi za tabelu koja ima ~45k recorda.
Međutim, ako upit preformulišem kao
Kod:
SELECT tx.nesto
FROM (
SELECT nesto
FROM tabela
INNER/LEFT JOIN x20
WHERE prost_uslov
) tx
INNER JOIN tabela t1
WHERE EXISTS (
SELECT 1 FROM tabela t2
INNER JOIN x5
WHERE t1.id = t2.id
AND jos_uslova
)
OR prost_uslov_2
Jedino objašnjenje koje imam je da se u prvom slucaju EXISTS primenjuje na svaki od 45k recorda, bez obriza da li bi ga prost_uslov isekao, dok u drugom ja garantujem da će se primeniti samo na one koji su prošli prost_uslov.
Zar je moguće da SQL Server optimizer nije u stanju da uradi ovaku jednostavnu optimizaciju, ili to treba negde ručno da se uključi?
Edit... Zaboravih, u pitanju je SQL Server 2000.
Poslednja izmena: