Apakah menggunakan DISTINCT sebagai petunjuk dalam subquery berguna?


18

Apakah menambahkan DISTINCTdalam 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:


25

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 Adaripada di B. Pengoptimal kemudian akan memilih Bsebagai tabel mengemudi di loop bersarang bergabung A. Untuk mendapatkan hasil yang benar kembali itu harus menggunakan Agregat Streaming di atas meja Bdi kedua kueri untuk mendapatkan hanya baris yang berbeda dari B. Jadi dalam hal ini kata kunci yang berbeda tidak berdampak pada kinerja.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

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
*******************
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.