İÇ 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
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.
BirleÅŸtirme, Performans php String...
Git çatışmalar düzeltme birleştirme?...
Git birleÅŸtirme geri?...
Bir birleştirme çatışma ile karşılaştı...
git iş akışı ve rebase vs birleştirme ...