Veritabanı birleştirmeleri ne zaman ve neden pahalıdır?


354

Veritabanları üzerinde biraz araştırma yapıyorum ve ilişkisel DB'lerin bazı sınırlamalarına bakıyorum.

Büyük masaların birleşimlerinin çok pahalı olduğunu düşünüyorum, ama neden olduğundan tam olarak emin değilim. DBMS bir birleştirme işlemi gerçekleştirmek için ne yapmalı, darboğaz nerede?
Denormalizasyon bu masrafın üstesinden nasıl gelebilir? Diğer optimizasyon teknikleri (örneğin indeksleme) nasıl yardımcı olur?

Kişisel deneyimler açıktır! Kaynaklara bağlantılar gönderecekseniz, lütfen Wikipedia'dan kaçının. Bunu nereden bulacağımı biliyorum.

Bununla ilgili olarak, BigTable ve SimpleDB gibi bulut hizmeti veritabanları tarafından kullanılan denormalize yaklaşımları merak ediyorum. Bu soruya bakın .


3
Ayrıca faydaları da araştırıyor musunuz? ;)
David Aldridge

(Böyle bir şey varsa) objektif bir karşılaştırmaya bakıyorum. Pro's, con's, ne var.
Rik

Bulut bilişimin önceden oluşturulmuş yaklaşımları, "yanlış birleştirme" probleminden kaçınarak her şekilde bahis oynayabilmek üzerine kuruludur. Google'ın kendi sistemlerinde bazı beyaz sayfaları var. Oldukça ilginç - özel davaların uygulanabilirliğini genişletmenin yolları.
Peter Wone

