5 Mayıs 2011, PERŞEMBE
'VEYA' bir İÇ BİRLEŞİM koşulu kötü bir fikir?
Son derece yavaş bir sorgu (çeşitli . hızını artırmak için çalışıyor ^em>dakikaeğer önemliyse SQL Server 2008) ~50,000 tek satır ile iki tablo üzerinde her olduğu gibi benim iç birleşim OR
bir sorun buldum,:
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
OR ot.ID = mt.ParentID
(Umduğum) sol eşdeğer bir çift, burada gösterilen katılırsa bu değişti:
SELECT mt.ID, mt.ParentID,
CASE WHEN ot1.MasterID IS NOT NULL THEN
ot1.MasterID ELSE
ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL
.. ve sorgu şimdi bir saniye içinde çalışıyor!
Genellikle kötü bir fikir OR
bir birleştirme koşulu koymak için mi? Ya da bir şekilde benim tablolar düzeni şanssız mıyım?
CEVAP
5 Mayıs 2011, PERŞEMBE
JOIN
bu tür HASH JOIN
MERGE JOIN
bir Bir için en iyi hale getirilebilen değildir.
İki resultsets bir birleşimi olarak ifade edilebilir:
SELECT *
FROM maintable m
JOIN othertable o
ON o.parentId = m.id
UNION
SELECT *
FROM maintable m
JOIN othertable o
ON o.id = m.parentId
her bir equijoin, ancak, SQL Server
'In doktoru yazdığın sorguda bunu görecek kadar zeki mantıksal olarak eşdeğer olsa da) değildir.
Bunu Paylaş:
REST API 404: Kötü URİ, Eksik veya Kay...
Varlık Çerçevesi: Bir Veritabanı, Bird...
Hangi bölümleri Real World Haskell şim...
İçiçe bloklar kötü bir fikir Yakalamak...
Https için http yeniden yönlendirme kö...