Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Merci pour vos avis.
Martin.
tintin a écrit :
> Bonjour,
>
> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
> parait normal.
>
> Si une requête absolument identique est utilisée par une fonction, et que je
> lance cette fonction, je vois qu'elle traite la table séquentiellement
> (Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...
>
> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>
> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>
> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
> paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.
>
> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.
>
> Merci pour vos avis.
>
> Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Bonjour,
>
> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
> parait normal.
>
> Si une requête absolument identique est utilisée par une fonction, et que je
> lance cette fonction, je vois qu'elle traite la table séquentiellement
> (Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...
>
> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>
> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>
> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
> paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.
>
> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.
>
> Merci pour vos avis.
>
> Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Bonjour,
>
> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
> parait normal.
>
> Si une requête absolument identique est utilisée par une fonction, et que je
> lance cette fonction, je vois qu'elle traite la table séquentiellement
> (Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...
>
> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>
> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>
> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
> paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.
>
> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.
>
> Merci pour vos avis.
>
> Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
"SQLpro [MVP]" a écrit :tintin a écrit :Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.Merci pour vos avis.
Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
"SQLpro [MVP]" a écrit :
tintin a écrit :
Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...
Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.
Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.
Merci pour vos avis.
Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
"SQLpro [MVP]" a écrit :tintin a écrit :Bonjour,
Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
parait normal.
Si une requête absolument identique est utilisée par une fonction, et que je
lance cette fonction, je vois qu'elle traite la table séquentiellement
(Constant Scan)
Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
Dans quelle clause de quel ordre SQL...Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
pratiquement impossible d'utiliser les fonctions pour extraire des données.
Avez-vous déja observé cela, ou bien est-ce que je délire ?
Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
paramètre ou autre réglage pour éviter cela ?
Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
pour pouvoir bénéficier des recherches sur index.Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
Il ne s'agit pas d'un problème, mais d'un comportement normal.Merci pour vos avis.
Martin.
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
programmation.
Quand vous avez des centaines de procédures stockées qui recherchent la même
donnée, il est logique de rechercher à mettre en commun le traitement et on
pourait penser que les UDF sont faites pour cela.
Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
inutilisables en pratique.
La documentation devrait au moins avertir de ces restrictions.
Dommage.
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
tintin a écrit :
> Non, je ne trouve ni normal, ni évident, qu'on ne puisse pas structurer sa
> programmation.
>
> Quand vous avez des centaines de procédures stockées qui recherchent la même
> donnée, il est logique de rechercher à mettre en commun le traitement et on
> pourait penser que les UDF sont faites pour cela.
>
> Mais si leur efficacité "dépend" (on ne sait de quoi), les UDF sont
> inutilisables en pratique.
>
> La documentation devrait au moins avertir de ces restrictions.
L'activation de l'index à de tout temps nécessité que la clause soit
SARGeable (Search ARGument) ! C'est dans les cours sur l'optimisation
des bases de données depuis les années 70 !!!
Extrait de la doc MS :
"
Un argument de recherche (SARG) restreint une recherche, car il spécifie
une concordance exacte, une plage de valeurs ou un ensemble de deux
éléments ou davantage réunis par un opérateur AND. Il peut prendre une
des formes suivantes :
* Colonne opérateur <constante ou variable>
* <constante ou variable> opérateur Colonne
Les opérateurs SARG comprennent =, >, <, >=, <=, IN, BETWEEN et parfois
LIKE (dans les cas des concordances des préfixes, tels que LIKE
'John%'). Un argument SARG peut contenir plusieurs conditions réunies
par un opérateur AND. Il peut s'agir d'une requête qui correspond à une
valeur spécifique, telle que :
* "Customer ID" = 'ANTON'
* 'Doe' = "Last Name"
Il peut également s'agir d'une requête qui correspond à une plage de
valeurs, telle que :
* "Order Date" > '1/1/2002'
* "Customer ID" > 'ABCDE' AND "Customer ID" < 'EDCBA'
* "Customer ID" IN ('ANTON', 'AROUT')
Une expression qui n'utilise pas d'opérateurs SARG n'améliore en aucun
cas les performances, car le processeur de requêtes doit évaluer chaque
ligne pour déterminer si elle répond à la clause de filtre. Pour cette
raison, un index est inutile sur des expressions qui n'utilisent pas des
opérateurs SARG. Les opérateurs non-SARG comprennent NOT, <>, NOT
EXISTS, NOT IN, NOT LIKE et des fonctions intrinsèques.
"
NOTA : fonctions intrinsèques = UDF.
A +
>
> Dommage.
>
>
>
> "SQLpro [MVP]" a écrit :
>
>> tintin a écrit :
>>> Bonjour,
>>>
>>> Sous SQL-SERVER 2000, j'exécute une requête sous Query Analyser et je vois
>>> dans le plan d'exécution qu'elle utilise un index (Index Seek), comme cela
>>> parait normal.
>>>
>>> Si une requête absolument identique est utilisée par une fonction, et que je
>>> lance cette fonction, je vois qu'elle traite la table séquentiellement
>>> (Constant Scan)
>> Tout à fait normal. Mais cela dépend d'ou vous utiliser votre fonction.
>> Dans quelle clause de quel ordre SQL...
>>
>>> Je trouve cela très surprenant et ennuyeux... Cela signifie qu'il est
>>> pratiquement impossible d'utiliser les fonctions pour extraire des données.
>>>
>>> Avez-vous déja observé cela, ou bien est-ce que je délire ?
>>>
>>> Serait-ce systématique avec les fonctions, ou bien est-ce qu'il y a un
>>> paramètre ou autre réglage pour éviter cela ?
>> Certaines fonctions peuvent d'ailleurs être transformées ou encapsulées
>> pour pouvoir bénéficier des recherches sur index.
>>
>>> Est-ce que ce problème est résolu sous SQL-SERVER 2005 ?
>> Il ne s'agit pas d'un problème, mais d'un comportement normal.
>>
>>> Merci pour vos avis.
>>>
>>> Martin.
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
>> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>> ********************* http://www.datasapiens.com ***********************
>>
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************