@PeterWone - bu makalelerin bazılarına referans vermek ister misiniz? ps, profilinizdeki soruyu cevaplamak için Android Açık Kaynaktır - en azından kısmen, bu yüzden geeks o bandwagon'a atladı. Büyük yıkanmamışlar tarafından teknik olarak gelişmiş olarak görüldükleri için, Google'ın sıkı ve terli kucaklamalarına benziyorlardı! Betamax kimse var mı? Kendi kalbime (ve neslimize) daha yakın, FOREGIN KEYPostgreSQL (yerel Windows sürümü yok) ve Firebird (Açıcı fiyasko) yarışması olduğunda MySQL ( s FFS'siz) nasıl dünyanın en popüler "R" DBMS'si oldu (ve kalıyor) , hatta SQLite?
Vérace

Tabii ben PostgreSQL ve Firebird görüyoruz, demek çok tek kullanıcı alanında yıldız olarak çok kullanıcılı sistemler ve SQLite için MySQL üstün. SQLite sqlite.org sitesini yönetir (günde 400,00 sonuç!).
Vérace

Yanıtlar:


470

Performansı artırmak için denormalizasyon? Kulağa ikna edici geliyor, ama su tutmuyor.

Dr Ted Codd ile ilişkisel veri modelinin orijinal savunucusu olan Chris Date, normalleşmeye karşı yanlış bilgilendirilmiş argümanlarla sabırsız kaldı ve bunları bilimsel yöntemle sistematik olarak yıktı: büyük veritabanları aldı ve bu iddiaları test etti .

Onun içinde o kadar yazdım düşünüyorum İlişkisel Veritabanı Yazıları 1988-1991 ama bu kitap sonradan sürümüne altı içine yuvarlandı edildi Veritabanı Sistemlerine Giriş olup, ben yazmak ve muhtemelen kalması olarak veritabanı teorisi ve tasarım üzerine kesin metin onun sekizinci baskısında, onlarca yıldır baskıda. Çoğumuz yalınayak koşarken Chris Date bu alanda uzmandı.

Bunu buldu:

  • Bazıları özel durumlar için geçerlidir
  • Hepsi genel kullanım için ödeme yapamıyor
  • Diğer özel durumlar için hepsi önemli ölçüde daha kötü

Her şey çalışma setinin boyutunu azaltmak için geri geliyor. Doğru şekilde ayarlanmış dizinlere sahip doğru seçilmiş anahtarları içeren birleşimler ucuzdur, pahalı değildir, çünkü satırlar gerçekleşmeden önce sonucun önemli ölçüde budamasına izin verirler .

Sonucun somutlaştırılması, egzersizin en pahalı yönü olan toplu disk okumalarını büyüklük sırasına göre içerir. Buna karşılık bir birleştirme gerçekleştirmek için mantıksal olarak yalnızca anahtarların alınması gerekir . Uygulamada, anahtar değerler bile alınmaz: birleştirme karşılaştırmaları, çok sütunlu birleşmelerin maliyetini azaltmak ve dize karşılaştırmaları içeren birleşimlerin maliyetini önemli ölçüde azaltmak için anahtar karma değerleri kullanılır. Sadece önbelleğe daha fazla sığmakla kalmaz, daha az disk okuması da yapar.

Dahası, iyi bir iyileştirici en kısıtlayıcı koşulu seçecek ve bir birleşim yapmadan önce uygulayacak ve yüksek kardinaliteye sahip endekslerde birleşimlerin yüksek seçiciliğinden çok etkili bir şekilde yararlanacaktır.

Kuşkusuz bu tür bir optimizasyon, denormalize edilmiş veritabanlarına da uygulanabilir, ancak bir şemayı denormalize etmek isteyen insanlar tipik olarak endeksler kurduklarında (eğer) kardinalite hakkında düşünmezler.

Tablo taramalarının (birleştirme sırasında bir tablodaki her satırın incelenmesi) pratikte nadir olduğunu anlamak önemlidir. Bir sorgu iyileştirici, yalnızca aşağıdakilerden biri veya daha fazlası bekletildiğinde tablo taraması seçer.

  • İlişkide 200'den az satır var (bu durumda tarama daha ucuz olacaktır)
  • Birleştirme sütunlarında uygun dizinler yoktur (bu sütunlara katılmak anlamlıysa neden dizine eklenmez? Düzeltin)
  • Sütunların karşılaştırılması için bir tür zorlama gerekir (WTF ?! düzeltin veya eve gidin) ADO.NET SORUNU İÇİN SON NOTLARA BAKIN
  • Karşılaştırmanın argümanlarından biri bir ifade (dizin yok)

Bir işlemi gerçekleştirmek, gerçekleştirmekten daha pahalıdır. Ancak yanlış işlemi gerçekleştirmek, anlamsız disk G / Ç'sine zorlamak ve daha sonra gerçekten ihtiyacınız olan birleştirme işlemini gerçekleştirmeden önce çapağı atmak çok daha pahalıdır. "Yanlış" işlem önceden hesaplanmış ve endeksler hassas bir şekilde uygulanmış olsa bile, önemli cezalar kalmaktadır. Bir birleştirmeyi önceden hesaplamak için denormalize etmek - ilgili güncelleme anormalliklerine rağmen - belirli bir birleştirmeye bağlılıktır. Farklı bir birleşime ihtiyacınız varsa , bu taahhüt size büyük bir maliyet getirecektir .

Eğer birisi bana bunun değişen bir dünya olduğunu hatırlatmak isterse, bence daha büyük donanımlardaki daha büyük veri kümelerinin Date'nin bulgularının yayılmasını abarttığını göreceksiniz.

Faturalandırma sistemleri veya önemsiz posta jeneratörleri (utanç verici) üzerinde çalışan ve öfkeyle klavyeye elinizdeki herkes için, denormalizasyonun daha hızlı, özür dilerim ama özel vakalar - özellikle tüm verileri sırayla işleme koyduğunuz durumdur . Genel bir durum değildir, ve sen edilir senin stratejisinde haklı.

Sen edilir değil yanlış bunu generalising haklı. Veri ambarı senaryolarında denormalizasyonun uygun kullanımı hakkında daha fazla bilgi için notlar bölümünün sonuna bakın.

Ayrıca cevap vermek istiyorum

Birleşimler sadece bazı lipgloss içeren kartezyen ürünlerdir

Ne bollocks bir yük. Kısıtlamalar mümkün olduğunca erken, en kısıtlayıcı olarak uygulanır. Teoriyi okudunuz, ama anlamadınız. Birleşimler, yalnızca sorgu iyileştiricisi tarafından "tahminlerin geçerli olduğu kartezyen ürünler" olarak ele alınır . Bu, sembolik ayrışmayı kolaylaştırmak için sembolik bir temsildir (aslında bir normalizasyon), böylece optimize edici tüm eşdeğer dönüşümleri üretebilir ve bunları en iyi sorgu planını seçebilmesi için maliyet ve seçicilikle sıralayabilir.

Optimize ediciyi kartezyen bir ürün üretmek için almanın tek yolu bir belirti sağlayamamaktır: SELECT * FROM A,B


notlar


David Aldridge bazı önemli ek bilgiler sağlar.

Gerçekten de dizinler ve tablo taramaları dışında çeşitli başka stratejiler de vardır ve modern bir optimize edici bir yürütme planı oluşturmadan önce hepsine mal olacaktır.

Pratik bir tavsiye parçası: eğer yabancı anahtar olarak kullanılabiliyorsa, onu optimize edin, böylece optimizatör için bir endeks stratejisi kullanılabilir .

MSSQL optimize edicisinden daha akıllıydım. Bu iki versiyon önce değişti. Şimdi genellikle bana öğretiyor . Çok gerçek anlamda, bir alanda çok zeki insanın tüm bilgeliğini kodlayan, kural tabanlı bir sistemin etkili olduğunu yeterince kapatmış bir uzman sistemdir.


"Bollocks" dokunmamış olabilir. Daha az kibirli olmam isteniyor ve matematiğin yalan söylemediğini hatırlatıyorum. Bu doğrudur, ancak matematiksel modellerin tüm sonuçları mutlaka tam anlamıyla alınmamalıdır. Negatif sayıların kare kökleri, saçmalıklarını dikkatle incelemekten (orada ceza) kaçarsanız ve denkleminizi yorumlamaya çalışmadan önce hepsini iptal ettiğinizden emin olursanız çok kullanışlıdır.

Bu kadar vahşice cevap vermemin nedeni, ifadedeki ifadenin

Katıldı olan kartezyen ürünleri ...

Bu kastedilen şey olmayabilir ama yazılan şey budur ve kategorik olarak yanlıştır. Kartezyen bir ürün bir ilişkidir. Birleştirme bir işlevdir. Daha spesifik olarak, bir birleşme ilişki-değerli bir işlevdir. Boş bir yüklem ile kartezyen bir ürün üretecek ve bunun bir veritabanı sorgulama motoru için bir doğruluk kontrolü olduğunu kontrol edecektir, ancak hiç kimse pratikte sınırsız birleşimler yazmaz çünkü sınıf dışında pratik bir değeri yoktur.

Bunu söyledim çünkü okuyucuların, modeli modellenen şeyle karıştırmanın eski tuzağına düşmesini istemiyorum. Bir model, uygun manipülasyon için kasıtlı olarak basitleştirilmiş bir yaklaşımdır.


Tablo taraması birleştirme stratejisinin seçimi için yapılan kesme, veritabanı motorları arasında değişiklik gösterebilir. Ağaç düğümü dolgu faktörü, anahtar / değer boyutu ve algoritmanın incelikleri gibi bir dizi uygulama kararından etkilenir, ancak genel olarak konuşursak, yüksek performanslı indekslemenin k log n + c yürütme süresi vardır . C terimi, çoğunlukla kurulum süresinden oluşan sabit bir ek yüktür ve eğrinin şekli, n yüzlerce oluncaya kadar bir getiri (doğrusal aramaya kıyasla) alamayacağınız anlamına gelir .


Bazen denormalizasyon iyi bir fikirdir

Denormalizasyon, belirli bir birleştirme stratejisine bağlılıktır. Daha önce de belirtildiği gibi, bu diğer birleştirme stratejilerine müdahale eder . Ancak, disk alanı kovaları, öngörülebilir erişim kalıpları ve bunların çoğunu veya tamamını işleme eğilimi varsa, bir birleştirmeyi önceden hesaplamak çok değerli olabilir.

Ayrıca, işleminizin genellikle kullandığı erişim yollarını bulabilir ve bu erişim yolları için tüm birleştirmeleri önceden hesaplayabilirsiniz. Bu, veri ambarlarının arkasındaki öncül ya da en azından, sadece terim uyumu için değil, yaptıklarını neden yaptığını bilen insanlar tarafından inşa edildiğinde.

Düzgün tasarlanmış bir veri ambarı, normalleştirilmiş işlem işleme sisteminden toplu bir dönüşümle periyodik olarak üretilir. Operasyonların ve raporlama veritabanlarının bu şekilde ayrılması, OLTP ve OLAP (çevrimiçi işlem işleme, yani veri girişi ve çevrimiçi analitik işleme, yani raporlama) arasındaki çatışmayı ortadan kaldırmak için çok arzu edilen bir etkiye sahiptir.

Burada önemli bir nokta, periyodik güncellemeler dışında veri ambarının salt okunur olmasıdır . Bu, tartışma anormallikleri sorununu gündeme getiriyor.

OLTP veritabanınızı (veri girişinin gerçekleştiği veritabanı) normalleştirme hatası yapmayın. Faturalama işlemleri için daha hızlı olabilir, ancak bunu yaparsanız güncelleme anormallikleri alırsınız. Hiç bir şey göndermeyi durdurmak için Reader's Digest'i almaya çalıştınız mı?

Disk alanı bu günlerde ucuz, bu yüzden kendinizi dışarı çıkarın. Ancak denormalizasyon veri ambarları için hikayenin sadece bir parçasıdır. Daha büyük performans kazançları önceden hesaplanmış toplanmış değerlerden elde edilir: aylık toplamlar, bu tür şeyler. Her zaman çalışma setini azaltmakla ilgilidir.


Tür uyumsuzluklarında ADO.NET sorunu

Varchar türünde dizinlenmiş bir sütun içeren bir SQL Server tablonuz olduğunu ve bu sütunda bir sorguyu kısıtlayan bir parametre iletmek için AddWithValue kullandığınızı varsayalım. C # dizeleri Unicode'dur, bu nedenle çıkarılan parametre türü VARCHAR ile eşleşmeyen NVARCHAR olacaktır.

VARCHAR'dan NVARCHAR'a genişleyen bir dönüşüm olduğundan dolaylı olarak gerçekleşir - ancak dizine eklemeye veda edin ve nedenini iyi şanslar deyin.


"Disk vuruşlarını say" (Rick James)

Her şey RAM'de önbelleğe alınırsa JOINs, oldukça ucuzdur. Yani, normalleşmenin çok fazla performans cezası yoktur .

"Normalleştirilmiş" bir şema JOINsdiske çok fazla vurursa, ancak eşdeğer "denormalize" şemanın diske vurması gerekmiyorsa, denormalizasyon bir performans yarışması kazanır.

Orijinal yazarın yorumu: Modern veritabanı motorları, birleştirme işlemleri sırasında önbellek hatalarını en aza indirmek için erişim sıralaması düzenlemede çok iyidir. Yukarıdakiler, doğru olsa da, birleşmelerin büyük veriler üzerinde mutlaka sorunlu olduğunu ima ettiği için yanlış yorumlanabilir. Bu, deneyimsiz geliştiriciler tarafından zayıf karar verme sürecine neden olacaktır.


7
Bu ifadelerin sonme belirli bir DBMS'ye özgüdür, değil mi? Örneğin. "İlişkide 200'den az satır var"
David Aldridge

2
Yedek anahtarların kullanılması tüm bunları önemli ölçüde etkiliyor mu?
David Plumpton

3
Büyük EF Codd sadece İlişkisel Modelden sorumludur. CJ Date ve son zamanlarda H Darwen, her ikisi de RM'yi anlamayan ve RM'nin "nasıl iyileştirileceği" hakkında her şeyi reddedilebilecek bilgi kitleleri sağlayan aptallardır, çünkü biri anlamadığı şeyi düzeltemez . Onlar sadece "eksik" bir şey olduğunu ileri sürerek, RM'nin alaka düzeyine zarar verir.
PerformanceDBA

7
Ayrıca, birçok NoSQL veritabanının aslında 40 yıl önce attığımız veritabanları olduğunu unutmayın . Gençler her zaman yeni bir şey keşfettiklerini düşünürler. Fabian Pascal: dbdebunk.com/2014/02/thinking-logically-sql-nosql-and.html
N Batı

3
Agresif. İyi bir hesaptı, ama saldırganlığın ve mikro saldırganlığın içeriğe veya içeriğin değerine bir katkısı yok.
MrMesees

46

Çoğu yorumcunun not etmediği şey, karmaşık bir RDBMS'de bulunan geniş birleştirme yöntemleri yelpazesidir ve denormalizerler her zaman denormalize edilmiş verileri korumanın daha yüksek maliyeti üzerinde parlarlar. Her birleştirme, dizinlere dayanmaz ve veritabanlarında, birleştirme maliyetlerini azaltmaya yönelik çok sayıda optimize edilmiş algoritma ve yöntem bulunur.

Her durumda, bir birleştirmenin maliyeti türüne ve diğer birkaç faktöre bağlıdır. Hiç pahalı olması gerekmez - bazı örnekler.

  • Toplu verilerin birleştirildiği bir karma birleştirmesi gerçekten çok ucuzdur ve maliyet yalnızca karma tablosu bellekte önbelleğe alınamazsa önemli hale gelir. Endeks gerekmez. Birleştirilen veri kümeleri arasında eşit bölümleme yapmak çok yardımcı olabilir.
  • Sıralama birleştirme birleşiminin maliyeti, birleştirme yerine sıralama maliyetinden kaynaklanır - dizin tabanlı erişim yöntemi sıralama maliyetini neredeyse tamamen ortadan kaldırabilir.
  • Bir dizindeki iç içe döngü birleştirmenin maliyeti, b-ağacı dizininin yüksekliği ve tablo bloğunun kendisine erişiminden kaynaklanır. Hızlıdır, ancak toplu birleştirmeler için uygun değildir.
  • Bir kümeye dayalı iç içe döngü birleşimi çok daha ucuzdur, birleştirme satırı başına daha az mantıksal GÇ gereklidir - birleştirilen tabloların her ikisi de aynı kümede ise, birleşim birleştirilmiş satırların yerleştirilmesiyle çok ucuz hale gelir.

Veritabanları birleştirilmek üzere tasarlanmıştır ve bunu nasıl yaptıklarında çok esnektirler ve birleştirme mekanizmasını yanlış anlamadıkça genellikle çok performanslıdırlar.


Bence "eğer şüpheniz varsa, DBA'nıza sorun". Modern veritabanları karmaşık hayvanlardır ve anlamak için çalışma gerektirir. Oracle'ı sadece 1996 yılından beri kullanıyorum ve yeni özelliklere ayak uydurmak tam zamanlı bir iş. SQLserver 2005'ten beri de büyük bir yol kat etti. Bu bir kara kutu değil!
Guy

2
Hmmm, alçakgönüllü deneyimlerime göre, orada bir karma birleştirmeyi hiç duymamış ya da evrensel olarak kötü bir şey olduğunu düşünen çok fazla DBA var.
David Aldridge

28

Bence tüm soru yanlış bir önermeye dayanıyor. Büyük masalardaki birleştirmeler mutlaka pahalı değildir . Aslında, birleşimleri verimli bir şekilde yapmak ilişkisel veritabanlarının varlığının temel nedenlerinden biridir . Büyük setlerdeki birleştirmeler genellikle pahalıdır, ancak çok nadiren büyük tablo A'nın tüm içeriğini büyük tablo B'nin tüm içeriğiyle birleştirmek istersiniz. Bunun yerine, sorguyu yalnızca her tablonun önemli satırları kullanılacak ve birleştirme tarafından tutulan gerçek set daha küçük kalır.

Ek olarak, Peter Wone'un bahsettiği verimliliklere sahipsiniz, öyle ki nihai sonuç kümesi gerçekleşene kadar her kaydın yalnızca önemli bölümlerinin bellekte olması gerekir. Ayrıca, birçok birleştirme içeren büyük sorgularda, genellikle daha küçük tablo kümeleriyle başlamak ve büyük olanlara kadar çalışmak istersiniz, böylece bellekte tutulan küme mümkün olduğunca küçük kalır.

Düzgün yapıldığında, birleştirmeler genellikle büyük miktarda veriyi karşılaştırmanın, birleştirmenin veya filtrelemenin en iyi yoludur .


1
@joel. Bunun tersi de doğrudur. Büyük veri kümesi birleştirmeleri pahalı olabilir ve bazen gerekli olabilir, ancak a) gereken IO ve RAM'i işleyemezseniz ve b) çok sık yapmazsanız bunu çok sık yapmak istemezsiniz. Gerçekleştirilmiş görünümleri, raporlama sistemlerini, gerçek zamanlı ve CoB raporlarını göz önünde bulundurun.
Guy

