2012-08-02 2 views
1

Disons que j'Interrogation de la DB comme suit:Les moteurs SQL sont-ils optimisés aussi loin? (Voir exemple)

SELECT 
    T3.ID 
    T1.factor1 * T2.factor2 * T3.VAL, 
    T1.factor1 * T2.factor2 * T3.VAL, 
    T1.factor1 * T2.factor2 * T3.VAL, 
    T1.factor1 * T2.factor2 * T3.VAL, 
       (...) 
    T1.factor1 * T2.factor2 * T3.VAL 
FROM 
    Table3 AS T3 
    LEFT JOIN Table2 AS T2 ON T3.ID = T2.Table3ID 
    LEFT JOIN Table1 AS T1 ON T3.ID = T1.Table3ID 

Ma question est:

sera le moteur T1.factor1 * T2.factor2 effectuer, une fois ou N fois?

(s'il vous plaît donner des réponses pertinentes à votre moteur de DB de choix!)

Vous pouvez aussi donner une réponse plus générale (disons qu'il y aurait P facteurs au lieu d'2.

EDIT: vous pouvez remplacer T1.factor1 * T2.factor2 par une fonction informatiquement intenstive de votre choix, qui aurait une valeur distincte pour chaque ligne de sortie

+2

Vous n'avez pas de conditions de jointure – Jodrell

+2

Il semble que tous les éléments de la liste SELECT soient distincts - pas de dupes - quelle est alors votre question? Tous ces éléments seront évalués une fois, dans quel contexte prévoyez-vous qu'ils seront évalués * N * fois? – Charleh

+0

@Jodrell: ajouté! (mais la question se concentre sur les facteurs :)) –

Répondre

2
SELECT 
    T1.factor1 * T2.factor2 * T3.FIELD1, 
    T1.factor1 * T2.factor2 * T3.FIELD2, 
    T1.factor1 * T2.factor2 * T3.FIELD3, 
    T1.factor1 * T2.factor2 * T3.FIELD4, 
       (...) 
    T1.factor1 * T2.factor2 * T3.FIELDN 
FROM 
    Table3 AS T3 
    LEFT JOIN Table2 AS T2 
    LEFT JOIN Table1 AS T1 

Je ne sais pas ce que la question est ici -. êtes-vous sking cela à cause des jointures? Puisque toutes vos expressions sélectionnées sont différentes, je suppose que votre requête se rapporte aux jointures

Ma question est - pourquoi le moteur de DB évaluera-t-il l'expression plus d'une fois? Dans quel scénario prévoyez-vous que cela devrait se produire plus d'une fois?

Vous demandez une valeur à partir de chaque table ... qu'est-ce qui vous amène à croire que SQL doit faire quelque chose de plus qu'une chose pour obtenir une valeur de chacune de ces tables?

Modifier: À la lumière des modifications à la question - c'est un bon. Je ne pense pas que SQL saura l'optimiser car vous avez à l'origine multiplié chaque champ par un champ différent à chaque fois en créant une opération scalaire différente.

J'ai essayé de faire la même calulation 300 fois par rapport à une autre requête qui l'a fait une seule fois - SQL n'a pas rapporté de différences dans le coût de la requête. Bien sûr, il y a beaucoup plus à regarder - mais j'imagine soit la différence était trop petite, ou SQL OPTIMISE ce

Query * 300 vs Query * 1

C'est sur MSSQL 2005.

Je vais essayer cette sur votre propre DB avec quelque chose de coûteux en calcul et comparer les plans de requête. Cela peut valoir la peine de vérifier les statistiques et autres mesures de performance

+0

En fait la question est: est-ce que le moteur évalue plusieurs fois une formule donnée (avec sortie constante), si elle est utilisée pour plusieurs colonnes d'une ligne donnée? Ici, "T1.factor1 * T2.factor2" pourrait être une "VERY_INTENSTIVE_COMPUATATION (CONSTi)", c'est-à-dire une fonction qui aurait une valeur distincte pour chaque ligne de sortie, mais pas pour chaque colonne de sortie dans une ligne donnée. –

+0

J'ai mis à jour en tenant compte de ce que vous avez modifié dans votre question – Charleh

+0

superbe. Merci pour le plan try & exec! –

Questions connexes