Neden veritabanları kendi dizinlerini otomatik olarak oluşturmuyor?


32

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.


3
Arabanız otomatik olarak kendi patlak lastiği tamir ediyor mu?
Kermit

11
Daha doğru bir benzetme ECU'nuz, yakıt / yağ akış hızlarını sabitlemek ve kirli hatları telafi etmek için yakıt pompasına verilen gücü değiştiriyor mu? cevabın evet olduğu ...
Jharwood

11
Bir veritabanı zaten şu anda bize komut vermemizi gerektiren bir masanın üzerine bir dizin koyabilir, bir araba kullanmak için bazı silahlar inşa edene kadar bir lastiğin yerini değiştiremez.
Jharwood

1
Onlar - UNIQUEkısıtlamaları olan sütunlar için .
dan04 16

8
Eğer "kendi kendini ayarlayan veritabanlarını" google'da kullanırsanız, bu konuda çok fazla araştırma bulacaksınız. Belki gelecekte bunun bir unsuru olması yaygın olacaktır.
Martin Smith,

Yanıtlar:


25

Güncelleştirme

Bu şimdi SQL Server Azure'da uygulanmaktadır. Önerilerde bulunur

görüntü tanımını buraya girin

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,CveA,B INCLUDE(C)

Fikirle ilgili bazı güncel konular

  • Dizini oluşturmayan otomatik analizlerin kalitesi, maliyetleme modelinin doğruluğuna büyük ölçüde bağlı olacaktır.
  • Otomatik analiz alanında bile, çevrimdışı bir çözüm, çevrimiçi bir çözümden daha kapsamlı olmaya devam edebilecektir, çünkü bir çevrimiçi çözümün, canlı sunucuya tepeden büyük bir kitap eklemesi gerekmemesi ve birincil sorguları yürütme amacına müdahale etmesi zorunludur.
  • İş yüküne cevap olarak otomatik olarak oluşturulan endeksler, mutlaka yararlı olabilecek sorgulara cevap olarak oluşturulacaktır, bu yüzden önceden indeksleri oluşturan çözümlerin gerisinde kalacaktır.

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.


4
Yeteneklerinin asla otomatikleştirilemeyeceğini varsaymak DBA'nın kariyeri için inanılmaz derecede tehlikelidir. Bu, vardiya yazılım tanımlı veri merkezlerine yönelttiği için ağın kariyerlerini öldürüyor. İyi DBA'lar olarak otomasyon çabalarına liderlik etmeliyiz.
Gaius,

20

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.


Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
Paul White GoFundMonica

13

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.


4
BigTable'ı (ve Cassandra ve HBase gibi türevlerini) RDBMS çözümleriyle karşılaştırmanın elmaları portakallarla karşılaştırdığını söyleyebilirim - BigTable ve türevleri daha devasa anahtar-değer veya sütunlu depolar gibidir ve satır anahtarı doğal olarak bir indeks gibidir .
Suman

1
Kesinlikle. Soru etiketlendi rdbmsve BigTable'ın kategoriye girdiğini sanmıyorum.
ypercubeᵀᴹ

2
@ ypercube: ... Evet, cevabımda bundan bahsettim; ama yine de en azından bir ilgi noktası olarak bilmeye değer. Ben de birkaç diğer veritabanları söz vardır RDBMS Hadi bunu hangi ve yaygın değil neden açıkladı. Bu kesinlikle bir aşağı oy hak etmiyor ...
BlueRaja - Danny Pflughoeft

1
Oy kullanmadım Çok zor bir problem olduğuna katılıyorum.
ypercubeᵀᴹ

10

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.


1
+1 bu şeyleri otomatikleştirmek kesinlikle mümkün ve elverişli olsa da, verilerin yarın nasıl kullanılacağına dair bir fikri olmayan bir sistemin uyguladığı bir dizi sihirli indeksle her zaman daha iyi olmayacağız vs. karşılaşma eşiğinin okunması. Geçen gün bunun hakkında biraz blog yazdım , ancak açıkça konuşacak çok şey var.
Aaron Bertrand

> Belki sözler zamanla kritiktir ve okumalar değildir; Bu durumlarda, ekinizi yavaşlatmak kabul edilemez olabilir. Böyle iyi bir cevap, çok yararlı.
Siddhartha

6

Geçmiş sorguları analiz edebilir ve dizinler önerebilir / yaratabilirler ancak bu en iyi şekilde çalışmaz, çünkü dizinler bir maliyetle optimize edilmesini istediğinizi hızlandırmak için bir denge kurar ve sunucu niyetlerinizi bilemez.


-4

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 ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.