11

Darboğaz hemen hemen her zaman disk G / Ç ve daha da spesifik olarak - rastgele disk G / Ç'dir (karşılaştırma olarak, sıralı okumalar oldukça hızlıdır ve ileri okuma stratejileriyle önbelleğe alınabilir).

Katıldı olabilir Sen atlama etrafında büyük bir masa küçük parçalar okuyarak eğer - rastgele istiyor artar. Ancak, sorgu iyileştiricileri bunu arar ve bunun daha iyi olacağını düşünüyorsa, sıralı bir tablo taramasına (gereksiz satırları atar) dönüştürür.

Tek bir denormalize tablonun benzer bir sorunu vardır - satırlar büyüktür ve tek bir veri sayfasına daha az sığar. Başka bir satırdan uzakta bulunan satırlara ihtiyacınız varsa (ve büyük satır boyutu onları daha da birbirinden ayırırsa) daha rasgele G / Ç'ye sahip olursunuz. Yine, bir tablo taraması bunu önlemek için zorlanabilir. Ancak, bu sefer, tablo taramanızın büyük satır boyutu nedeniyle daha fazla veri okuması gerekiyor. Buna, verileri tek bir konumdan birden çok konuma kopyaladığınızı ve RDBMS'nin okuyacak çok daha fazlasına (ve önbelleğe) sahip olduğunu da ekleyin .

