Apakah menambahkan DISTINCT
dalam contoh berikut ini berdampak pada waktu berjalan kueri?
Apakah bijaksana untuk menggunakannya sebagai petunjuk kadang-kadang?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Apakah menambahkan DISTINCT
dalam contoh berikut ini berdampak pada waktu berjalan kueri?
Apakah bijaksana untuk menggunakannya sebagai petunjuk kadang-kadang?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Jawaban:
Ketika bertanya-tanya tentang hal-hal seperti ini, Anda harus membandingkan rencana eksekusi untuk pertanyaan Anda.
Bentuk rencana eksekusi untuk permintaan Anda tentu saja akan berbeda tergantung pada berapa banyak baris yang Anda miliki di tabel Anda dan indeks apa yang didefinisikan.
Satu skenario yang menunjukkan tidak ada perbedaan dalam kinerja adalah ketika ada lebih banyak baris A
daripada di B
. Pengoptimal kemudian akan memilih B
sebagai tabel mengemudi di loop bersarang bergabung A
. Untuk mendapatkan hasil yang benar kembali itu harus menggunakan Agregat Streaming di atas meja B
di kedua kueri untuk mendapatkan hanya baris yang berbeda dari B
. Jadi dalam hal ini kata kunci yang berbeda tidak berdampak pada kinerja.
Rencana eksekusi untuk dua kasus nyata lainnya untuk diuji, lebih banyak baris dalam B dari A dan jumlah baris yang sama dalam tabel, juga menunjukkan rencana eksekusi yang sama persis untuk kueri.
Memperbarui
Sebelum optimasi kueri berlangsung, kueri melewati fase penyederhanaan. Anda dapat melihat seperti apa pohon logis menggunakan bendera jejak 8606.
Input Tree untuk kueri jelas berbeda tetapi setelah penyederhanaan mereka sama.
Ref: Lebih Banyak Bendera Tanpa Jejak Jejak Jejak dan Penyelam Dalam Kueri - Bagian 2
Pohon input dan pohon disederhanakan untuk kueri menggunakan berbeda:
*** Input Tree: ***
LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Select
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
ScaOp_SomeComp 2
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
LogOp_GbAgg OUT(QCOL: [xx].[dbo].[B].SomeColumn,) BY(QCOL: [xx].[dbo].[B].SomeColumn,)
LogOp_Project
LogOp_Project
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
AncOp_PrjList
AncOp_PrjList
AncOp_PrjList
AncOp_PrjList
*******************
*** Simplified Tree: ***
LogOp_LeftSemiJoin
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************
Pohon input dan pohon yang disederhanakan untuk kueri yang tidak menggunakan perbedaan:
*** Input Tree: ***
LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Select
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
ScaOp_SomeComp 2
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Project
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
AncOp_PrjList
AncOp_PrjList
*******************
*** Simplified Tree: ***
LogOp_LeftSemiJoin
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************