Ya, Anda bisa, dan Anda juga bisa membuat pengoptimal mengenalinya.
Paul White memiliki lagu kecil ini :
WHERE NOT EXISTS (
SELECT d.[Data]
INTERSECT
SELECT i.[Data])
Ini berfungsi karena semantik INTERSECT
yang berurusan dengan nol. Apa yang dikatakan di sini adalah "apakah tidak baris dalam subquery yang terdiri dari nilai B dan nilai B", ini hanya akan dipenuhi jika keduanya adalah nilai yang berbeda atau salah satunya adalah nol dan yang lainnya tidak. Jika keduanya nol, akan ada baris dengan nol.
Jika Anda memeriksa paket kueri XML (bukan yang grafis di SSMS), Anda akan melihat bahwa paket tersebut dikompilasi hingga d.[Data] <> i.[Data]
, tetapi operator yang digunakannya akan memiliki CompareOp="IS"
dan bukan EQ
.
Lihat paket lengkapnya di sini .
Bagian yang relevan dari rencana tersebut adalah:
<Predicate>
<ScalarOperator ScalarString="@t1.[i] as [t1].[i] = @t2.[i] as [t2].[i]">
<Compare CompareOp="IS">
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t1" Alias="[t1]" Column="i" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t2" Alias="[t2]" Column="i" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Predicate>
Saya menemukan pengoptimal bekerja dengan sangat baik seperti ini, daripada melakukan EXISTS / EXCEPT
.
Saya mendorong Anda untuk memilih Umpan Balik Azure untuk menerapkan operator yang tepat