Genel olarak, birincil anahtar türlerimiz sayılardır, ancak yine de birincil anahtar alan türünü varchar olarak tasarlayan bazı garip sistemler vardır. Şimdi bu iki türün yürütme planı üzerindeki etkisine bir göz atalım.
- 3 milyon veri girin
t1 select'test ',' test ',' test ', rownum, rownum,' test ', sysdate, sysdate,' test ',' t ',' t ',' t ',' t ', rownum, 'test', rownum ile ikili bağlantıdan rownum < = 3000000; t2 select'test ',' test ',' test ', rownum, rownum,' test ', sysdate, sysdate,' test ',' t ',' t ',' t ',' t ', rownum, 'test', rownum ile ikili bağlantıdan rownum < = 3000000; taahhüt;dbms_stats.gather_table_stats (kendiadı = > 'SCOTT', tabname = > 'T1', kademeli = > true, estimate_percent = > 100);
dbms_stats.gather_table_stats (kendiadı = > 'SCOTT', tabname = > 'T2', kademeli = > true, estimate_percent = > 100);
t1
Sıradan sayısal alanlar için, aralık sorgusu normal bir dizin aralığı taramasıdır ve yürütme verimliliği çok yüksektir.
Metin alanlı tablolar için, aralık sorgusu, nispeten verimsiz olan karşılık gelen tam taramadır.
1. Karakter türü dizinde sıra dışı ve karakter türünün sıralama yöntemi beklentilerimizden farklı. İd'nin bulunduğu t2'den * seçmeye dikkat edin > = '2999990' yürütme 10 kayıt değil 777788 satır döndürür, bu tablo tasarlanırken dikkat edilmesi gereken noktadır.
2. Karakter türü de kümeleme faktörünün çok büyük olmasına neden olur. Bunun nedeni, ekleme sırasının sıralama düzeninden farklı olmasıdır.Aslında, numara türüne (1 ... 3000000) ve karakter türüne göre ('1' ... '3000000' girilir) ) T sıralama
3. Karakter türleri için büyüktür operatörü kullanıldığında, optimize edici dizindeki verilerin çoğunun taranması gerektiğini ve kümeleme faktörünün büyük olduğunu düşünecek ve son olarak tam tablo tarama modunu seçecektir.
ps: çözüm
'2999990' ve '3000000' arasında id olduğunda t2'den * seçin;Burada SQL ifadesi geliştirme aralığına göre taranır ( > =) kapalı bir aralığa (xx ile maks_değer arasında) değiştirilir, böylece indeks yerel sırasındaki veriler "doğru" olur. Bu hala tam bir taramaysa, segmentasyonu daha da hassaslaştırabilir veya tek tek ayıklama + toplu ciltleme yöntemini kullanabilirsiniz.
Yukarıdaki gösterim, kötü veri türlerinin anormal yürütme planlarına yol açtığı bir deneydir.Veri yapısı tasarımının çok önemli olduğu görülebilir.Birçok sorunu önlemek için erken tasarım aşamasında veritabanı denetiminin başlatılması önerilir.
Daha sonra daha fazla DBA içeriği paylaşılacak, ilgilenen arkadaşlar takip edebilir!