Düzenleme: +1 bu durumda çalışır, çünkü bunun FILE_NUMBER
bir tamsayı'nın sıfır dolgulu dize sürümüdür. Buradaki dizgiler için daha iyi bir çözüm ''
, bir değer eklemek sırasını etkileyebileceği için veya (sabit dize gibi sabit olan ancak belirleyici olmayan bir işlev içeren bir şey eklemek için sayıların eklenmesidir (boş dize) sign(rand()+1)
. 'Sıralamayı bozma' fikri hala burada geçerli, sadece yöntemim ideal değildi.
+1
Hayır, demek istediğim hiçbir şeye katılmıyorum, demek istediğim bir çözüm olarak. Sorgunuzu değiştirirseniz, ORDER BY cj.FILE_NUMBER + 1
o zaman TOP 1
farklı davranır.
Görüyorsunuz, sıralı bir sorgu için küçük satır hedefi varken sistem, Sıralama işlecine sahip olmamak için verileri sırayla tüketmeye çalışır. Aynı zamanda bir karma tablo oluşturmaktan kaçınacak, ilk sırayı bulmak için muhtemelen çok fazla iş yapmak zorunda olmadığını belirleyecektir. Senin durumunda, bu yanlış - bu okların kalınlığından, tek bir eşleşme bulmak için çok fazla veri tüketmek zorunda gibi görünüyor.
Bu okların kalınlığı DOCUMENT_QUEUE
(DQ) tablonuzun CORRESPONDENCE_JOURNAL
(CJ) tablonuzdan çok daha küçük olduğunu gösterir . Ve en iyi plan aslında DQ sıraları üzerinden bir CJ sırasını bulana kadar kontrol etmek olacaktır. Aslında, Query Optimizer'ın (QO) ORDER BY
orada bu sinir bozucu olmasaydı yapacağı şey buydu, bu CJ'daki bir kapak endeksi tarafından güzel bir şekilde desteklendi.
Bu yüzden, ORDER BY
tamamen düşürdüyseniz, DQ'daki sıraların üzerinde yinelenen ve sıranın var olduğundan emin olmak için CJ'ye giden bir Yuvalanmış Döngü içeren bir plan elde edersiniz. Ve TOP 1
bu, tek bir satır çekildikten sonra dururdu.
Ancak, ilk sıraya gerçekten ihtiyacınız varsa FILE_NUMBER
, o zaman sistemi çok yardımcı gibi görünen bu dizini görmezden gelmek için kandırabilirdiniz. Bunu yaparak ORDER BY CJ.FILE_NUMBER+1
- ki bunun daha önce olduğu gibi aynı derecede, ancak en önemlisi QO'yu koruyacağını biliyoruz. yapmaz. QO bütünüyle anlaşılmaya odaklanacak, böylece bir Top N Sort operatörü tatmin edilebilecekti. Bu yöntem, siparişin değerini hesaplamak için bir Hesaplama Skaler işleci ve ilk satırı almak için bir Top N Sort işleci içeren bir plan üretmelidir. Ancak bunların sağında, CJ’de çok fazla Seeks yapan hoş bir Yuvalanmış Döngü görmelisiniz. Ve DQ'da hiçbir şeye uymayan geniş bir satır tablosundan geçmekten daha iyi performans.
Karma Eşlemenin mutlaka korkunç olması gerekmez, ancak DQ'dan döndürdüğünüz satır kümesi CJ'den çok daha küçükse (olmasını beklediğim gibi), o zaman Karma Eşleşmesi çok daha fazla CJ tarıyor olacak ihtiyaç duyduğundan daha fazla.
Not: Sorgu en iyi duruma getiricisinin +0'ın hiçbir şeyi değiştirmeyeceğini fark etmesi muhtemel olduğundan +0 yerine +1 kullandım. Elbette, aynı şey + 1 için de geçerli olabilir, eğer şimdi değilse, o zaman gelecekte bir noktada.
DOCUMENT_ID
İki tablo arasındaki ilişkiyi zorlayan yabancı bir anahtar kısıtınız var mı (ya da her kayıttaCORRESPONDENCE_JOURNAL
eşleşen bir kayıt varDOCUMENT_QUEUE
mı)?