|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Bonjour à tous,
Je découvre dans un système décisionnel, pour alimenter un cube, des requête qui permettent de transformer les champs NULL d'une tables par des -1. La vue fait un SELECT de tous les champs en ajoutant, presque pour chacun : ISNULL(MonChamp, -1) AS MonChamp. Mettant de côté l'aspect "propre" de la chose, est-ce que cela a un impact particulier ? Je parle de tables de faits de plusieurs millions de lignes interrogées sans filtre tous les jours.
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 958 ![]() |
Toute fonction entraîne un surcoût qui est loin d'être négligeable. D'autant plus qu'il faut s'interroger sur la structure de stockage qui peut avoir utilisé le principe des "sparse columns".
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Pour la structure de la table, je préfère ne pas en parler... une grande partie n'a même pas d'index cluster, que ce soit sur une PK ou une combinaison de FK.
Ce surcoût, est-il mesurable "facilement" si ce n'est en exécutant 2 fois la requête, avec et sans. le problème étant que les tables sont particulièrement volumineuses et sont interrogées sans aucun filtre. Ce surcoût est-il proportionnel au volume ? s'appliquant sur chacune des lignes je dirai oui mais bon... il pourrait se noyer dans la masse.
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 958 ![]() |
Il est difficile d'évaluer le surcout sans faire des tests. En effet, une fonction étant généralement non "sargable" le plan de requête peut être très différent suivant l'utilisation ou non de ladite fonction.
En bref, le rapport entre les deux requêtes peut aller bien plus loin que le double du coût ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#5 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Merci pour ces précisions Frédéric.
Je ferais donc des tests grandeur nature quand un serveur sera un peu plus disponible. Effectivement, comme cela ils gagnent potentiellement beaucoup de place dans leurs tables de fait, mais ils perdent potentiellement beaucoup de temps au traitement du cube (+ de 13h actuellement pour 48Go)...
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Citation:
- INNER JOIN dbo.uneTable AS T ON T.uneColonne = ISNULL(S.une_colonne, -1) - WHERE ISNULL(T.uneColonne, 0) = 0 Cela entraînera effectivement un surcoût, mais il sera négligeable. Dans le cas où le ISNULL() fait partie d'une prédicat, il est impossible pour SQL Server d'estimer combien de lignes dans la table vont vérifier le prédicat, donc il est au mieux obligé de lire tout un index, au pire de scanner toute la table ... @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#7 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Effectivement, je parle bien de cas où la fonction ne fait partir d'aucun prédicat, simplement dans le Select.
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() |
Citation:
En revanche le surcoût peu être intéressant à quantifier dans des cas de requête faisant intervenir un DISTINT, un GROUP BY? Comme le dit SQL PRO, le mieux dans votre cas est de tester
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com