Adından da anlaşılacağı gibi, bileşik bir dizin tek sütunlu bir dizinden farklıdır ve iki veya daha fazla sütundan oluşan bir dizindir. B ağacındaki veri yapısı nedir? Aşağıdaki şekilde gösterildiği gibi, iki sütunlu bileşik bir indekstir.
Dikkatlice gözlemlerseniz, yaprak düğümlerinin artan ASC'ye göre sıralandığını göreceksiniz. Şimdi ilk değere göre sıralayın ve ardından ikinci değere göre sıralayın. Aynısı kontrol için de geçerlidir, önce ilk değeri kontrol edin ve ikinci değeri kontrol edin. Üç sütundan oluşan bileşik bir dizin veri yapısının nasıl göründüğünü hayal edebilirsiniz.
Gerçekte bir tablo oluştururken, başlangıçta yalnızca bir birincil anahtar kimliği oluşturulur ve Oracle varsayılan olarak birincil anahtar için bir dizin oluşturur. Deneyim arttıkça performansı değerlendirmeye ve sorgu raporları ve siparişler gibi iş senaryoları gibi dizinleri incelemeye başlıyorum. Şu anda, az ya da çok dizin oluşturulacak ve ardından bileşik dizinler çalışmaya başlayacaktır. Bileşik indeksin getirdiği ilk soru, zihninizdeki B ağacında bir bileşik indeks yapısını nasıl oluşturacağınızdır? Ardından, bileşik bir endeksin nasıl oluşturulacağı sorusu geliyor.
Dizinin oluşturulması, sorgu verimliliğini artırmak içindir, ancak dizin tasarımı mantıksızdır ve yazma performansını etkiler, tıpkı CAP'nin koşullardan yalnızca ikisini karşılayabileceği gibi. Yani mükemmel bir şey yok, her şey çelişki içinde ilerliyor. Açıkça söylemek gerekirse, hedefe ulaşmak için en az, en basit yapı indeksini kullanmaktır.
Temel tablo:
Açıklama:
1. A, b ve c sıklıkla sorgulanır ve sık sık a, b ve c kombinasyon sorgusu olasılığı vardır
2. a sütunu çok ayırt edilemez ve hem b hem de c ayırt edilebilir (değerler çok fazla tekrarlanmayacaktır)
1. Sırasıyla a, b ve c üzerine tek sütunlu dizinler oluşturun, yani nihayet üç dizine sahibiz, yani (a), (b) ve (c). Tabii ki olabilir. Ama daha iyisi var mı?
2. (a, b), (b, c), (a, c) üzerinde bileşik bir indeks oluşturun. Sorun değil, ancak bakım maliyeti daha pahalı, daha iyisi var mı?
3. (a, b, c) üzerinde bileşik bir indeks oluşturun. Bunun bakımı da pahalıdır. Ve baştaki sütun olarak, a çok ayırt edilemez, bu da çok iyi bir seçim değildir.
4. En iyi yol, (b, c) üzerinde bileşik bir dizin ve c üzerinde tek sütunlu bir dizin oluşturmaktır, böylece (b, c) dizini a ve b ve b ve c sorgularını kapsayabilir ve c tek sütunlu dizini kapsayabilir Sorgulamak için a ve b'ye gidin.
1. Bir test tablosu oluşturun
TABLO OLUŞTUR sunyang_test ( kimlik Numarası, bir sayı, b numarası, c numarası ) tablo alanı ebiz; tabloyu değiştir sunyang_test kısıtı ekle pk_sunyang_test birincil anahtarı (id) indeks tablo alanını ebiz kullanarak;2. Verileri girin
başla 1 .. 100000 döngüdeki i için sunyang_test değerlerine (i, mod (i, 2), mod (i, 20000), mod (i, 20000)) ekleyin; son döngü; taahhüt; son;3. Bir dizin oluşturun
sunyang_test (b, c) tablo alanı ebiz üzerinde idx_sunyang_test_bc indeksi oluşturun; sunyang_test (c) tablepace ebiz üzerinde idx_sunyang_test_c indeksi oluşturun;4. Aşağıdaki SQL'i yürütün
sunyang_test'ten * öğesini seçin, burada b = 5000;Uygulama planı:
sunyang_test'ten * seçin, burada c = 5000;Uygulama planı:
sunyang_test'ten * öğesini seçin; burada a = 1 ve b = 5000;Uygulama planı:
sunyang_test'ten * öğesini seçin, burada a = 1 ve c = 5000;Uygulama planı:
sunyang_test'ten * seçin, burada b = 5000 ve c = 5000;Uygulama planı:
sunyang_test'ten * seçin; burada a = 1 ve b = 5000 ve c = 5000;Uygulama planı:
Görülebileceği gibi, a sütunu çok ayırt edilebilir olmadığında ve tek sütunlu sorgular veya a, b ve c'nin birleşik sorguları gerektiğinde, indekslemenin tüm sorgu koşullarını kapsayacağı ve dizinin karmaşık olmadığı görülebilir.
Bileşik indeksin tasarımı, öndeki sütunun (yani, bileşik indeksteki ilk sütun) seçimi için çok önemlidir.A'nın ayrımı çok düşük olduğundan, en azından burada bir bileşik indeksin ön sütunu olarak a seçilmemelidir. Bazıları, bir INDEX ATLAMA TARAMASI yok mu? Bu gerçekten a'nın gerçek değerine bağlıdır. Eğer a'nın değeri buradaki ikisi gibi çok küçükse, INDEX SKIP SCAN'a gidebilirsiniz, aksi takdirde ek yük çok büyüktür, Oracle genellikle doğrudan FULL TABLE SCAN'a gider ve gitmez INDEX SKIP SCAN, çünkü indeks bölme içerir.
Daha sonra daha fazla DBA içeriği paylaşılacak, ilgilenen arkadaşlar takip edebilir!