Veritabanı Tasarımı İndeksler ve Eşanlamlar
Konular Bir indeks tanımlama ve şema nesnesi olarak kullanma ROWID tanımlama ve veritabanında bilgileri yerleştirmede kullanma Otomatik olarak oluşturulan bir indeksi isimlendirme koşulları CREATE INDEX ve DROP INDEX ifadelerini oluşturma ve çalıştırma Fonksiyon tabanlı bir indeks oluşturma ve çalıştırma Özel ve genel eşanlamlar oluşturma 2
Amaç Bir kitapçıya veya kütüphaneye gidiyor olduğunuzu düşünün ve tüm kitapların raflarda gerçek sırayla sıra sıra istiflenmiş olduğunu göreceksiniz. Ne aradığınızı bulmak için tek yol her satırda bulunan her kitabı incelemek olacaktır. Çok verimli olmaz değil mi? Bir veritabanında bilgi almak tamamen sıralardaki kitaplara benzerdir. Her sorgu için, tam bir tablo taraması yapılmalıdır. 3
Amaç Neyse ki, bir veritabanındaki verileri bulma her satırı incelemek zorunda olmaktan daha verimlidir. Oracle satırlara erişimi hızlandırmak için bir indeks kullanır. Bu derste, ne zaman ve nasıl bir indeks oluşturmalı ya da silinmeli bunu öğreneceksiniz. Ayrıca bu derste, veritabanı nesneleri için kullanıcı dostu isimlendirme nasıl oluşturulacağını öğreneceksiniz. Eşanlamlar nesnelere kolay isimlendirme için önemli bir yol sağlayacaktır (takma ad gibi). 4
İndeksler Oracle sunucu indeksi işaretçi kullanarak satırlara erişimi hızlandıran bir şema nesnesidir. İndeksler harici ya da otomatik olarak oluşturulur. Eğer seçtiğiniz sütunda bir indekse sahip değilseniz, tüm tablonun taranması gerekir. İndeks tablodaki satırlara doğrudan ve hızlı bir erişim sağlar. Amacı veriye hızlı bir şekilde ulaşmak için indeksli bir yol kullanarak disk I/O gereksinimini azaltmaktır. İndeks, Oracle sunucu tarafından otomatik olarak kullanılır ve onarılır. İndeks ilk kez oluştuktan sonra kullanıcı tarafından doğrudan faaliyet gerekli değildir. 5
İndeksler Bir ROWID, blok kimliği, blok satır konumu ve veritabanı dosyası tanımlayıcısı içeren satır adresinin bir 64 tabanı katar sunumudur. İndeksler, herhangi bir satıra erişmek için hızlı bir yol olduğu için ROWID kullanırlar. 6
İndeksler Not: Tabloyu kaldırdığınız zaman ilgili indekslerde kaldırılır. 7
İndeksler İndeksler, işaret ettikleri tablodan fiziksel ve mantıksal olarak bağımsızdırlar. Bu herhangi bir zamanda oluşturulup kaldırılabilecekleri anlamına gelir ve ana tablolarda ya da diğer tablolarda herhangi bir etkileri olmaz. 8
İndeks Türleri İki tür indeks oluşturulabilir. Benzersiz indeks: Oracle sunucu, bir tabloda birincil anahtar ya da benzersiz anahtar kısıtlamasına sahip olan bir sütun tanımladığınız zaman bu indeksi otomatik olarak oluşturur. İndeksin adı kısıtlamaya verilen addır. Manuel olarak benzersiz bir indeks oluşturabilmenize rağmen, benzersiz indeks oluşturan tabloda benzersiz bir kısıtlama oluşturmanız tavsiye edilir. 9
İndeks Türleri İki tür indeks oluşturulabilir. 1. Benzersiz indeks: Oracle sunucu, bir tabloda birincil anahtar ya da benzersiz anahtar kısıtlamasına sahip olan bir sütun tanımladığınız zaman bu indeksi otomatik olarak oluşturur. İndeksin adı kısıtlamaya verilen addır. Manuel olarak benzersiz bir indeks oluşturabilmenize rağmen, benzersiz indeks oluşturan tabloda benzersiz bir kısıtlama oluşturmanız tavsiye edilir. 2. Benzersiz Olmayan İndeks: Kullanıcının satırlara ulaşmak için oluşturabileceği indekstir. Örneğin, join işlemlerini optimize etmek için ikincil anahtar sütununda birincil anahtara eşleşen satırları aramayı hızlandırmak için bir indeks oluşturabilirsiniz. 10
İndeks Oluşturma Bir ya da daha çok sütun üzerinde CREATE INDEX komutu kullanarak bir indeks oluşturma: Şemanızda bir indeks oluşturmak için tablo oluşturma yetkinizin olması gerekir. Herhangi bir şemada bir indeks oluşturmak için CREATE ANY INDEX yetkisine ya da ilgili tabloda tablo oluşturma yetkisine sahip olmanız gerekir. Null değerler indekste yer almaz. 11
İndeks Oluşturma Örneğin, DJs on DemandD_CDS tablosunda TITLE sütununa erişmek için sorguyu hızlandırmak isteyelim: 12
Ne Zaman İndeks Oluşturulur Bir indeks sadece şu durumlarda oluşturulur: Sütun değerler için geniş bir aralık içeriyorsa Bir sütun çok sayıda null değerler içeriyorsa Bir ya da daha fazla sütun birlikte WHERE deyiminde ya da join koşulunda sık olarak kullanılıyorsa Tablo büyük ve sorguların çoğu satırların %2-4 oranın altında erişiliyorsa. 13
Ne Zaman İndeks Oluşturulmaz Bir dizin oluşturup oluşturmamaya karar verirken, fazlası her zaman daha iyi değildir. İndeksler ile bir tablo üzerinde yapılan her DML işlemi (INSERT, UPDATE, DELETE), indekslerin güncellenmesi gerektiği anlamına gelir. Tablo ile daha fazla indeks ilişkilendirdiğiniz zaman DML işlemlerinden sonra tüm indeksleri güncellemek için daha fazla çabaya ihtiyacınız olacaktır. 14
Ne Zaman İndeks Oluşturulmaz Genellikle şu durumlarda bir indeks oluşturmaya değmez: Tablo küçük ise Sütunlar genellikle sorguda bir koşul olarak kullanılmıyorsa Sorguların çoğu tablodaki satırların % 2-4 ten fazlasını alması bekleniyorsa Tablo sık güncelleniyorsa İndeksli sütunlar ifadenin bir parçası olarak gösteriliyorsa 15
Birleşik İndeks Birleşik indeks bir tablodaki birden çok sütun üzerinde oluşturulmuş bir indekstir. Birleşik indeksteki sütunlar herhangi bir sırada görülebilir ve tabloda bitişik olması gerekmez. Birleşik indeksler WHERE deyiminin birleşik indeksteki sütunların tümünü ya da önemli bir bölümünü işaret ettiği SELECT komutları için veri almayı hızlandırabilir. 16
Birleşik İndeks Null değerler birleşik indekslerde yer almaz. Join işlemlerini optimize etmek için ikincil anahtar sütununda birincil anahtar sütununa eşleşen satırları aramada hızlanmak için bir indeks oluşturulur. WHERE deyimi IS NULL ifadesi içeriyorsa iyileştirici bir indeks kullanmaz. 17
İndeksleri Onaylama İndekslerin varlığını USER_INDEXES veri sözlüğü görünümünden onaylayın. Ayrıca bir indekste yer alan sütunları USER_IND_COLUMNS görünümü sorgulayarak kontrol edebilirsiniz. Bir sonraki sayfada gösterilen sorgu USER_INDEXES tablosu (indekslerin adları ve benzersizlikleri) ve USER_IND_COLUMNS tablosu (indekslerin adları, tablo adları ve sütun adları) arasındaki birleşimdir. 18
İndeksleri Onaylama 19
Fonksiyon Tabanlı İndeksler Fonksiyon tabanlı bir indeks, indekslenen değerleri tutar ve veriye erişmek için SELECT ifadesine dayanan indeksi kullanır. Fonksiyon tabanlı bir indeks, ifadelere dayalı bir indekstir. İndeks ifadesi tablo sütunlarından, kısıtlamalardan, SQL fonksiyonlardan ve kullanıcı tanımlı fonksiyonlardan oluşturulur. 20
Fonksiyon Tabanlı İndeksler Fonksiyon tabanlı indeksler veritabanında verinin hangi koşullarda tutulduğunun bilinmediği durumlarda kullanışlıdır. Örneğin, WHERE deyiminde UPPER kullanarak SELECT ifadesi ile kullanılan fonksiyon tabanlı bir indeks oluşturabilirsiniz. İndeks bu arama için kullanılacaktır. 21
Fonksiyon Tabanlı İndeksler UPPER(sütun_adı) ya da LOWER(sütun_adı) anahtar kelimeleri ile tanımlanan fonksiyon tabanlı indeksler harf duyarsız aramalara izin verir. Şayet veritabanına çalışan soyadının nasıl girildiğini bilmiyorsanız SELECT ifadesinde büyük harf girerek indeks kullanabilirsiniz. Bir sorgu WHERE deyiminde bir ifade kullanılarak değiştirildiği zaman indeks ifadeyi eşleştirmek için fonksiyon tabanlı bir indeks oluşturmadıkça onu kullanmaz. 22
Fonksiyon Tabanlı İndeksler Örneğin, aşağıdaki ifade indeks kullanarak harf duyarsız aramalara izin verir: 23
Fonksiyon Tabanlı İndeksler Oracle sunucunun tam bir tablo taraması yapmak yerine indeks kullanmasını sağlamak için sonraki sorgularda fonksiyon değerinin null olmadığından emin olun. Örneğin, aşağıdaki deyim indeks kullanmak için garantilidir ancak WHERE olmadan Oracle sunucu tam bir tablo taraması yapabilir: Oracle sunucu indeksleri fonksiyon-tabanlı indeksler olarak DESC işaretli olan sütunlarla işler. DESC işaretli olan sütunlar azalan sırada listelenir. 24
Fonksiyon Tabanlı İndeksler Tüm bu örnekler UPPER VE LOWER fonksiyonlar kullanır fakat Oracle veritabanı bunlarla sınırlı değildir. Herhangi geçerli bir Oracle dahili fonksiyonu kendinizin yazdığı veritabanı fonksiyonu olarak kullanılabilir. Kendi fonksiyonlarınızı yazıyorsanız fonksiyon tabanlı bir indekste kullanmak için fonksiyon başlığında DETERMINISTIC anahtar kelimesini içermelidir. 25
Fonksiyon Tabanlı İndeksler Matematikte, deterministtik sistem sistemin gelecekteki durumunda rastgelelik içermeyen bir sitemdir. Deterministik modeller bu nedenle belirlenmiş bir başlangıç durumu için aynı çıktıyı üretir. Oracle da deterministik aynı girdiler verildiğinde hep aynı çıktıyı dönen bir işlev bildirir. Oracle a işlevin deterministik olduğunu söylemek gerekir ve verilen aynı girdiler için tutarlı bir sonuç dönecektir. 26
Fonksiyon Tabanlı İndeksler UPPER, LOWER ve TO_CHAR yerleşik SQL fonksiyonlarının tümü Oracle tarafından deterministik olarak tanımlanır. Bu nedenle bu üç fonksiyondan herhangi birini kullanarak bir sütun üzerinde bir dizin oluşturabilirsiniz. 27
Fonksiyon Tabanlı İndeksler Fonksiyon tabanlı indekslere başka bir örnek burada verilmektedir. d_events tablosu mayıs ayı için planlanan bir etkinlik olup olmadığını bulmak için sorgulanır. Gördüğünüz üzere, bu sorgu tablo büyükse çok pahalı bir işlem olan tam tablo taramasında sorgulanır. Hatta event_date sütunu indekslenir ve indeks TO_CHAR ifadesi nedeniyle kullanılmaz. 28
Fonksiyon Tabanlı İndeksler İndeks tabanlı aşağıdaki fonksiyonu oluşturduktan sonra, aynı sorguyu çalıştırabilirsiniz, ancak bu sefer pahalı tam tablo taramasından kaçının. Şimdi Oracle events_date sütununda indeks kullanabilir. 29
İndeksi Kaldırma İndeksleri değiştiremezsiniz. Bir indeksi değiştirmek için onu kaldırmalı ve tekrardan oluşturmalısınız. Veri sözlüğünden DROP INDEX komutu kullanarak bir indeks tanımını kaldırın. İndeksi kaldırmak için indeksin sahibi olmanız ya da DROP ANY INDEX yetkisine sahip olmanız gerekir. Tabloyu kaldırırsanız indeksler ve kısıtlamalar otomatik olarak kaldırılır fakat görünümler ve seriler kalır. 30
İndeksi Kaldırma Sözdizimi (index: indeksin adı): 31
Eşanlam SQL de bir eşanlam başka bir kelimenin yerine kabul edilen bir kelime ya da ifadedir. Eşanlamlar nesne için başka bir ad oluşturarak nesnelere kolayca erişim sağlamak için kullanılır. Eşanlamlar başka bir kullanıcı tarafından sahip olunan tabloya daha kolay ve kısa uzunluklu nesne adları ile erişmeyi sağlar. 32
Eşanlam Örneğin, sınıf arkadaşınızın şemasında amys_copy_d_track_listings tablosunu belirtmek için tablo adını kullanıcı adı ile birlikte USMA_SBHS_SQL01_S04.amy gibi başa ekleyebilirsiniz. 33
Eşanlam Bir eşanlamlı oluşturma, nesne adını şema ile niteleme ihtiyacını ortadan kaldırır ve tablo, görünüm, seri, prosedür ya da diğer nesne için alternatif bir isim sağlar. Bu yöntem, görünümler gibi uzun nesne adları ile özellikle yararlı olabilir. Veritabanıyöneticisi tüm kullanıcılar için erişilebilir genel bir eşanlamlı oluşturabilir ve özellikle CREATE PUBLIC SYNONYM yetkisini herhangi bir kullanıcıya verebilir ve bu kullanıcı genel eşanlamlar oluşturabilir. 34
Eşanlam Sözdiziminde: PUBLIC: tüm kullanıcılar tarafından erişilebilir bir eşanlam oluşturur synonym: oluşturulan eşanlamın adıdır object: oluşturulan eşanlam nesnesinin belirtir. 35
Eşanlam Kuralları Kurallar Nesne bir paket içinde ihtiva edilemez. Özel bir eşanlamlı ismi aynı kullanıcı tarafından sahip olunan tüm diğer nesnelerden farklı olmalıdır. Eşanlamı kaldırmak için: 36
Eşanlamı Onaylama Eşanlamların varlığı USER_SYNONYMS veri sözlüğü görünümü sorgulanarak onaylanabilir. Sütun Adı Synonym_name Table_name Table_owner Db_link İçerik Eşanlam adı Eşanlam tarafından belirtilen nesnenin sahibi Eşanlam tarafından belirtilen nesnenin adı Uzak bir eşanlamda belirtilen veritabanı bağlantısı 37