2 tablo ile ayrıca 2 kümelenmiş dizin elde edersiniz ve genel olarak daha fazla dizin oluşturabilirsiniz (daha az ekleme / güncelleme yükü nedeniyle) performansı önemli ölçüde artırabilir (esas olarak, yine, dizinler (nispeten) küçük olduğundan, diski okumak için hızlıdır) (veya önbelleğe alması ucuzdur) ve diskten okumanız gereken tablo satırlarının miktarını azaltın).

Birleştirme ile tek ek yükü eşleşen satırları bulmaktan geliyor. Sql Server, eşleşen satırları bulmak için, temel olarak veri kümesi boyutlarına dayalı 3 farklı türde birleşim kullanır. Optimize edici yanlış birleştirme türünü seçerse (yanlış istatistikler, yetersiz dizinler veya yalnızca bir optimize edici hata veya kenar durumu nedeniyle) sorgu sürelerini büyük ölçüde etkileyebilir.

  • Döngü birleştirme (en az 1) küçük veri kümesi için çok ucuzdur.
  • Birleştirme birleştirme önce bir tür her iki veri kümesi gerektirir. Bununla birlikte, dizine alınmış bir sütuna katılırsanız, dizin zaten sıralanır ve başka bir işlem yapılması gerekmez. Aksi takdirde, sıralamada bazı CPU ve bellek ek yükleri vardır.
  • Karma birleştirme hem bellek (karma tabloyu saklamak için) hem de CPU (karma oluşturmak için) gerektirir. Yine, bu, disk G / Ç ile ilgili olarak oldukça hızlıdır. Ancak , hashtable'ı depolamak için yeterli RAM yoksa, Sql Server, hashtable ve bulunan satırların parçalarını saklamak için tempdb'yi kullanır ve ardından bir seferde yalnızca hashtable'ın parçalarını işler. Tüm disklerde olduğu gibi, bu oldukça yavaştır.

