24 Stimmen

Leistungsunterschied beim Vergleich von Ganzzahlen und Zeichenketten

Kann jemand konkrete Angaben zur Leistung beim Vergleich von

int = int

とします。

string = string

in WHERE Klausel in MS-SQL.

Zum Beispiel

select *
from Samples
where SamplesID = 5

とします。

select *
from Samples
where Name = 'Shampoo'

Gibt es einen Unterschied oder ist die Leistung gleich?

12voto

u07ch Punkte 12706

OK, interessante Frage. Ich habe immer davon ausgegangen, dass die Ganzzahl schneller ist, habe es aber nie wirklich getestet. Ich nahm 1M zufällige Nachnamen und Typen aus einer Liste von Kontakten aus meinen Daten in eine Scratch-Datenbank ohne Indizes oder Primärschlüssel nur Rohdaten. Keine Messung wurde über den Bereich meiner Daten in einer der Spalten gemacht wurde nicht standardisiert, so spiegelt die Realität meiner Datenbank eher als eine reine statistische Satz.

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

Die Newid ist dazu da, die Datenliste jedes Mal nach dem Zufallsprinzip zu erstellen. Ich habe dies schnell für 20 Nachnamen und 20 Typen durchgeführt. Die Abfragen wurden nach dem Nachnamen und dann nach dem Nachnamen durchgeführt. Die Suche nach der Referenznummer war fast 4x schneller und verbrauchte etwa die Hälfte, so dass die Bücher vor all den Jahren richtig waren.

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

Duration 430ms
Reads 902
CPU 203

Ganzzahlig -
SELECT TOP 100 * FROM tblScratch WHERE contacttyperef = 3 ORDER BY NEWID()

Duration 136ms
Reads 902
CPU 79

3voto

Steve Henderson Punkte 436

Legen Sie beide Abfragen in dasselbe Abfragefenster. Geben Sie ganz oben (vor einer der beiden Abfragen) ein: SET STATISTICS IO ON

Wenn Sie den Code ausführen, führen Sie ihn mit der Option "Tatsächlichen Ausführungsplan einbeziehen" aus (ein Symbol in Ihrer Symbolleiste, das wie drei kleine Kästchen aussieht, etwa 7 Symbole rechts neben der Schaltfläche "Ausführen").

Dies führt dazu, dass Sie drei Registerkarten in Ihren Ergebnissen sehen: Ergebnisse, Nachrichten und Plan. Die Meldungen und der Plan zeigen Ihnen die IO-Kosten und die vollständigen Ausführungskosten.

Die Abfrage mit den größeren Zahlen hat die höchsten Kosten! Mit dieser Methode können Sie sich selbst beweisen, welche Abfrage die niedrigsten Kosten (höchste Leistung) hat

3voto

Stuart Ainsworth Punkte 12473

Da SQL Server jedoch mit Seiten arbeitet, um Daten nachzuschlagen, und schmalere Spaltentypen mehr Daten pro Seite speichern können, kann die Verwendung eines schmalen Typs bessere Ergebnisse liefern als ein breiterer Typ, bei dem mehr Werte zu berücksichtigen sind.

Wenn Sie also eine kleine Tabelle (wenige Zeilen) haben, spielt es wahrscheinlich keine Rolle; eine große Tabelle? Legen Sie einen Index auf die int-Spalte, und sie wird wahrscheinlich besser abschneiden als eine indizierte varchar-Spalte.

Was ein großer oder kleiner Tisch ist, hängt natürlich von Ihrer Hardware ab.

1voto

a1ex07 Punkte 36186

Der Vergleich ganzer Zahlen sollte schneller sein, auf sehr niedrigem Niveau wird er mit 1 enden cmp Anweisung. Der Vergleich von Zeichenketten erfordert mehr Anweisungen und führt zu einer schlechteren Leistung.
Ich gehe davon aus, dass Sie entweder Indizes für beide Felder haben oder nicht, Indizes sind gleichermaßen selektiv, die Anzahl der Datensätze ist ebenfalls gleich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X