İçindekiler

Tablo ve sütun istatistikleri, optimizer a çok şey anlatır, ancak Optimizera tablodaki veya sütundaki verilerin çeşitliliğini bildiren bir mekanizma sağlamaz. Örneğin, bu istatistikler sütunda verilerin skew data (çarpık/birbiriyle kesişmeyen veri) olup olmadığını veya bir tablodaki sütunlar arasında bir korelasyon olup olmadığını (farklı sütunlar arasındaki doğrusal ilişkinin yönü ve gücü) Optimizer’e söyleyemez. Verilerin çeşitliliği hakkındaki bilgiler, histogramlar, sütun grupları (column groups) ve sorgu istatistikleri gibi temel istatistiklerin uzantıları kullanılarak Optimizer’e sağlanabilir.

Histograms

Histogramlar, Optimizer ‘a bir sütundaki verilerin dağılımını anlatır.  Varsayılan olarak (histogram olmadan), Optimizer, bir sütundaki belirsiz değerler arasında tek bir satır dağılımını varsayar. (yani hep aynı değerde veri varmış gibi düşünür)

Yukarıda tarif edildiği gibi, Optimizer, bir eşitlik öngörüsünün kardinalitesini, tablodaki toplam satır sayısını eşitlik yüklemesinde kullanılan sütundaki farklı değerlerin sayısına bölerek hesaplar. Sütundaki veri dağılımı uniform (tekdüze) değilse (yani veri skew (çarpık) ise) kardinalite testi yanlış olacaktır. Düzgün olmayan bir veri dağılımını doğru bir şekilde yansıtmak için sütunda bir histogram gerekir. Histogramın varlığı, Optimizer tarafından cardinality’i tahmin etmek için kullanılan formülü değiştirir ve daha hassas bir uygulama planı oluşturmasını sağlar.

Oracle, sütun kullanım bilgilerine (SYS.COL_USAGE $) ve veri eğrilmesinin öncülüğünü esas alarak histogramlara ihtiyaç duyan sütunları otomatik olarak belirler.

Oracle, sütun kullanım bilgilerine (SYS.COL_USAGE $) ve skew veriye(çarpık)  bağlı olarak histogramlara ihtiyaç duyan sütunları otomatik olarak belirler. Örneğin, bir sütunda unique alan var ve yanlızca eşitlik var mıdır yok mudur şartı gelirse Oracle histogram oluşturmaz.

İki tip histogram vardır; frequency veya height-balanced. Oracle, sütundaki farklı değerlerin sayısına göre oluşturulacak histogram türünü belirler.

Frequency Histograms

Frequency histogramları, sütundaki farklı değerlerin sayısı 254’ten küçük olduğunda oluşturulur. Oracle, bir frequency histogramı oluşturmak için aşağıdaki adımları kullanır.

  1. Oracle’ın PROMOTIONS tablosunun PROMO_CATEGORY_ID sütununda bir frekans histogramı oluşturduğunu varsayalım. İlk adım, PROMOTIONS tablosundan PROMO_CATEGORY_ID değerini seçmektir.
  2. Daha sonra her PROMO_CATEGORY_ID kendi histogram kovasına atanır.

Oracle Histogram Density 1

  1. Bu aşamada 254’ten fazla histogram kovasına sahip olabiliriz, böylece aynı değeri taşıyan kovalar daha sonra bu değere sahip en yüksek kovaya sıkıştırılır. Bu durumda, kovalardan 2, 3, 115, kova 115’e, 417,483 nolu kovalar 483 nolu kovaya ve 484, 502, 503 nolu kovalar 503 nolu kovaya sıkıştırılır. Bu işlemler için veritabanı DBMS_STATS paketini kullanır. Sıkıştırılmış hal ise aşağıdaki gibidir.

Oracle Histogram Density 2

  1. Optimizer, frequency histogramını kullanarak PROMO_CATEGORY_ID sütunundaki öngörüler için cardinality’i doğru bir şekilde belirler. Örneğin, PROMO_CATEGORY_ID = 10 eşitliği için, Optimizer’ın ilk önce histogramdaki kaç kovanın bitiş noktası olarak 10’a sahip olduğunu belirlemesi gerekir. Bunu, bitiş noktası 10 olan, kova 503 olan kepçeyi bularak yapar ve daha sonra önceki kova numarasını çıkarır, kepçe 483, 503 -483 = 20.

Height balanced Histograms

