Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

question qui me surprends mais bon ! (experts SQL)

15 réponses
Avatar
Christophe
J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')

10 réponses

1 2
Avatar
Philippe T [MS]
Bonjour,

Il est préférable d'utiliser la fonction DATEDIFF(...) a mon avis.

Phil.
________________________________________________________
Philippe TROTIN
Microsoft Services France http://www.microsoft.com/france
"Christophe" wrote in message
news:%
J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')




Avatar
Christophe
je vois pas trop comment car j'ai plus les memes resultats



"Philippe T [MS]" a écrit dans le message de
news:%
Bonjour,

Il est préférable d'utiliser la fonction DATEDIFF(...) a mon avis.

Phil.
________________________________________________________
Philippe TROTIN
Microsoft Services France http://www.microsoft.com/france
"Christophe" wrote in message
news:%
> J'ai besoin de vos avis d'expertises sur SQL 2000
>
> le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
> microsoft dit que le between fonctionne mal avec les dates et que c'est
> super dependant de ton systeme de date : (pourtant j'ai bien passées les
> parametres en iso ?)
> sachant qu'en plus DateSeance est dans un index !
>
> Pouvez vous me donner votre avis sur ces 2 requetes !
>
> Ma requete :
> SELECT count(*)
> FROM MaTable
> WHERE datesemaine = '20060621'
> AND DateSeance BETWEEN '20060625' AND '20060627'
>
>
> Ca requete ?
> SELECT count(*)
> FROM MaTable
> where datesemaine = '21/06/2006' and
> convert(nvarchar, DateSeance, 103) in (
> '25/06/2006','26/06/2006','27/06/2006')
>
>




Avatar
Yanos El Guerilleros
Christophe a écrit :
J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')





Salut,

Personnellement je n'ai pas la prétention de tout savoir sur MSSQL mais
j'utilise depuis des années les dates telles que tu les définis (ayant
travaillé notamment avec des serveurs des OS de différentes nationalités
c'est le seul format que ne me posait pas de problème).

Pour ce qui est de BETWEEN quand on regarde le plan d'exécution, MSSQL
le converti toujours en " a >= b AND a <= c ", chose que j'utilise
quotidiennement notamment pour calculer nos prévisions de fabrication,
ainsi que la charge de travail dans notre gestion de projet, et je n'ai
aucun souci sur mes dates (actuellement 200 intervenants sur 37 projets
actifs, programme qui fonctionne depuis 1 ans et demi).

En revanche je me demande si ton DBA ne fait référence au fait que quand
tu utilises des dates avec des champs qui peuvent contenir des heures là
en effet tu peux avoir des blagues où il te manque notamment les infos
sur la dernière date sur laquelle tu place ta condition, mais ce n'est
pas un dysfonctionnement, juste un problème de réflexion (a mes yeux en
tout cas ;) ).

La requête qu'il te fourni pars du principe que tu n'a que des dates
(sans heures) de plus elle doit être plus lente vu les conversions en
texte et la clause IN (et j'espère que tu n'a pas des plages sur 6 mois
sinon tu va te marrer pour la faire ta requête :D ).

A++

--
Yanos

Gazzzzzzzzzz
Avatar
Rudi Bruchez
Christophe a écrit:

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')



Bonjour,

Je préfère nettement la première requête, d'abord parce qu'elle exprime les
valeurs de date dans un format que SQL Server reconnaîtra toujours,
contrairement à la deuxième où l'expression de la date dépend de la
régionalisation du serveur (en tout cas pour le datesemaine '21/06/2006'), ensuite, parce que la recherche sur DateSeance permet
l'utilisation de l'index, ce qui n'est pas le cas dans la deuxième version.
Quand tu passes une colonne dans une fonction (et pourquoi en nvarchar ?),
SQL Server ne peut pas utiliser d'index.

Pour en avoir le coeur net, exécute ces deux requêtes après avoir activé
l'affichage du plan d'exécution (CTRL+K sur Query Analyzer), et après un
SET STATISTICS IO ON
pour voir les statistiques de pages lues par chaque requête.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
Christophe
je suis un peu d'accord mais je comprends mal comment il faut interpreter
les resultats !
je les mets peux tu m'expliquer comment dois-je les comprendre ?
Merci par avance !