En uygun durumda, bunlar disk G / Ç'sine neden olmaz ve bu nedenle performans açısından ihmal edilebilir.

Sonuçta, en kötüsü - aslında aynı miktarda okumak daha hızlı olmalı küçük disk okumaları nedeniyle tek bir denormalize tablodan olduğu gibi, x birleştirilmiş tablolardan mantıksal veri . Aynı miktarda fiziksel veri okumak için , biraz yük olabilir.

Sorgu süresine genellikle G / Ç maliyetleri hakim olduğundan ve verilerinizin boyutu denormalizasyonla değişmediğinden (eksi çok küçük bir satır ek yükü), tabloları bir araya getirerek elde edilecek muazzam bir fayda yoktur. Performansı arttırma eğiliminde olan denormalizasyon türü, IME, hesaplamak için gerekli 10.000 satırı okumak yerine hesaplanan değerleri önbelleğe alıyor.


Rastgele aramaları azaltmak: iyi bir nokta, ancak büyük bir önbelleğe sahip iyi bir RAID denetleyicisi asansör okuma / yazma yapacak.
Peter Wone

3

Tablolara katılma sırası son derece önemlidir. İki veri kümeniz varsa, sorguyu üzerinde çalışmak zorunda olduğu veri miktarını azaltmak için önce en küçük olanı kullanacak şekilde sorguyu oluşturmaya çalışın.

