2014-02-07 28 views
10

Was ist der gute Ansatz, ein Nvarchar-Feld einzigartig zu halten. Ich habe ein Feld, das URLs von MP3-Dateien speichert. Die URL-Länge kann von 10 Zeichen bis 4000 reichen. Ich habe versucht, einen Index zu erstellen, und er sagt, dass er den Index nicht erstellen kann, wenn die Gesamtlänge 900 Byte überschreitet.Sql Server - Index für nvarchar Feld

Wenn das Feld nicht indiziert ist, wird es langsam, alles zu suchen. Ich benutze C#, asp.net mvc für das Frontend.

Grüße

Paraminder

+3

Wahrscheinlich nicht leicht in einer Datenbank ab * Teile gelöst * eine URL * kann * Groß-und Kleinschreibung, und andere Teile sind Groß-und Kleinschreibung. –

Antwort

24

Sie könnten den CHECKSUM-Befehl verwenden und den Index für die Spalte mit der Prüfsumme setzen.

--*** Add extra column to your table that will hold checksum 
ALTER TABLE Production.Product 
ADD cs_Pname AS CHECKSUM(Name); 
GO 

--*** Create index on new column 
CREATE INDEX Pname_index ON Production.Product (cs_Pname); 
GO 

Dann können Sie Daten abrufen, schnell mit folgenden Abfrage:

SELECT * 
FROM Production.Product 
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname 
AND Name = N'Bearing Ball'; 

Hier ist die Dokumentation: http://technet.microsoft.com/en-us/library/ms189788.aspx

+0

Danke Kaspars, ich nehme den Checksummenpfad. – Parminder

4

können Sie eine Hash-Funktion verwenden (obwohl theoretisch ist es nicht garantiert, dass zwei verschiedene Titel unterschiedliche Hashes haben, aber sollte gut genug sein: MD5 Collisions) und setzt dann den Index auf dieser Spalte.

MD5 in SQL Server

1

Sie könnten einen Hash-Code der URL und verwenden diese ganze Zahl als einen eindeutigen Index auf Ihrem db erstellen. Achten Sie darauf, zuerst alle Zeichen in Kleinbuchstaben umzuwandeln, um sicherzustellen, dass alle URLs das gleiche Format haben. Die gleiche URL erzeugt den gleichen Hash-Code.

+0

Uh, URIs sind Groß-und Kleinschreibung ... – binki

+0

@binki Nicht wirklich .. Es hängt von der Backing-Server. RFC states "..Wenn zwei URIs zu vergleichen, ob sie übereinstimmen oder nicht, sollte ein Client eine Groß-und Kleinschreibung beachten Oktett-by-Oktett Vergleich der gesamten URIs" aber SOLL ist nur eine Empfehlung, so IIS ist nicht case empfindlich, tut Apache. Siehe diesen Thread: http://StackOverflow.com/Questions/15641694/are-uris-case-insensitive – Oscar

+0

Dann sind Sie nicht auf Betriebssystemen mit Groß-und Kleinschreibung Dateisystem oder Unterstützung von Remote-Speicher auf Groß-und Kleinschreibung Dateiserver. Es gibt Gründe, dass RFCs Dinge empfehlen ... was ist, wenn die MP3 auf einem Dienst wie imgur oder YouTube gespeichert wird, wo der Schlüssel ein base64-Hash ist, bei dem die Groß-/Kleinschreibung beachtet wird? – binki