2011-10-18 9 views
6

Sto provando a inserire un indice su una colonna che conterrà gli URL. Poiché la lunghezza massima di un URL è di oltre 2000 caratteri, ho impostato il tipo di dati su NVARCHAR (3000). Quando l'ho fatto ho ricevuto l'errore The total size of an index or primary key cannot exceed 900 bytes. Dato che potrei aver bisogno di cercare i record per URL, ho bisogno di un indice sulla mia colonna URL. C'è un modo per aggirare questa limitazione?Server SQL: la dimensione totale di un indice o di una chiave primaria non può superare i 900 byte

+0

Questo non mi sembra molto efficiente. In realtà sembra un completo incubo per il motore DB da gestire. Hai stabilito che * hai * bisogno di cercare per URL e che questa ricerca sarà lenta? La ricerca del testo può essere abbastanza veloce, sai. C'è anche la possibilità di suddividere l'URL in bit, indicizzare solo uno di quei bit (quello che varia di più) e quindi collegare la parte indice all'intero URL. In breve, ci sono molte strategie possibili qui. – Robinson

risposta

10

È possibile creare una colonna calcolata per il checksum dell'URL e quindi utilizzare il checksum nella query. I checksum non saranno unici, ma ridurranno rapidamente il numero di possibili corrispondenze.

In primo luogo, aggiungere una colonna calcolata al vostro tavolo, in questo modo:

Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

Ora indice di colonna in questo modo:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

ora è possibile scrivere una query che farà un indice di ricerca per trovare la riga che stai cercando:

Select URL 
From YourTableName 
Where URL_HASH = CheckSum(N'google.com') 
     And URL = 'google.com' 

Questo metodo dovrebbe funzionare molto bene per la corrispondenza esatta es. Se si desidera corrispondenze parziali, è meglio utilizzare la funzionalità di ricerca di testo completo.

+0

Grazie abbiamo deciso di implementarlo. – Luke101

+0

Ciao G Mastros. Grazie per la tua risposta. Ho la colonna Varbinary che contiene molti dati. Questa colonna può essere nullo e ho una query che cerca i record in cui questa colonna non è nulla. Il tuo approccio al checksum sembra molto utile anche in questo caso. Ho controllato che il checksum per la colonna nullable sia 2147483647. Anche se può funzionare ma sembra strano codificare questo numero nelle query. Questo numero sarà lo stesso quando migreremo ad un'altra versione di SqlServer? Mi sono sparato al piede una volta utilizzando il metodo GetHashCode in C# e alla fine ha restituito un valore diverso a seconda del sistema operativo. – Mariusz

+0

Non lo so per certo. Tuttavia, anziché codificare il numero, è possibile utilizzare "checksum" (Converti (varbinary, null)) ". Quindi, se il valore cambia con la versione db, sarai comunque protetto. –

Problemi correlati