Height-balanced histogramlar, sütundaki farklı değerlerin sayısı 254’ten büyük olduğunda oluşturulur. Height-balanced bir histogramda sütun değerleri kovalara bölünmüştür, böylece her bir kova yaklaşık olarak aynı sayıda satır içerir. Oracle, Height-balanced bir histogram oluşturmak için aşağıdaki adımları kullanır.

  1. Oracle’ın CUST_CITY_ID sütununda height-balanced bir histogram oluşturduğunu varsayalım, çünkü CUST_CITY_ID sütunundaki farklı değerlerin sayısı 254’ten büyüktür. Frequency histogramında olduğu gibi, ilk adım CUST_CITY_ID’yi seçmektir.
  2. CUSTOMERS tablosunda 55.500 satır var ve bir histogramda maksimum 254 kova var. Her bir kovada eşit sayıda sıraya sahip olmak için, Oracle her kovaya 219 sıra koymalıdır. İlk kova’nın bitiş noktası 219. değer olacaktır. İkinci kova’nın bitiş noktası 438 olacaktır.

Oracle Histogram Density 3

  1. Kovalar oluşturulduktan sonra Oracle, ilk kovanın uç noktasının CUST_CITY_ID sütunu için minimum değer olup olmadığını kontrol eder. Değilse, CUST_CITY_ID sütunları için minimum değere sahip olan histograma bir “sıfır” kova eklenir aşağıdaki resimdeki gibi.

Oracle Histogram Density 4

  1. Tıpkı bir frequency histogramında olduğu gibi, height-balanced histogramı sıkıştırmak ve yinelenen son noktalara sahip kovaları çıkarmak için son adım atılır. 51166 değeri, CUST_CITY_ID sütunundaki height-balanced histogramımızdaki kova 24 ve kova 25 için son noktadır. Böylece, kova 24, kova 25’te sıkıştırılacaktır.

Oracle Histogram Density 5

  1. Optimizer şimdi CUST_CITY_ID sütunundaki tahminler için height-balanced histogramı kullanarak daha iyi bir cardinality tahmini hesaplar. Örneğin, CUST_CITY_ID = 51806 eşitliği için, Optimizer ilk önce histogramdaki kaç tane kovanın son nokta olarak 51806 olduğunu kontrol eder. Mesela, 136,137,138 ve 139 numaralı kova için son nokta 51806’dır diye düşünelim (not : USER_HISTOGRAMS içinde bulunur).

Optimizer daha sonra aşağıdaki formülü kullanır:

(Belirttiğimiz eşitliğin bulunduğu kovaların sayısı/toplam kova sayısı) * tablodaki satır sayısı

(4/254) * 55500 = 874

Oracle Histogram Density 6

Bununla birlikte, eğer bir CUST_CITY_ID = 52500 ise, herhangi bir kova için bitiş noktası değilse, o zaman Optimizer farklı bir formül kullanır. Yalnızca bir kova için bitiş noktası olan veya hiç bir bitiş noktası olmayan değerler için, Optimizer aşağıdaki formülü kullanır:

Density * tablodaki satır sayısı

Density   hesaplanırken optimizasyon sırasında histogramdaki bilgilere dayanan dahili bir formül kullanılır. USER_TAB_COL_STATISTICS dictionary view inde görülen DENSITY değeri, Optimizer tarafından Oracle Database 10.2.0.4’ten itibaren kullanılan değer değil.  Bu değer, geriye dönük uyumluluk için kaydedilir, çünkü Oracle Database 9i’de ve 10 g’nin önceki sürümlerinde kullanılan değerdir. Ayrıca, OPTIMIZER_FEATURES_ENABLE parametresi 10.2.0.4’ten önceki sürüm sürümüne ayarlanmışsa, sözlük görünümündeki DENSITY değeri kullanılacaktır.

Density değeri 0 ve 1 arasında bir decimal değerdir. 1’e yakın değerler kolonun unselective, 0’a yakın değerler ise selective (seçici) olduğunu gösterir. Density değerinin oluşabilmesi için tablo üzerinde gather statistics işlemi çalıştırılmalıdır. Density hesaplamak için “DENSITY = 1 / (NULL olmayan distinct değer sayısı)” örneğin “DENSITY = 1 / 2000 = 0,0005 ” dir.

Oracle Histogram Density 7

Mustafa Bektaş Tepe

İyi Çalışmalar

Loading