0
votes

quelle requête SQL est la meilleure

J'ai besoin d'une fonction "recherche" dans mon application, quelle est la meilleure façon de le faire dans SQL Server?

  1. Créez une requête avec 1 grande liste de clause contenant toutes les colonnes à l'aide d'une instruction ou de la création d'une index contenant toutes les colonnes li> ol> xxx pré>
    1. Créez des requêtes séparées pour chaque colonne à l'aide d'union et créez un index pour chaque colonne LI> OL>
      SELECT * 
      FROM Customer 
      WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
      UNION 
      SELECT * 
      FROM Customer
      WHERE LastName LIKE '%' + @SearchValue +'%'
      UNION
      SELECT * 
      FROM Customer
      WHERE FirstName LIKE '%' + @SearchValue +'%'
      


3 commentaires

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 ?


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.


4 Réponses :


3
votes

Ni est optimal, mais le premier est un peu mieux. Il ne scanne que les données une fois et l'évaluation de comme est abrégée pour les correspondances à la première ou à la deuxième condition. De plus, Union va engager des frais généraux pour éliminer les doublons.

Si vous voulez vraiment des performances, recherchez les options d'indexation de texte complètes fournies par votre base de données.


1 commentaires

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)



1
votes

Ce n'est généralement pas vrai pour tout RDB que ou 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 Les conditions commencent par % 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 : il est plus facile à lire, fidèle à l'intention de la requête et il est très probable que la requête Union 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 .

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 /


1 commentaires

Ouais, j'ai vu l'opération oridx dans db2. +1



0
votes

Les deux requêtes sont de manière à ne pas être performantes optimales.

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.

Options 2 - Ceci est plus lent alors première option car elle effectue plusieurs options de sélection.


0 commentaires

-1
votes

Ne vous inquiétez pas des index.

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.

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.


2 commentaires

Les requêtes peuvent toujours utiliser un index scan , mais pas un cherche . 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 * , 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.