Bazı veritabanları için önemli değildir, örneğin MS SQL çoğu zaman uygun birleştirme sırasını bilir. Bazıları için (IBM Informix gibi) sipariş tüm farkı yaratır.


1
Genel olarak, iyi bir sorgu optimize edici, birleştirmelerin veya tabloların listelendiği sıradan etkilenmeyecek ve birleştirme işlemini gerçekleştirmenin en etkili yolunu kendi belirleyecektir.
David Aldridge

5
MySQL, Oracle, SQL Server, Sybase, postgreSQL, vb. birleşme sırasına göre değil. DB2 ile çalıştım ve ayrıca, bildiklerime, onları hangi sıraya koyduğunuz umurumda değil. Bu genel durumda yararlı bir tavsiye değil
Matt Rogish 20: 24'te

NDB motorunu kullanarak MySQL kümelemesi (kuşkusuz bir uç durum ve yalnızca gelişmiş geliştiriciler NDB'nin yanına gidecek) birleştirme sırasını doğru tahmin etmiyor, bu nedenle çoğu sorguya "USE INDEX" ifadeleri eklemeniz gerekiyor, yoksa korkunç derecede verimsiz olmak. MySQL belgeleri bunu kapsar.
joelhardi

@iiya, İyileştiricinin neyi seçeceğini anlamak genelleştirilmiş ifadelerden veya tablo sıralamasıyla ilgili "efsanelerden" daha önemlidir. RDBMS yükseltildiğinde davranış genellikle değiştiğinden SQL'inizdeki belirli bir tuhaflığa güvenmeyin. Oracle, v7'den beri davranışlarını birkaç kez değiştirdi.
Guy

1
@Matt Oracle 9i'nin sadece birleştirme sırasını ayarlayan çok farklı optimizasyonlar ve sorgu planları yaptığını gördüm. Belki bu sürüm 10i'den itibaren değişti?
Camilo Díaz Repka

0

Birleştirmenin karmaşıklık sınıfını düşündüğünüzde, normalleştirilmeye veya normalleştirilmeye karar vermek oldukça basit bir süreçtir. Örneğin, sorgular O (k log n) olduğunda, k'nin istenen çıktı büyüklüğüne göreli olduğu durumlarda veritabanlarımı normalleştirme ile tasarlama eğilimindeyim.

Performansı denormalize etmenin ve optimize etmenin kolay bir yolu, normalize edilmiş yapınızdaki değişikliklerin denormalize yapınızı nasıl etkilediğini düşünmektir. Bununla birlikte, sorunlu olabilir, çünkü denormalize bir yapı üzerinde çalışmak için işlemsel mantık gerektirebilir.

Normalleşme ve denormalizasyon tartışması bitmeyecek çünkü sorunlar çok büyük. Doğal çözümün her iki yaklaşımı da gerektirdiği birçok sorun vardır.

Genel bir kural olarak, her zaman normalize edilmiş bir yapı ve yeniden yapılandırılabilen denormalize önbellekleri sakladım. Sonunda, bu önbellekler gelecekteki normalizasyon problemlerini çözmek için kıçımı kurtarır.


-8

Başkalarının söylediklerini detaylandırarak,

Birleşimler sadece bazı lipgloss içeren kartezyen ürünlerdir. {1,2,3,4} X {1,2,3} bize 12 kombinasyon (nXn = n ^ 2) verir. Bu hesaplanan küme, hangi koşulların uygulandığı konusunda bir referans görevi görür. DBMS, bize eşleşen koşulları vermek için koşulları (hem sol hem de sağın 2 veya 3 olduğu yerlerde) uygular. Aslında daha optimize edilmiş ama sorun aynı. Setlerin boyutundaki değişiklikler sonuç boyutunu katlanarak artıracaktır. Tüketilen bellek ve işlemci döngülerinin miktarı üstel olarak etkilenir.

Denormalize ettiğimizde, bu hesaplamadan tamamen kaçınırız, kitabınızın her sayfasına renkli bir yapışkan yapıştırmayı düşünürüz. Bir referans kullanarak bilgileri dışarı çıkarabilirsiniz. Ödediğimiz ceza, DBMS'nin (optimal veri organizasyonu) özünden taviz vermemizdir


3
-1: Bu yazı, DBMS'nin birleştirmeleri gerçekleştirmesine neden izin verdiğinizin harika bir örneğidir - çünkü DBMS tasarımcıları bu sorunları her zaman düşünür ve bunu compsci 101 yönteminden daha etkili yollar bulurlar.
David Aldridge

2
@David: Kabul etti. DBMS optimizer programcıları bazı akıllı çerezlerdir
Matt Rogish

Bu cevap yanlış. Sorgunuz normalleştirilmiş, dizine alınmış bir veritabanına karşı yürütülürse ve herhangi bir filtre veya birleştirme koşulu varsa, optimizer Kartezyen ürününden kaçınmanın ve bellek kullanımını ve CPU döngülerini en aza indirmenin bir yolunu bulur. Aslında bir Kartezyen ürün seçmek istiyorsanız, aynı belleği normalleştirilmiş veya normalleştirilmemiş bir db'de kullanırsınız.
rileymcdowell
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.