2008-11-25 11 views
9

Yapay bir şekilde bir karma dizini oluşturmak için CHECKSUM sütun türünü kullanırken, aslında O (1) veya kümelenmiş bir dizin için olduğu gibi hala O (lg n) araması mı? Kimlik sütununa göre seçeceğim bir tablo var ve mümkün olduğunca hızlı bir şekilde aramaya ihtiyacım var, bu yüzden kümelenmiş dizin en hızlı seçenek olabilir mi? O (1) performans sağlayacak bir şey arıyorum.SQL Server Karma Dizinleri

cevap

11

Tamam, 2 puan.
SQL CHECKSUM işlevi bir karma değeri üretmiyor. Aslında bir CRC değeri hesaplar. Çok iyi bir aday değil, bir hash kontrolünü üssü kabul etmek için çok sayıda çarpışma olacak. Karma işlevi istiyorsanız, hash_bytes işlevini kontrol etmelisiniz.
İkincisi, aslında bir karma dizin oluşturmuyorsunuz. Bir hash değerinde normal bir b-ağacı oluşturuyorsunuz, bu nedenle arama süresi benzer büyüklükteki veri türündeki diğer herhangi bir ağaç-ağaç indeksi ile aynı olacak.
Daha az sayıda bayt karşılaştırmasına izin vermek için CRC veya uzun bir varchar değerine sahip karması kullanarak küçük bir performans elde etme şansınız vardır, ancak dize karşılaştırması, gerektiğinde çok sayıda baytı denetler; eşleşmeyen ilk karakter kadar ve eğer karma değerde eşleşme yaparsanız, gerçek değeri yine de iki kez kontrol etmeniz gerekir. Çok fazla benzer dizginiz olmadıkça, muhtemelen MORE baytlarını karma (veya CRC) kullanarak karşılaştırabilirsiniz. Kısaca, bunun mantıklı bir plan olduğunu düşünmüyorum, ancak tüm optimizasyonlarda olduğu gibi, bunu özel durumunuzda test etmeli ve karar vermelisiniz. Eğer bunları yayınlamayı önemserseniz, sonuçlarınızı görmek isterim. Ve bir kümelenmiş dizin kullanarak SQL sunucusunda bir satır bulmak için daha hızlı bir yol olduğuna inanmıyorum.

İlgilendiğiniz takdirde, Ingres (CA), O (1) 'e sahip olan karma dizinler oluşturabilir. orada gerçek karma endeksleri de destekleyen başka RDBM'ler olabilir.

+0

Katılmıyorum. CRC'lerin bazı bölümlerini MOD'lerden sonra oldukça rastgele seçmelisiniz. Neden "göreceli olarak çok sayıda çarpışma" olacağını düşündüğünüzü anlamıyorum. – lkessler

+2

Bir test için, 11k dizgisi (çoğunlukla URL'ler, dolayısıyla eşit sayıda ilk segment) sütununda çarpışmaları kontrol ettim. BINARY_CHECKSUM ile 3 tane 3 yönlü çarpışma ve 5 tane 2 yönlü çarpışma var. HASHBYTES ile beklemediğiniz gibi, MD2'yi bile kullanamadım. –

0

Her ikisi de kümelenmiş dizin araması yapacağı için ID alanı bir int dizin kümesinde dizinli bir dizin üzerinde dizinlenmiş bir CHECKSUM ararken hiçbir avantajı yoktur. Ayrıca, bir int sütununun CHECKSUM değeri her zaman sütunla aynı değeri verir (örn. CHECKSUM (535) = 535). Ancak, bir CHECKSUM araması, kimlik uzun bir karakter sütunu olduğunda genellikle daha iyi performans gösterir.

+0

Kümelenmiş bir dizinden daha iyi performans elde etmenin herhangi bir yolu var mı? Kümelenmiş dizin hala O (lg n) ve ben O (1) için arıyordu .. – eulerfx

1

Karma birleştirmeyi kullanmak için işleri ayarlamayı deneyebilirsiniz, karma birleştirmenin gerçekten kullanıldığını doğrulamak için yürütme planına bakabilirsiniz. Karma birleştirmeler kullanıldığında, SQL Server yine de tek tek sorgu yürütme parçası olarak karma tabloyu oluşturur. Endekslerin asla bir karma olarak saklanmadıklarını, sadece ağaç olarak saklandıklarını düşünüyorum.

Genel olarak, potansiyel olarak büyük dizelere veya ikili lekelere (pipTheGeek'in bahsettiği gibi) karşı tam olarak eşleşmiyorsanız yapay bir karma sütun oluşturmayacağım. Sadece bir dizin anahtarına sığacak kadar büyük olabileceğinden bazen bunun gerekli olduğunu eklemeyi istedim. SQL Server için 2k sanırım dizin anahtarlarının boyutuna bir sınır var.

Elbette, birleşiminizde, karmadan kaynaklanan belirsizlikleri gidermek için karma sütunu ve kaynak sütununu eklemeniz gerekir.

+0

SQL Server, tüm dizin anahtar sütunlarının maksimum toplam boyutu için bir [900 bayt sınırı] (http://stackoverflow.com/a/12717441/880904) vardır. –

6

SQL sunucusunun yerel olarak karma tablosu tabanlı bir dizin olduğunu sanmıyorum. BOL documentation, hesaplanan bir değer üzerinde standart (ağaç) indeksi oluşturmaktan bahsediyor. Bu, bazı DBMS platformlarında kullanılabilen ancak SQL Server (AFAIK) olmayan bir dizin yapısı olan Linear Hash Table ile aynı şey değildir.

this blog post'da açıklanan tekniği kullanarak, daha hızlı arama yapmak için URL'ler gibi büyük dize değerlerine sahip olma avantajından yararlanabilirsiniz. Ancak, altta yatan endeks hala bir ağaç yapısıdır ve O (Log N) 'dir.

+0

UPDATE: Bellek içi SQL Server tablolarında karma tablo tabanlı dizin özelliği var. –