2009-07-11 6 views
1
SELECT 
    * 
FROM 
    myTable 
WHERE 
    field1 LIKE 'match0' AND 
    myfunc(t1.hardwareConfig) LIKE 'match1' 

Voici ma question,Comment allez-SQL Server effectuer cette requête dans les coulisses

l'appariement des field1 est rapide et rapide, mais myfunc prend une éternité pour revenir et je veux vous assurer que si field1 doesn ne correspond pas à ce qu'il ne tente même pas de faire myfunc. Est-ce que SQL le sait ou est-ce que je peux le rendre explicite dans ma requête?

Je suis sur MSSQL 2000, 2005 et 2008, j'espère qu'il y a une réponse commune.

+1

Qu'est-ce que mysp? Il ne peut pas s'agir d'une procédure stockée car vous ne pouvez pas les utiliser de cette façon. –

+0

err je voulais dire fonction - au lieu de procédure stockée. – Matt

+0

Jetez un oeil aux autres réponses en dehors de la meilleure réponse. La réponse pourrait bien être que vous n'avez pas besoin de vous en préoccuper: SQL le trouvera pour vous. –

Répondre

7

Pour appliquer l'ordre dans lequel les conditions sont évaluées, utilisez l'approche suivante, car il est documenté que CASE préserve l'ordre dans lequel les conditions sont évaluées.

SELECT 
     * 
FROM 
     myTable 
WHERE 
    CASE WHEN field1 LIKE 'match0' THEN 
    CASE WHEN myfunc(t1.hardwareConfig) LIKE 'match1' 
     THEN 1 
    END 
    END = 1 

L'article suivant explique en bon détail: Predicates in SQL

1

Il y a beaucoup de choses qui se passent en coulisses pour déterminer comment une requête est exécutée, mais dans cette situation, devrait attendre pour qu'elle filtre d'abord sur le champ1. Notez que ce n'est pas une garantie - l'optimiseur de requêtes peut faire des choix étranges de temps en temps. De plus, vous pouvez améliorer vos chances en utilisant l'opérateur '=' plutôt que l'opérateur 'LIKE'.

1

mysp ne peut pas être une procédure stockée. Il doit s'agir d'une fonction définie par l'utilisateur (que vous devriez d'ailleurs avoir qualifiée avec son nom de schéma). Une fonction définie par l'utilisateur est limitée à être sans effets secondaires et doit respecter certaines règles. Essentiellement, SQL Server va combiner la requête et l'exécuter en tant que module unique avec un seul plan d'exécution. Ce n'est pas une fonction procédurale comme on pourrait s'y attendre. SQL décrit ce qu'il faut faire, pas comment le faire et l'optimiseur de requête génère un plan qui répond à votre requête complète, et non chaque partie séparément. La même chose est vraie pour les vues.

1

Dans SQL Server Management Studio (pour 2008 et je pense 2005), vous pouvez lui indiquer le plan d'exécution. Appuyez sur Control-M dans la fenêtre de requête. Ensuite, exécutez la requête. Cela vous montrera les détails.

0

est-myfunc juste un calcul complexe ou que la modification de la valeur de retour fréquemment. Je me demande parce que si cela ne change pas souvent et qu'il s'agit d'une requête fréquemment exécutée, il peut être préférable d'avoir un déclencheur after insert pour calculer la valeur et la stocker dans la table en tant que colonne séparée. Ensuite, vous n'avez pas à vous soucier de l'ordre dans lequel les choses sont évaluées. La requête peut même s'exécuter plus rapidement, surtout si vous avez un index sur les deux colonnes.

Questions connexes