Table maTable . Compte d'analyses 1, lectures logiques 5399,
lectures physiques 0, lectures anticipées 5037.
(548 row(s) affected)
(7 row(s) affected)

Table maTable . Compte d'analyses 8, lectures logiques 1886,
lectures physiques 64, lectures anticipées 1743.
(547 row(s) affected)
(11 row(s) affected)




"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:27k9trvuip8y$
Christophe a écrit:

> Pouvez vous me donner votre avis sur ces 2 requetes !
>
> Ma requete :
> SELECT count(*)
> FROM MaTable
> WHERE datesemaine = '20060621'
> AND DateSeance BETWEEN '20060625' AND '20060627'
>
>
> Ca requete ?
> SELECT count(*)
> FROM MaTable
> where datesemaine = '21/06/2006' and
> convert(nvarchar, DateSeance, 103) in (
> '25/06/2006','26/06/2006','27/06/2006')

Bonjour,

Je préfère nettement la première requête, d'abord parce qu'elle exprime


les
valeurs de date dans un format que SQL Server reconnaîtra toujours,
contrairement à la deuxième où l'expression de la date dépend de la
régionalisation du serveur (en tout cas pour le datesemaine > '21/06/2006'), ensuite, parce que la recherche sur DateSeance permet
l'utilisation de l'index, ce qui n'est pas le cas dans la deuxième


version.
Quand tu passes une colonne dans une fonction (et pourquoi en nvarchar ?),
SQL Server ne peut pas utiliser d'index.

Pour en avoir le coeur net, exécute ces deux requêtes après avoir activé
l'affichage du plan d'exécution (CTRL+K sur Query Analyzer), et après un
SET STATISTICS IO ON
pour voir les statistiques de pages lues par chaque requête.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/


Avatar
Christophe
j'ai le meme souci sur les plans d'execution je ne sais pas trop comment les
lire !

comment savoir si telle ou telle requete est plus rapide ou vois tu qu'il
transforme le between en >= et <
Merci !
oui y'a pas de grande periode heureusement !



"Yanos El Guerilleros" a écrit dans le message
de news:
Christophe a écrit :
> J'ai besoin de vos avis d'expertises sur SQL 2000
>
> le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
> microsoft dit que le between fonctionne mal avec les dates et que c'est
> super dependant de ton systeme de date : (pourtant j'ai bien passées les
> parametres en iso ?)
> sachant qu'en plus DateSeance est dans un index !
>
> Pouvez vous me donner votre avis sur ces 2 requetes !
>
> Ma requete :
> SELECT count(*)
> FROM MaTable
> WHERE datesemaine = '20060621'
> AND DateSeance BETWEEN '20060625' AND '20060627'
>
>
> Ca requete ?
> SELECT count(*)
> FROM MaTable
> where datesemaine = '21/06/2006' and
> convert(nvarchar, DateSeance, 103) in (
> '25/06/2006','26/06/2006','27/06/2006')
>
>

Salut,

Personnellement je n'ai pas la prétention de tout savoir sur MSSQL mais
j'utilise depuis des années les dates telles que tu les définis (ayant
travaillé notamment avec des serveurs des OS de différentes nationalités
c'est le seul format que ne me posait pas de problème).

Pour ce qui est de BETWEEN quand on regarde le plan d'exécution, MSSQL
le converti toujours en " a >= b AND a <= c ", chose que j'utilise
quotidiennement notamment pour calculer nos prévisions de fabrication,
ainsi que la charge de travail dans notre gestion de projet, et je n'ai
aucun souci sur mes dates (actuellement 200 intervenants sur 37 projets
actifs, programme qui fonctionne depuis 1 ans et demi).

