SQL Server 2008 R2 sorgu optimizer bulmaca
Her ikisi de 9 milyon satır içeren iki masamız var. 70.000 sıra farklı, diğerleri aynı.
Bu hızlı, 13 saniye,
select * from bigtable1
except select * from similar_bigtable2
Bu, çıktıyı sıralar ve 13 saniye de hızlıdır,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Bu çok yavaş olsa da:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Ve hatta bazen ben hareket etmeden önce sorgunun belirli bir bölümünü önceden hesaplamak için gereken SQL Server ipucu için kullandığım bir "hile", çalışmıyor ve aynı zamanda yavaş sorgu ile sonuçlanır:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Sorgu planlarına bakmanın sebebini bulmak zor değildir:

SQL Server , hashmatch'tan önce 9 milyon satırlık iki tür yerleştirirken , hashmatch'tan sonra yalnızca bir tür 70.000 satır eklemesini tercih ederim .
Yani soru: Sorgu optimize ediciye bunu yapmasını nasıl söyleyebilirim?
EXCEPT(Örn. OUTER JOIN) 'E alternatif denediniz mi? Sözdiziminin daha az uygun olduğunu anlıyorum ama orada daha iyi indeks / birleştirme ipuçları ile oynayabilirsiniz (veya gerekmeyebilir). Şimdi kullandığınız alternatif (önce #temp tablosuna yerleştirilenler) son çare geçici çözümdür, ancak bazı durumlarda optimize ediciyi bir sorgunun iki bölümünü istediğiniz şekilde tamamen ayırmaya zorlamanın tek yoludur.