SORU
28 NİSAN 2010, ÇARŞAMBA


İÇ vs SOL SQL Sunucu performans BİRLEŞTİRME

İÇ 9 tablo için BİRLEŞTİRME kullanan bir SQL komutu oluşturdum, zaten bu komut çok uzun bir süre (en fazla beş dakika). Benim halk beni değiştirmek için iyi olur SOL İÇ performansı daha iyi olur çünkü KATILMAK KATILMAK, ilk başta ne rağmen biliyorum zaman SOL için Facebook'a KATIL. Üzerimi değiştirdikten sonra, sorgu hızını önemli ölçüde artırmak.

Neden SOL KATIL daha hızlı İÇ daha olduğunu bilmek gibi katılacak?

SQL komutu aşağıdaki gibi: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D ve benzeri

Güncelleme: Bu benim şema kısa.

FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
    INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
        ON a.CompanyCd = b.CompanyCd 
           AND a.SPRNo = b.SPRNo 
           AND a.SuffixNo = b.SuffixNo 
           AND a.dnno = b.dnno
    INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine
        ON a.CompanyCd = h.CompanyCd
           AND a.sprno = h.AcctSPRNo
    INNER JOIN exFSlipHdr c -- PK = CompanyCd, FSlipNo, FSlipSuffix
        ON c.CompanyCd = h.CompanyCd
           AND c.FSlipNo = h.FSlipNo 
           AND c.FSlipSuffix = h.FSlipSuffix 
    INNER JOIN coMappingExpParty d -- NO PK AND FK
        ON c.CompanyCd = d.CompanyCd
           AND c.CountryCd = d.CountryCd 
    INNER JOIN coProduct e -- PK = CompanyCd, ProductSalesCd
        ON b.CompanyCd = e.CompanyCd
           AND b.ProductSalesCd = e.ProductSalesCd 
    LEFT JOIN coUOM i -- PK = UOMId
        ON h.UOMId = i.UOMId 
    INNER JOIN coProductOldInformation j -- PK = CompanyCd, BFStatus, SpecCd
        ON a.CompanyCd = j.CompanyCd
            AND b.BFStatus = j.BFStatus
            AND b.ProductSalesCd = j.ProductSalesCd
    INNER JOIN coProductGroup1 g1 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup1Cd
        ON e.ProductGroup1Cd  = g1.ProductGroup1Cd
    INNER JOIN coProductGroup2 g2 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup2Cd
        ON e.ProductGroup1Cd  = g2.ProductGroup1Cd

CEVAP
28 NİSAN 2010, ÇARŞAMBA


LEFT JOIN kesinlikle INNER JOIN bir daha hızlı değildir. Aslında, yavaş; tanım gereği, bir dış birleşim (LEFT JOIN RIGHT JOIN) için yaptıkları bir çalışma INNER JOIN artı ekstra iş null uzanan sonuçları. Ayrıca daha fazla satır dönmek için, daha fazla toplam yürütme zamanı sadece sonuç kümesi daha büyük boyutu nedeniyle artması bekleniyor.

(LEFT JOIN bileedildidaha hızlıözeldurumlar faktörleri zor düşünün biraz izdiham nedeniyle, işlevsel olarak sadece birini diğeri ile tüm örneklerini değiştirmek gidemezsin* *10, Bir çok eşdeğer değildir!)

Muhtemelen performans sorunları başka bir aday anahtar olmaması veya yabancı anahtar dizine doğru gibi yalan. 9 tablo çok yavaşlama kelimenin tam anlamıyla hemen hemen her yerde olabilir katıldığım için çok yüksek bir rakam. Size şema yayınlarsanız, daha fazla bilgi sağlamak mümkün olabilir.


Düzenleme:

Bunun üzerinde daha fazla yansıtan, LEFT JOIN INNER JOIN ve o zaman bir daha hızlı olabilir bir durum bence

  • Bazı tablolar vardırçokküçük (diyelim ki, 10 satır altında);
  • Tablolar sorgu karşılamak için yeterli bir dizin yok.

Örnek:

CREATE TABLE #Test1
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test1 (ID, Name) VALUES (1, 'One')
INSERT #Test1 (ID, Name) VALUES (2, 'Two')
INSERT #Test1 (ID, Name) VALUES (3, 'Three')
INSERT #Test1 (ID, Name) VALUES (4, 'Four')
INSERT #Test1 (ID, Name) VALUES (5, 'Five')

CREATE TABLE #Test2
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test2 (ID, Name) VALUES (1, 'One')
INSERT #Test2 (ID, Name) VALUES (2, 'Two')
INSERT #Test2 (ID, Name) VALUES (3, 'Three')
INSERT #Test2 (ID, Name) VALUES (4, 'Four')
INSERT #Test2 (ID, Name) VALUES (5, 'Five')

SELECT *
FROM #Test1 t1
INNER JOIN #Test2 t2
ON t2.Name = t1.Name

SELECT *
FROM #Test1 t1
LEFT JOIN #Test2 t2
ON t2.Name = t1.Name

DROP TABLE #Test1
DROP TABLE #Test2

Bu çalışma ve yürütme planı görüntülemek, INNER JOIN sorgu aslında iki kriter yukarıda karşılar, çünkü daha fazla LEFT JOIN maliyet yapar görürsünüz. SQL Server INNER JOIN için karma bir maç yapmak istiyor ama LEFT JOIN; eski olduğu için döngüler iç içe çünkünormaldeçok daha hızlı, ama satır sayısı çok küçükvekullanmak için dizin yok, karma işlem sorgu en pahalı parçası olduğu ortaya çıkıyor.

5 Element, vs, 5 Element ile karma bir tablo ile bir liste üzerinde aramaları çok sayıda gerçekleştirmek için favori programlama dilinde bir program yazarak aynı etkiyi görebilirsiniz. Boyutu nedeniyle, karma tablo sürüm aslında daha yavaştır. Ama 50 element veya 5000 elemanları için, bu artış ve liste sürümü(N) vs. O(1) karma tablo için çünkü bir tarama yavaşlatır.

Ama bu sorgu Name yerine ID sütunu değiştirmek ve çok farklı bir hikaye göreceksiniz. Bu durumda, her iki sorgu için iç içe döngü yapar, ama INNER JOIN sürüm bir arama ile kümelenmiş dizin tarar birini değiştirmek mümkün - bu tam anlamıyla olacak anlamına gelirbir büyüklük sırasıdaha hızlı çok sayıda satır ile.

Sonuç birkaç paragraf yukarıda; bu neredeyse kesinlikle dizin veya dizin kapsamı bir sorun bahsettiğim şey daha fazla veya daha az, muhtemelen bir veya daha çok küçük tabloları ile birleştirilir. Bu SQL Server tek bir şart vardırolabilirbazen LEFT JOIN bir daha INNER JOIN kötü bir yürütme planı seçin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cartoonium

    Cartoonium

    11 NİSAN 2011
  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009