2011-11-14 24 views
18

kimse performansının herhangi bir somut kanıt sağlayabilir:Performans Farkı

string = string 

fıkra WHERE MS-SQL. Örnek

select * 
from Samples 
where SamplesID = 5 

ve için

:

select * 
from Samples 
where Name = 'Shampoo' 

fark var mı veya performans aynıdır?

+1

Ben SamplesId kümelenmiş dizin olması beklenebilir. İndeksin varlığı ve türleri büyük bir etkiye sahiptir. Bu gerçek ya da teorik bir soru mu? –

+0

@SteveHenderson, "SamplesId'nin birincil anahtar olmasını bekler" şeklindeki yorumunuzu değiştirir ve% 100 ile aynı fikirdeyim :) Kimlik sütunları genellikle kümelenmiş dizini oluşturan veya olmayan anahtarlar belirler. Tabii ki, bu sadece bir varsayım ... –

+0

@StuartAinsworth Hayır - Ben de kümelenmiş dizin olmasını beklerdim. Basit bir arama tablosuyla (Kimlik ve İsim, diğer bazı şeylerle), bu arama tablosunun fiziksel sıralamasının Id (Birincil anahtar ve kümelenmiş dizin) tarafından olmasını beklerim. –

cevap

10

Tamam ilginç bir soru hep aldı, aynı derecede seçicidir. 1M Rastgele Soyadları ve türlerimden, verilerimden indeks veya birincil anahtar olmadan yalnızca bir ham veri içeren bir sıfırlama veritabanına birer örnek aldım. Sütunların herhangi birinde standartlaştırılmamış verilerimin aralığı boyunca hiçbir ölçüm yapılmadı, bu nedenle veritabanımın gerçekliğini salt istatistiksel bir kümeden ziyade yansıtır.

select top 100 * from tblScratch where contactsurname = '<TestSurname>' order by NEWID() 
select top 100 * from tblScratch where contacttyperef = 1-22 order by NEWID() 

Newid, her seferinde veri listesini rastgele ayıklamak için var. Bunu 20 soyadı ve 20 tür için hızla koştum. Sorgular, soyad soyadından sonra soyadı çalıştırıldı. Referans numarasını aramak neredeyse 4x daha hızlıydı ve yaklaşık 1/2 kullanmıştı, bu yüzden kitaplar yıllar önce haklıydı.

Dize -
SELECT TOP 100 * FROM tblScratch WHERE contactsurname = 'hoare' ORDER BY NEWID()

Duration 430ms 
Reads 902 
CPU 203 

Tamsayı - Bir numuneler Masanın üzerinde
SELECT TOP 100 * FROM tblScratch WHERE contacttyperef = 3 ORDER BY NEWID()

Duration 136ms 
Reads 902 
CPU 79 
+0

, bu sayede tamsayıları karşılaştırmak daha az CPU yoğunluğuna sahip olduğundan, daha iyi performansla sonuçlanır. Microsoft'un karşılaştırmanın gerçekte nasıl çalıştığına dair herhangi bir belge var mı? –

+7

Gerçekten iyi bir test (üzgünüm) ve potansiyel olarak yanıltıcı olmadığından, NewID() tarafından sipariş edilmesi tamamen gerçekçi olmayan bir öğe sunar - bir GUID tarafından satırlar oluşturur ve sıralar. İyimser, WHERE ifadesini yorumladıktan sonra bunu zorunlu olarak yapmayacaktır. TOP ve Order NEWID() yöntemini alıp tekrar test edebilir misiniz? –

2

Her iki sorgunuzu da aynı sorgu penceresine koyun. (Bu sorguların ya önce) çok üst koymak At: SET İSTATİSTİK IO

AÇIK seçeneği ile kod çalıştırmak o çalıştırdığınızda "Fiili yürütme Planı Dahil" (sizin araç çubuğunda bir simge üç küçük kutular benziyor hangi (Yürüt düğmesinin sağındaki yaklaşık 7 simge)

Sonuçlarınızda üç sekme ile sonuçlanır: Sonuçlar, İletiler, Plan. Mesajlar ve Plan size IO maliyetini ve tam Execution maliyetini gösterecektir.

Büyük sayılar ile yapılan sorgu en yüksek paya sahiptir! Bu yöntem, hangi sorgunun en düşük maliyet (en yüksek performans) olduğunu gösterir.

+1

BTW, bir ders kitabı cevabı vermek yerine test etmek için söylüyorum, optimiser olasılık temelli bir plan çalıştırıyor ve boyut ve endekslere bağlı olarak (Stuart Ainsworth'un işaret ettiği gibi) bazen daha hızlı Tam tablo taraması (özellikle bir SELECT * ile), verileri almadan önce bir indeks araması yapmaktan daha iyidir, böylece optimiser indeksi yoksayacaktır. Ders kitabıyla ilgili tavsiyeyi iyi bir başlangıç ​​noktası olarak alın, ancak gerçekten test etmeniz ve tablo boyutları ve yapıları değiştikçe yeniden test etmeniz gerekir –

2

Steve yorumlarda belirtildiği gibi, dizinlerin varlığı ve oluşturulması sonuçlarınızı büyük ölçüde etkileyecektir; Ancak, SQL Server, arama verileri için sayfalarla çalıştığı ve daha dar sütun türleri, sayfa başına daha fazla veri saklayabildiğinden, dar bir tür kullanarak, daha fazla değer olması gereken daha geniş bir türden daha iyi performans gösterebilir.

Eğer küçük bir tablonuz varsa (birkaç satır), muhtemelen önemli değil; buyuk masa? Int sütuna bir dizin koyun ve büyük olasılıkla endeksli bir varchar sütunu yerine getirecektir.

Elbette, büyük veya küçük tabloları oluşturan şey donanımınıza bağlıdır.

+3

Bu yalnızca uzun varchar alanları varsa geçerlidir. 'int' bir 8 bayt olduğundan, daha küçük olması için 'int' daha küçük olmak için varchcar başına satırın 6 karakterden daha fazla ortalama olması gerekir. – JNK

+0

Belirtiler genellikle iyi bir kuralı berbat eder, ancak her soruyu " "bağlıdır. Tinyints (bir tamsayı değeri, ancak bir int değil), herhangi bir varchar sütundan (ve bir char (1) eşdeğerine) daha az olan 1 bayttır. Kural hala geçerli; daha dar tip, performans için daha iyi bir potansiyel. –

1

Tamsayıların karşılaştırılması daha hızlı olmalı, çok düşük seviyede ise 1 cmp talimatı ile bitecektir. Dize karşılaştırması daha fazla talimat içerir ve sonuç olarak, daha kötü performans.
bende sende ya, her iki alanda dizinleri olmayan ya varsayalım, endeksler o tamsayı daha hızlıydı ve aslında test asla okurken kayıtların sayısı da aynı

+0

Daha hızlı olması gerektiğini anlıyorum ama bunun kanıtlanması için somut bir yol olup olmadığını anlamaya çalışıyorum? , bu aynı zamanda, farklı işletim sistemi ve hatta donanım dizeleri karşılaştırılırken, tamsayıları karşılaştırırken farklı yaklaşımlar anlamına gelir –

+0

Bunu kanıtlamanın veya reddetmenin tek% 100 inkar edilemez yolunun, dize ve sayı karşılaştırmasını işleyen SQLServer kaynak koduna bakmak olduğunu düşünüyorum. Şahsen, boş olmayan dizeleri (sayıların 2 dizisini karşılaştıran) karşılaştırmanın sadece 2 sayıyı karşılaştırarak daha hızlı olabileceğini görmüyorum. – a1ex07

İlgili konular