SQL server 2008 R2 query optimizer puzzle
Kami memiliki dua tabel, keduanya berisi 9 juta baris. 70.000 baris berbeda, yang lain sama.
Ini cepat, 13 detik,
select * from bigtable1
except select * from similar_bigtable2
Ini memilah output dan juga cepat, 13 detik juga,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Meskipun ini sangat lambat:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Dan bahkan "trik" yang kadang-kadang saya gunakan untuk mengisyaratkan SQL Server bahwa ia perlu menghitung ulang bagian tertentu dari kueri sebelum melanjutkan, tidak berfungsi dan menghasilkan kueri lambat juga:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Melihat rencana kueri alasannya tidak sulit ditemukan:
SQL Server menempatkan dua jenis 9 juta baris sebelum hashmatch, sementara saya lebih suka untuk menambahkan hanya satu jenis 70.000 baris setelah hashmatch.
Jadi pertanyaannya: bagaimana saya bisa memerintahkan pengoptimal kueri untuk melakukan itu?
EXCEPT
(misalnya OUTER JOIN
)? Saya menyadari sintaksnya kurang nyaman tetapi Anda mungkin dapat bermain dengan petunjuk indeks / bergabung lebih baik di sana (atau Anda mungkin tidak perlu). Alternatif yang Anda gunakan sekarang (memasukkan item ke tabel #temp terlebih dahulu) adalah solusi terakhir tetapi dalam beberapa kasus adalah satu-satunya cara untuk memaksa pengoptimal untuk sepenuhnya memisahkan dua bagian dari kueri dengan cara yang Anda inginkan.