2010-10-27 7 views
0

J'ai un problème avec cette requête, la complexité de cette requête n'est pas bonne, j'utilise cette requête depuis longtemps et maintenant cette base de données a beaucoup de lignes pour obtenir la sélection par cette méthode. Tous les index sont ajoutés proprement. Je recherche une autre méthode pour optimiser cette requête par comparaison de date car c'est un goulot d'étranglement dans cette solution.Comment optimiser cette requête en utilisant une meilleure comparaison de date en SQL?

SELECT (...) FROM table 
WHERE (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) >= (var_0 * 10000 + var_1 * 100 + var_2) and 
     (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) <= (var_3 * 10000 + var_4 * 100 + var_5) 

Quelqu'un peut-il m'aider? Salutations

+0

liées: http://stackoverflow.com/questions/1765667/mysql-date-function-running-insanely-slow-in-left-join –

Répondre

2

Je suggère d'utiliser des comparaisons de date mysql intégrées.

row_add_date <= '20101027' and row_add_date >= '20101027' 

Mais notez que ceci est un test étrange en premier lieu: ne testez pas juste que la date est égale au 27 Octobre, comme ceci:

row_add_date = '20101027' 
+0

'0' = 0 c'est '0' = var_1 en pratique, ça me manque. – Svisstack

+0

Merci à ce problème résolu et la requête s'exécute 372 fois plus vite. J'essaye ceci mais avec des valeurs de «-» bettwen mais alors ceci ne fonctionne pas. – Svisstack

2

Pourquoi est-ce que vous divisez la date comme ça? Les fonctions par rangée font bien et non. Il me semble que toute la section de date à la fin peut être remplacé par:

where row_add_date = '2010-10-27' 

Même si vous voulez une gamme, vous êtes toujours mieux d'utiliser les dates telles qu'elles sont.


Sur la base de vos modifications à déclarer que vous utilisez des variables, vous devez faire le calcul sur le côté droit des conditions. C'est parce que cela sera fait une fois avant le début de la requête. Avec ce que vous avez, le calcul sur le côté gauche sera fait une fois par rangée, un tueur de performance défini.

+0

Fermer, il pourrait être remplacé par 'row_add_date> = '2010-10-27' et row_add_date <'2010-10-28'' – Andomar

+0

Wow, vous avez raison :) complètement raté cela. il avait l'air si terrible que je n'ai pas essayé de comprendre le calcul –

+0

J'ai mis à jour la question, ces valeurs sont variables et ne sont pas égales dans la requête, désolé de manquer cela. – Svisstack

0

Je vais deviner row_add_date est de type datetime. Si c'est le cas, vous devez transformer 20101027 en datetime et comparer la colonne à celle-ci.

En d'autres termes:

row_add_date >= firstDateTime and row_add_date <= secondDateTime