2016-07-24 5 views
1

Wir möchten die Leistung unserer Join-Abfragen verbessern, und der Index befindet sich in einer Spalte von nvarchar(1000).Verbessern der Leistung von Join-Abfragen mit SQL Server

Verwendet einen Index für einen anderen Datentyp, z. B. bigint (indem Sie eine zusätzliche Spalte hinzufügen und diese mit einer Hash-Map-Funktion in der ursprünglichen Spalte ausfüllen), um die Leistung zu erhöhen?

Ändert der Index zu nvarchar(200) statt nvarchar(1000) Leistung (unter der Annahme, dass der längste Wert 200 Zeichen sein kann)?

+1

Konnten Sie DB-Struktur mit Ihrer Abfrage zur Verfügung stellen >> –

+0

Ich möchte nur eine Hauptantwort erhalten, ist Index auf Zahl besser als Index auf Chars? Ist der Index für navchar (1000) besser als der Index für navchar (200), wenn die Werte gleich sind und niemals 200 Zeichen überschreiten? – Muky

+0

Wenn die Nummer gleich groß ist wie der navchar, wird dieselbe Leistung erzielt. Navchar (200) 'Index wird dann eine bessere Leistung haben als ... lies meine Antwort :) –

Antwort

0

Die Leistung des Index hängt von der Anzahl der Zeilen und der Größe der indizierten Spalte ab.

Ja, Hinzufügen der zusätzlichen Spalte mit Hashmap, Verwendung und Indexierung, das könnte ein wenig Leistung von SQL-Abfragen erhöhen, weil indexies kleiner werden und sql schneller mit ihnen im Speicher arbeiten wird. Aber Sie müssen Hashmaps anderswo berechnen, so dass die endgültige Leistung der App nicht größer wäre. Es gibt ein weiteres Problem, dass die Hashmappe mit einer großen Datenmenge unvorhersehbar arbeitet (es kann 1 hashmap für den n-Wert von navchar geben). Also würde ich endlich sagen, es ist keine gute Idee.

Das Wechseln von navchar (1000) zu navchar (200) klingt etwas besser. Indexe werden kleiner, schneller, Einfügung von neuem Wert wird auch schneller sein und was am wichtigsten ist, wird es stabil sein. Aber der Leistungsunterschied wäre nicht so herrlich.

+1

'nvarchar (1000)' ** kann nicht ** als Indexspalte verwendet werden, da sie die maximal 900 Byte für einen Indexeintrag überschreitet. –

+0

Es wurde nicht gesagt, welche Art von SQL-Server er verwendet. Woher willst du das wissen? –

+1

*** ALLE *** Versionen von SQL Server (bis einschließlich 2016) haben diese 900 Byte Grenze für Indexeinträge –