DISTINCT'i alt sorgularda ipucu olarak kullanmak faydalı mı?


18

DISTINCTAşağıdaki örnekte eklemenin sorgu çalışma süresi üzerinde herhangi bir etkisi var mı?
Bazen bir ipucu olarak kullanmak akıllıca mı?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 

Yanıtlar:


25

Bu gibi şeyleri merak ederken, sorgularınız için yürütme planlarını karşılaştırmalısınız.

Sorgunuz için yürütme planının şekli, elbette, tablolarınızda kaç satıra sahip olduğunuza ve hangi dizinlerin tanımlandığına bağlı olarak değişecektir.
Önemli ölçüde daha fazla satır zaman performansta bir fark yoktur, yalnızca bir senaryo Avardır olduğundan daha B. Daha sonra optimizer, Biç içe bir döngüde birleştirme tablosu olarak seçim yapar A. Doğru bir sonuç elde etmek için B, her iki sorguda da tablodan yalnızca farklı satırlar almak için bir Akış Toplaması kullanması gerekir B. Dolayısıyla bu durumda, belirgin anahtar kelimenin performans üzerinde hiçbir etkisi yoktur.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Test edilecek diğer iki belirgin durum için yürütme planı, B'de A'dan daha fazla satır ve tablolardaki eşit sayıda satır, sorgular için aynı yürütme planını da gösterir.

Güncelleme

Sorgu optimizasyonu gerçekleşmeden önce sorgu basitleştirme aşamasından geçer. 8606 izleme bayrağını kullanarak mantıksal ağacın nasıl göründüğünü görebilirsiniz.

Sorgular için Giriş Ağacı açıkça farklıdır, ancak basitleştirmeden sonra aynıdır.

Ref: Daha Belgesiz Sorgu Doktoru İzleme Bayrakları ve Sorgu Doktoru Derin Dalış - Bölüm 2

Farklı kullanarak sorgu için giriş ağacı ve basitleştirilmiş ağaç:

*** 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
*******************

Girdi ağaç ve sorgu için basitleştirilmiş ağaç değil ayrı kullanılarak:

*** 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
*******************
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.