J'ai besoin d'une fonction "recherche" dans mon application, quelle est la meilleure façon de le faire dans SQL Server?
SELECT * FROM Customer WHERE CustomerNumber LIKE '%' + @SearchValue +'%' UNION SELECT * FROM Customer WHERE LastName LIKE '%' + @SearchValue +'%' UNION SELECT * FROM Customer WHERE FirstName LIKE '%' + @SearchValue +'%'
4 Réponses :
Ni est optimal, mais le premier est un peu mieux. Il ne scanne que les données une fois et l'évaluation de Si vous voulez vraiment des performances, recherchez les options d'indexation de texte complètes fournies par votre base de données. P> comme code> est abrégée pour les correspondances à la première ou à la deuxième condition. De plus,
Union code> va engager des frais généraux pour éliminer les doublons. P>
Merci à tous pour les réponses, j'ai enquêté sur la recherche en texte intégral, mais il semble qu'il n'y ait pas d'équivalent à comme '% xxx%'. (Corrige moi si je me trompe)
Ce n'est généralement pas vrai pour tout RDB que Avec une requête comme ça, si vous recherchez des mots, vous devez envisager d'utiliser des index de texte intégral si disponibles, et ils sont disponibles dans la plupart des RDB mais avec différentes syntaxes de requête. https://www.msqlTips.com/sqlservertorial/9136 / SQL-Server-Full-Text-index / P> ou code> ne peut pas être optimisé; Les index de saut de saut Afaik sont mis en œuvre par la plupart des RDB, ce qui signifie que plusieurs conditions peuvent être optimisées. Dans votre cas cependant, parce que votre
comme code> Les conditions commencent par
% code> et ne sont donc pas des correspondances préfixées, ils ne peuvent pas être optimisés par des index, car ils ne sont pas des conditions de plage. Malgré tout, vous devez utiliser la composition
ou code>: il est plus facile à lire, fidèle à l'intention de la requête et il est très probable que la requête code> Union code> effectue plusieurs tableaux Scanne, une pour chaque sous-requête tandis que la requête ou la requête fera probablement une seule analyse, ce qui devrait être plus rapide. Je dis «probable» car avec un optimiseur de requête idéal, toutes les requêtes équivalentes doivent être résolues au plan d'exécution de la meilleure exécution - dans ce cas, une seule analyse. Mais les optimiseurs sont loin d'être "idéal". Donc, alors que avec différents YMMV de RDB, allez avec la requête
ou code>. P>
Ouais, j'ai vu l'opération oridx code> dans db2. +1
Les deux requêtes sont de manière à ne pas être performantes optimales. p>
pour l'option 1 - la numérisation de nombreuses possibilités et ce n'est pas un meilleur moyen de le faire. Vous devez réellement avoir une indexation de chaîne pour combiner toutes les options ensemble. p>
Options 2 - Ceci est plus lent alors première option car elle effectue plusieurs options de sélection. p>
Ne vous inquiétez pas des index. P>
Aucune de ces questions n'utilisera aucun index. De toute façon, ils effectueront de toute façon les numéros de table, car les modèles de recherche commencent par Le premier effectuera une seule numérisation de table complète, tandis que la seconde effectuera trois. Par conséquent, le premier sera plus rapide. p>
En outre, gardez à l'esprit la deuxième requête retournera un ensemble de résultats légèrement différent car il supprime les doublons. P> % code>. P>
Les requêtes peuvent toujours utiliser un index scan i>, mais pas un cherche i>. Cela pourrait réduire considérablement les E / S physiques comparées à une analyse de table en fonction de la taille d'une rangée par rapport à la taille des colonnes recherchées et du nombre de lignes correspondantes.
@Habo La liste sélectionnée des colonnes est * code>, de sorte que l'utilisation d'un indice de couverture n'est pas utile. Une analyse de la plage d'index n'est également pas utile, car il n'y a pas de conditions de départ ou d'arrêt. Il doit parcourir toutes les lignes de toute façon.
Ils peuvent / peuvent ne pas renvoyer le même résultat en fonction des données de la table. (Dupliqués supprimés par Union.)
Où avez-vous lu que les index ne prennent pas en charge
ou code>?
Si vous avez deux questions de travail et que vous voulez savoir ce qui est le meilleur, les tests sont souvent un bon moyen de le savoir. Les index prenant en charge ou ne pas prendre en charge ou (la base de données prend en charge) est hors de propos de cette question, car vos tergimes de recherche ne peuvent pas être recherchés de toute façon (index de texte intégral serait bon ici) car ils ne sont pas sargables en raison des caractères génériques. Ceci est important de lire et d'apprendre pourquoi.