Veritabanlarının sıkça karşılaştıkları şeyler hakkında yeterince bilgi sahibi olacağını ve talep ettikleri verilere endeks eklemeye karar verebilecekleri taleplerine cevap verebileceklerini düşünürdüm.
UNIQUE
kısıtlamaları olan sütunlar için .
Veritabanlarının sıkça karşılaştıkları şeyler hakkında yeterince bilgi sahibi olacağını ve talep ettikleri verilere endeks eklemeye karar verebilecekleri taleplerine cevap verebileceklerini düşünürdüm.
UNIQUE
kısıtlamaları olan sütunlar için .
Yanıtlar:
Güncelleştirme
Bu şimdi SQL Server Azure'da uygulanmaktadır. Önerilerde bulunur
ve dizin yönetimi otomatik olarak yapılandırılabilir .
Otomatik dizin yönetimini etkinleştir
Önerileri otomatik olarak uygulamak için SQL Veritabanı Danışmanı'nı ayarlayabilirsiniz. Öneriler kullanılabilir hale geldiğinde otomatik olarak uygulanacaktır. Hizmetin yönettiği tüm endeks işlemlerinde olduğu gibi performans etkisi olumsuz ise, öneri geri alınacaktır.
Orijinal cevap
Bazı veritabanları zaten (tür) dizinleri otomatik olarak oluşturuyor.
SQL Server'da yürütme planı bazen RDBMS'nin dinamik olarak verinin dizine alınmış bir kopyasını oluşturduğu bir Dizin Biriktiricisi işleci içerebilir . Bununla birlikte, bu biriktirme, kaynak verilerle senkronize tutulan veritabanının kalıcı bir parçası değildir ve sorgu yürütmeleri arasında paylaşılamaz, yani bu tür planların yürütülmesi aynı veriler üzerinde geçici endeksler oluşturup bırakarak sona erebilir.
Belki de gelecekte RDBMS'ler, iş yüküne göre kalıcı olarak endeksler oluşturma ve dinamik olarak endeksleme kapasitesine sahip olacaklardır.
Endeks optimizasyonu süreci sonunda sadece bir maliyet fayda analizi. İnsanların, sorguların bir iş yükündeki göreceli önemi hakkında daha fazla bilgiye sahip olabileceği doğru olsa da, bu bilginin optimizer için sağlanamamasının bir nedeni yoktur. SQL Server zaten, oturumların önceliğe göre farklı kaynak ayırmalarına sahip farklı iş yükü gruplarında sınıflandırılmasını sağlayan bir kaynak yöneticisine sahiptir.
Kenneth tarafından belirtilen eksik endeks DMV'lerin, sadece belirli bir sorguya yararları göz önünde bulundurdukları ve potansiyel endeksin diğer sorgulara maliyetini göz önünde bulundurmadıklarından, kör olarak uygulanmaları amaçlanmamıştır. Benzer eksik endeksleri de birleştirmiyor. örneğin, bu DMV’nin çıktısı A,B,C
veA,B INCLUDE(C)
Fikirle ilgili bazı güncel konular
Maliyet modellerinin doğruluğunun zamanla gelişmesini beklemek muhtemelen mantıklıdır ancak 2. nokta, çözülmesi daha zor görünüyor ve 3. nokta doğal olarak çözünmez.
Bununla birlikte, muhtemelen kurulumların büyük çoğunluğu, iş yüklerindeki değişiklikleri sürekli izleyen, teşhis eden ve öngören (veya en azından buna tepki veren) yetenekli personel ile bu ideal durumda değildir.
Autoadmin projesi , Microsoft Research 1996 yılından beri çalışmakta olduğu
Bu projenin amacı, iş yükü bilgisinden yararlanarak veritabanlarını kendi kendine ayarlama ve kendi kendine yönetme yapmaktır.
Proje ana sayfasında çeşitli ilginç projeler listelenmektedir. Biri özellikle buradaki soru ile ilgilidir
Başka bir ilginç problem DBA mevcut olmadığında ortaya çıkar (örneğin gömülü veritabanı veya küçük işletme). Bu gibi senaryolarda, düşük dokunuşlu sürekli indeks ayarlama yaklaşımı önemli olabilir. Çözümleri araştırdık ... [in] ICDE 2007'de “ Fiziksel Tasarım Ayarlamaya Çevrimiçi Bir Yaklaşım ”.
Yazarlar devlet
Çevrimiçi dizinler gibi giderek daha yaygın kullanılan DBMS özellikleriyle, teknolojinin durumunu geliştiren fiziksel tasarım sorununa daha otomatik çözümler keşfetmek çekici olacaktır.
Kağıt bir algoritma tanıtıyor
Başlıca özellikleri:
- Sorgular optimize edildiğinde, performansı artıracak alakalı bir aday endeksleri kümesi belirlenir. Bu özellik, sorgu işlemenin arka planda oluşturulan dizinlere paralel devam etmesini sağlar.
- Yürütme sırasında, aday aday endekslerine sahip olmamakla kaybettiğimiz potansiyel faydaları ve ayrıca sorgu, güncelleme ve alan kısıtlamalarının varlığında mevcut endekslerin faydasını izleriz.
- Fiziksel bir tasarım değişikliğinin önemli olduğuna dair yeterli kanıtı topladıktan sonra, otomatik olarak indeks oluşturmalarını veya silinmelerini tetikleriz.
- Sorunumuzun çevrimiçi doğası, genellikle geleceği bilen optimal çözümlerin gerisinde kalacağımız anlamına gelir. Bununla birlikte, kanıtları dikkatlice ölçerek, “geç” kararlardan önemli ölçüde muzdarip olmadığımızdan, dolayısıyla oluşan zarar miktarımızı sınırladığımızdan emin oluruz.
Algoritmanın uygulanması, sunucu yükündeki değişikliklere yanıt olarak azaltmaya izin verir ve aynı zamanda oluşturma sırasında iş yükü değişirse ve beklenen fayda buna değer görülen noktaya düşerse indeks oluşturma işlemini iptal edebilir.
Yazarların Çevrimiçi konusuna karşı geleneksel fiziksel ayarlama ile ilgili sonuçları.
Bu çalışmadaki çevrimiçi algoritmalar, DBA'lar iş yükünün gelecekteki davranışı konusunda belirsiz olduklarında veya kapsamlı bir analiz veya modelleme yapma ihtimalinin olmadığı durumlarda kullanışlıdır. Eğer bir DBA iş yükü özellikleri hakkında tam bilgiye sahipse, mevcut araçlarla (örneğin, [2, 3]) statik bir analiz ve dağıtım daha iyi bir alternatif olacaktır.
Buradaki sonuçlar, bir başka makalede bulunan Özerk Sorgu Odaklı İndeks Ayarlama ile aynıdır
Bütün iş yükünün önceden bilinmesi durumunda yaklaşımımız dizin danışmanını yenemez. Bununla birlikte, değişen ve değişen iş yüklerinin bulunduğu dinamik ortamlarda, sorgu odaklı yaklaşım daha iyi sonuçlar verir.
Yerleştirdiğiniz indeks tasarımı, bilimden çok bir sanat eseridir. RDBMS ortak iş yüklerini almak ve akıllı bir endeksleme stratejisi tasarlamak için yeterince akıllı değildir. İş yükünü analiz etmek ve en iyi yaklaşımın ne olduğunu belirlemek insan müdahalesidir (okuma: DBA).
Dizinlere sahip olmanın cezası yoksa, sadece sonsuz sayıda dizin eklemek için av tüfeği yaklaşımı olacaktır. Ancak veri modifikasyonu (INSERTS, UPDATES ve DELETES) bir tablodaki etkin dizinleri etkilediğinden, bu indekslerin üstünde o değişkenlik olacak.
En az veri değişikliği ek yükü elde ederken, akıllıca okuma performansını maksimize edecek endeksler oluşturmak insan tasarımını ve stratejisini alır.
Aslında, bunu yapan bazı veritabanları var. Örneğin, Google’ın BigTable ve Amazon’un SimpleDB’si otomatik olarak indeksler oluşturuyor (her ikisi de RDBMS’ler değil) . Ayrıca bunu yapan en az bir MySQL RDBMS motoru var. SQL Server ayrıca , yaratmanız gerektiğini düşündüğü endeksleri izler , ancak gerçekte onları oluşturduğu kadar ileri gitmez.
Sorun, şaşırtıcı bir şekilde doğru olması zor, bu nedenle çoğu veritabanının otomatik olarak bunları oluşturmaması şaşırtıcı değil (BigTable / SimpleDB, bununla kaçın çünkü keyfi birleştirme işlemine izin vermiyor, bu da işleri kolaylaştırıyor) . Ayrıca, anında indeks oluşturmak, tüm tabloya özel erişim gerektiren zaman alıcı bir işlemdir - tablo çevrimiçi olduğunda kesinlikle olmasını istediğiniz bir şey değildir.
Ancak, orada bir LAMP web uygulaması sayısı göz önüne alındığında bile bir endeks olduğunu bile bilmeyen amatörler tarafından yazılmış , bu özellik bazı insanlar için yararlı olacağını düşünüyorum.
rdbms
ve BigTable'ın kategoriye girdiğini sanmıyorum.
Halihazırda bazı kapsamlı cevaplar olsa da, asıl cevabın etrafında durmuş gibi görünüyorlar: Endeksler her zaman arzu edilmez.
Yorumlarda belirtilen araba analojisi ile, neden tüm arabalara aşırı spor paketleri takmadığını söylemek daha iyi olurdu. Kısmen masraflıdır, fakat aynı zamanda birçok insanın düşük profilli lastiklere ve sert süspansiyonlara ihtiyaç duymadığı veya istemediği gerçeğine bağlı; gereksiz yere rahatsız edici.
Öyleyse belki de her yazı için 1000 okuma var, neden otomatik olarak oluşturulmuş bir indeks yok? Tablo genişse ve sorgular farklıysa neden birkaç tane olmasın? Belki de söz verme zamanı kritiktir ve okuma değildir; Bu durumlarda, ekinizi yavaşlatmak kabul edilemez olabilir. Belki sınırlı disk alanıyla çalışıyorsunuz ve sahip olduğunuz alana ek indeksler ekleyemezsiniz.
Mesele şu ki, endeksler otomatik olarak oluşturulmuyor çünkü her şeyin cevabı değiller. Dizin tasarlama sadece "hey, okumalarımı hızlandıracak" demenin bir örneği değil, dikkate alınması gereken başka faktörler de var.
Akıllı değiller, bir kod parçası. Bir veritabanına her yeni veri girdiğinizde, istendiğinde yeni bir konum bulması ve onu bulmak için bir harita bulması gerekir. Endeksleme sesleri olduğundan daha kolay, yeni bir veri yığınına yeni bir sayı mı veriyorsunuz? Peki, bir sonraki sorgu verinin son bölümü ile ilgili değil, daha önce 36271 chuncks ile ilgiliyse? Dizininizle kolayca bulabilirsiniz, değil mi? Ancak, sorgu 1997 yılında yapılan eski 36271 öbek içinde bulunan "balıkçılık" gibi bir kelime içeriyorsa ne olur? Ho? Eski makalede balıkçılık hakkında bir kelime değil.
Veri veritabanına birer birer gelirse, bu şekilde endekslenebilir. Fakat basit indeksleme işlemi yanlış sonuçlar doğuracak ve / veya er ya da geç performansı yavaşlatacak ...