SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • girleffect

    girleffect

    20 Mayıs 2008
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • mist64

    mist64

    30 Mayıs 2006