MS SQL Index pour la requête de search

J'ai une fonction de search rapide AJAX où les users searchnt des noms dans un directory. La requête ressemble à ceci où name est le paramètre:

SELECT TOP 30 * FROM CONTACT c WHERE ( c.FIRST_NAME LIKE '%#name#%' OR c.LAST_NAME LIKE '%#name#%' ) OR ( c.FIRST_NAME + ' ' + c.LAST_NAME LIKE '%#name#%' ) OR ( c.LAST_NAME + ' ' + c.FIRST_NAME LIKE '%#name#%' ) ORDER BY LAST_NAME, FIRST_NAME 

Quel est le meilleur type d'index ou d'index à utiliser pour ce type de requête? Ou devrais-je build la requête différemment pour optimiser les performances? Tout conseil serait bon.

Je pense que vos meilleures options sont:

  1. Regardez votre plan de requête pour voir s'il y a des problèmes. Si c'est difficile à comprendre, posez des questions ou regardez ici: http://www.mssqltips.com/sqlservertip/1873/how-to-read-sql-server-graphical-query-execution-plans/

  2. Regardez dans la database elle-même dans la table sys.dm_db_missing_index_details et voyez s'il y a des indices manquants et évaluez les suggestions comme décrit ici: http://www.danielahill.com/Blog/SQL_Server_Find_Add_Missing_Indexes.aspx

  3. Regardez les performances de la machine SQL Server elle-même (CPU faible, l'activité du disque faible)

  4. Regardez les performances de l'application

Je pense que la performance des requêtes varie beaucoup en fonction des données qui s'y trouvent et de la facilité avec laquelle la database met en cache des informations et il est difficile de donner beaucoup de conseils spécifiques.

Comme sharepoint départ, vous pouvez essayer:

 create index IX_CONTACT_Last_First on CONTACT (LAST_NAME, FIRST_NAME); 

Bien que, probablement, il n'y aura pas beaucoup d'avantages à utiliser like (par rapport à la condition de correspondance exacte), mais s'il y a un certain nombre d'autres colonnes dans la table, au less cela peut aider à faire un scan sur less de pages .

Vous ne devriez pas utiliser * , si seulement une partie des colonnes est nécessaire parmi celles * fait, et devrait spécifier directement les colonnes nécessaires (par exemple, select top (30) ID, LAST_NAME, FIRST_NAME, PHONE, EMAIL from ... ), et vous peut essayer de les inclure dans l'index:

 create index IX_CONTACT_Last_First on CONTACT (LAST_NAME, FIRST_NAME) include (PHONE, EMAIL, ID); 

En outre, je ne suis pas sûr, mais il semble que certaines conditions de la clause where sont redondantes, et vous pouvez essayer de faire less de vérifications:

 SELECT TOP (30) FIRST_NAME, LAST_NAME FROM CONTACT c WHERE ( c.FIRST_NAME + ' ' + c.LAST_NAME LIKE '%#name#%' ) OR ( c.LAST_NAME + ' ' + c.FIRST_NAME LIKE '%#name#%' ) ORDER BY LAST_NAME, FIRST_NAME;