2011-02-16 14 views
6

Çok yüksek I/O beklemeli bir sunucuda sorun giderirken, SELECT max(x) FROM t WHERE y = ? numaralı sorgulardan gelen çok sayıda G/Ç olduğunu görüyorum.İndeks taraması geri indeks taraması vs

Diziniüm btree (x, y).

Sorgu planının, en fazla almak için Dizin Tarama Geriye doğru yaptıklarını fark ettim. Kötümü? Bunun için endişelenmeli ve belki başka bir dizin (tersine) eklemem gerekir mi? Veya bu tür sorgulara uygun bir dizin oluşturmanın daha iyi bir yolu var mı?

cevap

12

Hayır, fena değil, ilk dizin sayfasından başlayacağınız ilk dizin sayfasından başlamak için aynı zaman alır. DESC'u kullanarak inen bir dizin oluştururken "farkı" görebilirsiniz.

Bu sorgu için bir dizin (y, x) muhtemelen daha iyi olacaktır.

+0

(y, x) üzerinde bir indeks oluşturma, sorgu maliyetini 10k'dan 300'e düşürdü ve çok az sorgulama süresi. X DESC sahibi olmak bir fark yaratmaz. Bahşiş için teşekkürler! – ibz

+0

Harika, bu efendim için teşekkürler! İndeksi değiştirdikten sonra benzer bir sorun ve benzer performans etkisi yaşadım. – TheDeadSerious

+0

https://stackoverflow.com/users/271959/frank-heikens (y, x) üzerindeki bir endeksin neden bir dizinden (x, y) daha düşük bir sorgu süresine sahip olduğunu açıklayabilir misiniz? Teşekkürler. – nisanth074

2

Dizin en düşük değeri olan, sıralanmış. Maksimum değeri bulmak için, geriye doğru indeks taraması ilk olarak maksimum değeri bulacaktır :).

SELECT min (x) 'in normal indeks taramasıyla sonuçlanacağını sanıyorum, değil mi?

+0

Evet, min (x) normal tarama yapar. – ibz

İlgili konular