Ich speichere Zeichenfolge Präfixe in meiner SQL Server-Tabelle, ich möchte sehen, ob einer dieser Werte ein gültiges Präfix für einen bestimmten Parameterwert ist.Übereinstimmende Spaltenwerte als Präfixe
z.B. angenommen, ich habe eine Telefon Do-Not-Call-Liste und es enthält einen Eintrag zu verbieten alle Anrufe auf Nummern beginnend mit "1425123
", anstatt 10000 Nummern einfügen (14251230000
zu 14251239999
) es speichert das Präfix statt.
Wie so:
CREATE TABLE Prefixes (
Value varchar(10)
)
CREATE INDEX IX_Value UNIQUE Prefixes (Value)
wie so Ausgewertet:
DECLARE @value varchar(10) = 'foobar'
SELECT
*
FROM
Prefixes
WHERE
@value LIKE (Value + '%');
Wenn ich dies in Azure SQL in SQL Server Management Studio sagt, es es einen Index Scan ist die Durchführung. Bei ungefähr 70.000 Einträgen in einer Azure SQL S1-Datenbank dauert die Abfrage zwischen 200 und 500 ms. Das Tool schlägt keine Verbesserung der Indizes für eine schnellere Leistung vor.
Zum Vergleich verwendet eine exakte Gleichheitsübereinstimmung (Value = @value
) einen Index Seek und passiert fast sofort.
200-500ms ist zu langsam für meine Anwendung.
Eine Möglichkeit ist, den Nachschlag in meinen Anwendungscode unter Verwendung einen Trie für eine effiziente Präfixsuche (das führt Synchronisationsprobleme) zu bewegen, aber ein anderer Ansatz ist die Abfrage, so etwas zu ändern:
DECLARE @v1 varchar(1) = LEFT(@value, 1)
DECLARE @v2 varchar(2) = LEFT(@value, 2)
DECLARE @v3 varchar(3) = LEFT(@value, 3)
DECLARE @v4 varchar(4) = LEFT(@value, 4)
DECLARE @v5 varchar(5) = LEFT(@value, 5)
DECLARE @v6 varchar(6) = LEFT(@value, 6)
DECLARE @v7 varchar(7) = LEFT(@value, 7)
DECLARE @v8 varchar(8) = LEFT(@value, 8)
DECLARE @v9 varchar(9) = LEFT(@value, 9)
SELECT
*
FROM
Prefixes
WHERE
Value = @v1 OR
Value = @v2 OR
Value = @v3 OR
Value = @v4 OR
Value = @v5 OR
Value = @v6 OR
Value = @v7 OR
Value = @v8 OR
Value = @v9
Wenn ich das mache, ist es viel schneller (mit einem Index Seek), aber es fühlt sich an wie ein Hack, aber weil ich weiß, dass die Länge weniger als 10 Zeichen beträgt, bin ich damit einverstanden ... vorerst.
Gibt es einen besseren Weg? Gibt es eine Möglichkeit, wie SQL Server mein Präfix intern abgleichen kann (d. H. Die gleiche Logik in meinem letzten Beispiel verwenden, aber kein repetitives und sprödes SQL verwenden)?
Ist 70.000 Einträge wirklich realistisch? Wie viele davon sind vollständige Nummern und wie viele sind Präfixe. Wie viele Einträge sind redundant? Z.B. Wenn Präfixe "1" enthalten, dann könnte es Hunderte oder sogar Tausende von Einträgen geben, die mit "1" beginnen, die ignoriert würden, weil "1" bereits eine Übereinstimmung für "14251230000" ist. –