En revanche je me demande si ton DBA ne fait référence au fait que quand
tu utilises des dates avec des champs qui peuvent contenir des heures là
en effet tu peux avoir des blagues où il te manque notamment les infos
sur la dernière date sur laquelle tu place ta condition, mais ce n'est
pas un dysfonctionnement, juste un problème de réflexion (a mes yeux en
tout cas ;) ).

La requête qu'il te fourni pars du principe que tu n'a que des dates
(sans heures) de plus elle doit être plus lente vu les conversions en
texte et la clause IN (et j'espère que tu n'a pas des plages sur 6 mois
sinon tu va te marrer pour la faire ta requête :D ).

A++

--
Yanos

Gazzzzzzzzzz


Avatar
Christian Robert
En fait la requête numéro 1 a plusieurs avantages :
- Le format de date est universel, quel que soit la langue utilisé par
l'utilisateur çà fonctionnera.
- L'utilisation en tant que tel du BETWEEN permettra l'utilisation d'un
éventuel index sur le champ DateSeance.

La requête numéro 2 a plusieurs problèmes elle :
- Sur datesemaine il faudrait impérativement changer et mettre celà :
convert(nvarchar, datesemaine, 103) = '21/06/2006' le format de date risquant
de poser problème. Le format idéal étant celui de la requête 1 en enlevant
les convert
- La fonction Convert sur 2 champs date enlève toute possibilité d'utiliser
des index dessus.

En fait au final le plus gros problème est que les 2 requêtes ne renverront
pas la même chose. En effet la 1ère revient à renvoyer toutes les dates entre
le 25 juin à minuit jusqu'au 27 juin à minuit, les 2 bornes étant incluses.
La 2ème renvient à renvoyer les dates du 25 juin à minuit, jusqu'au 27 juin à
23:59:59. et quelques ms... Ce qui, s'il existe une composante heure dans vos
valeurs de DateSeance va poser bcp de problèmes !

Pas de DATEDIFF non plus pour les même raisons que le CONVERT évoquées plus
haut.

J'espère avoir été clair...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"Christophe" a écrit :

J'ai besoin de vos avis d'expertises sur SQL 2000

le dba actuel me dit qu'il ne faut pas utiliser cette requete car meme
microsoft dit que le between fonctionne mal avec les dates et que c'est
super dependant de ton systeme de date : (pourtant j'ai bien passées les
parametres en iso ?)
sachant qu'en plus DateSeance est dans un index !

Pouvez vous me donner votre avis sur ces 2 requetes !

Ma requete :
SELECT count(*)
FROM MaTable
WHERE datesemaine = '20060621'
AND DateSeance BETWEEN '20060625' AND '20060627'


Ca requete ?
SELECT count(*)
FROM MaTable
where datesemaine = '21/06/2006' and
convert(nvarchar, DateSeance, 103) in (
'25/06/2006','26/06/2006','27/06/2006')





Avatar
Yanos El Guerilleros
> j'ai le meme souci sur les plans d'execution je ne sais pas trop comment les
lire !



C'est vrai que ce n'est pas forcément évident, et je ne suis pas
toujours à l'aise avec cela. Mais il y a sur chaque icône une info bulle
qui donne des infos sur notamment le nombre de lignes qui sont sorties
par chaque opération, etc... Il indique également le coût en ressource
par rapport à l'ensemble de la requête.

Dans le BOL il y a normalement une liste de chaque opérateurs et ce
qu'ils font.

Un jour j'étais tombé sur un site qui expliquait assez bien tout ca mais
je ne le retrouve plus :( il ne me reste que :

http://www.sqlservercentral.com/columnists/gvijayakumar/executionplans.asp
et également
http://www.sql-server-performance.com/transact_sql.asp
où ils indiquent que notamment le BETWEEN est parfois optimisé dans
certains cas par rapport au IN.


comment savoir si telle ou telle requete est plus rapide ou vois tu qu'il
transforme le between en >= et <


Quand tu affiche le plan dans l'analyseur de requête, il te donne avant
le graphique l'état de la requête, son coût sur l'ensemble des
instructions que tu viens de lancer, et surtout la commande complète
parfois déjà optimisée, mais sinon dans l'opérateur qui correspond à la
recherche tu vois les arguments et là tu vois les vraies expressions.

Et là tu peux voir ce qu'il fait, à partir de quand il change de
méthode, par exemple j'ai essayé d'appliquer sur une de mes tables ou la
date recherchée est la clé primaire, avec 3 dates ça se tiens, mais sur
un mois par exemple là l'optimiseur change complètement de méthode de
recherche et là la deuxième requête n'est même pas envisageable : elle
met 3 secondes pour retourner mes résultats car elle scan complètement
l'index ma table (~50000 tuples) dans un opérateur de filtrage, alors
que la première fait une recherche directe dans l'index.


Merci !
oui y'a pas de grande periode heureusement !



ouf :)


