Dış Uygula ve Sol Katılma Performansı


37

SQL SERVER 2008 R2 Kullanıyorum

Ben sadece SQL'de APPLY ile karşılaştım ve birçok durumda sorgu problemlerini nasıl çözdüğünü sevdim.

Sonuçta 2 sol kullandığım tabloların birçoğunu elde etmek için 1 dış başvuruda bulunabildim.

Yerel DB tablolarımda az miktarda veri var ve dağıtımdan sonra kodun en az 20 kat daha büyük verilerde çalışması gerekiyordu.

Dış başvurunun büyük miktarda veri için kalan 2 katılma koşulundan daha uzun sürebileceğinden endişe duyuyorum.

Herkes tam olarak nasıl çalıştığını söyleyebilir ve performansı çok büyük verilerde nasıl etkileyeceğini söyleyebilir mi? 1.

2 sol birleştirme sorgusu burada

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

İşte outer application ile sorgu

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 

Yanıtlar:


44

Herkes tam olarak nasıl çalıştığını ve çok büyük verilerdeki performansı nasıl etkileyeceğini söyleyebilir mi?

APPLYilişkili bir birleşme ( LATERAL JOINbazı ürünlerde ve SQL Standard'ın yeni sürümlerinde denir ). Herhangi bir mantıksal yapı gibi, performans üzerinde doğrudan bir etkisi yoktur. Prensip olarak, herhangi bir mantıksal olarak eşdeğer sözdizimini kullanarak bir sorgu yazabilmeliyiz ve optimizer girdilerimizi tamamen aynı fiziksel uygulama planına dönüştürür.

Elbette, bu, optimizer’in mümkün olan her dönüşümü bilmesini ve her birini göz önünde bulundurmaya zaman ayırmasını gerektirecektir. Bu işlem, evrenin şu andaki yaşından daha uzun sürebilir, bu nedenle çoğu ticari ürün bu yaklaşımı benimsemez. Bu nedenle, sorgu sözdizimi, hangisinin daha iyi ve niçin olduğu hakkında genel açıklamalar yapmak zor olsa da, son performans üzerinde bir etkiye sahip olabilir ve sık sık olabilir.

Spesifik formu, OUTER APPLY ( SELECT TOP ... )ilişkili bir iç içe döngülerin SQL Server'ın geçerli sürümlerinde birleşmesiyle sonuçlanma olasılığı yüksektir, çünkü optimizer bu modeli eşdeğerine dönüştürmek için mantık içermez JOIN. İlişkilendirilmiş iç içe döngüler birleştirme, dış giriş büyükse ve iç girişin iç içe değilse veya gereken sayfalar zaten bellekte değilse iyi performans göstermeyebilir. Ek olarak, optimize edicinin maliyet modelinin belirli unsurları, korelasyonlu bir iç içe ilmeklerin birleşmesinin JOINparalel bir yürütme planı üretmek için semantik olarak aynı olandan daha az muhtemel olduğu anlamına gelir .

Tek sol birleştirme ve row_number () ile aynı sorguyu yapabildim

Bu, genel durumda daha iyi olabilir veya olmayabilir. Her iki alternatifi temsili verilerle performans testi yapmanız gerekecektir. LEFT JOINVe ROW_NUMBERkesinlikle daha verimli olmasını potansiyel var, ama seçilmiş kesin sorgu planı şekline bağlıdır. Bu yaklaşımın verimliliğini etkileyen birincil faktörler, gerekli sütunları kapsayacak ve ve PARTITION BYve ORDER BYfıkralarının ihtiyaç duyduğu sırayı sağlayacak bir endeksin mevcudiyetidir . İkinci bir faktör ise tablonun büyüklüğüdür. Sorgu ilgili tablonun nispeten küçük bir bölümüne temas ederse, verimli ve iyi endekslenmiş APPLYbir ROW_NUMBERoptimum indeksleme ile bir performans gösterebilir . Test gerekli.


2

İlk sorgu sql sunucusuna yalnızca bir istekle paralel çalışabilir. Tüm kayıtları aldı ve filtre kriterlerine göre çıktı verdi.

Ancak ikincinin durumunda satır satır çalışır ve her satır için Tablo2 taranır ve sonuç olarak eklenir.

Dış sorgunuzda daha az kayıt varsa, ikincisi daha iyidir (OUTER APPLY). Ancak, ilk sorgu daha fazla veri alabilirse, o zaman ilkini kullanmalısınız.

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.