--
Yanos

Gazzzzzzzzzz
Avatar
Rudi Bruchez
Christophe a écrit:

Table maTable . Compte d'analyses 1, lectures logiques 5399,
lectures physiques 0, lectures anticipées 5037.
(548 row(s) affected)
(7 row(s) affected)

Table maTable . Compte d'analyses 8, lectures logiques 1886,
lectures physiques 64, lectures anticipées 1743.
(547 row(s) affected)
(11 row(s) affected)



Ce sont les statistiques de pages lues. Ce qui est intéressant ici est le
nombre de lectures logiques = nombre de pages lues par la requête (du
cache). Moins il y en a, et mieux c'est.

As-tu regardé le plan d'exécution ? Il est dans un onglet suplémentaire si
tu as fait le CTRL+K. Tu peux aussi faire un

SET SHOWPLAN_ALL ON
GO

avant de lancer les requêtes. Le plan s'affichera en texte.


--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
Christophe
Arf je vois bien la requete qu'il utilise mais il transforme rien c'est
exactement la meme ????
on voit meme les commentaires ?

j'ai essayé sous 2000 & 2005 pas mieux ?
plus pratique sous 2005 par contre !




"Yanos El Guerilleros" a écrit dans le message
de news:%23e5Q$

> j'ai le meme souci sur les plans d'execution je ne sais pas trop comment


les
> lire !

C'est vrai que ce n'est pas forcément évident, et je ne suis pas
toujours à l'aise avec cela. Mais il y a sur chaque icône une info bulle
qui donne des infos sur notamment le nombre de lignes qui sont sorties
par chaque opération, etc... Il indique également le coût en ressource
par rapport à l'ensemble de la requête.

Dans le BOL il y a normalement une liste de chaque opérateurs et ce
qu'ils font.

Un jour j'étais tombé sur un site qui expliquait assez bien tout ca mais
je ne le retrouve plus :( il ne me reste que :

http://www.sqlservercentral.com/columnists/gvijayakumar/executionplans.asp
et également
http://www.sql-server-performance.com/transact_sql.asp
où ils indiquent que notamment le BETWEEN est parfois optimisé dans
certains cas par rapport au IN.

>
> comment savoir si telle ou telle requete est plus rapide ou vois tu


qu'il
> transforme le between en >= et < >
Quand tu affiche le plan dans l'analyseur de requête, il te donne avant
le graphique l'état de la requête, son coût sur l'ensemble des
instructions que tu viens de lancer, et surtout la commande complète
parfois déjà optimisée, mais sinon dans l'opérateur qui correspond à la
recherche tu vois les arguments et là tu vois les vraies expressions.

Et là tu peux voir ce qu'il fait, à partir de quand il change de
méthode, par exemple j'ai essayé d'appliquer sur une de mes tables ou la
date recherchée est la clé primaire, avec 3 dates ça se tiens, mais sur
un mois par exemple là l'optimiseur change complètement de méthode de
recherche et là la deuxième requête n'est même pas envisageable : elle
met 3 secondes pour retourner mes résultats car elle scan complètement
l'index ma table (~50000 tuples) dans un opérateur de filtrage, alors
que la première fait une recherche directe dans l'index.

>
> Merci !
> oui y'a pas de grande periode heureusement !

ouf :)


--
Yanos

Gazzzzzzzzzz


1 2