|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Bonjour,
Je possède une table qui me donne les statistiques d'ouvertures d'e-mails envoyés à mes clients Code :
Code :
PS : Je suis actuellement sous SQL Server 2000 |
||||
|
00
|
|
|
#2 | ||||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Une solution serait la suivante :
Création d'une vue V_SEG_JOUR Code :
Code :
Après, je travaille sur un volume d'environ 960 000 lignes et je dois faire cela aussi pour la tranche horaire (plus d'autres indicateurs du même acabit) et je pense optimisation, optimisation (à mon humble maîtrise du SQL). |
||||
|
00
|
|
|
#3 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
C'est bien dommage, car à partir de la version 2005, votre problème n'en serait plus un
Quel comportement attendez vous en cas d'ex aequo ? (edit : je vois que vous vous etes posé la même question, mais visiblement vous n'avez pas la réponse |
|
|
00
|
|
|
#4 | ||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
A mon sens on pourra prendre dans l'ordre croissant du numéro de jour, le jour "le plus petit".
Une solution : Code :
|
||
|
00
|
|
|
#5 | ||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Gros souci de performances pour le coup avec la requête suivante :
Code :
L'optimiseur m'indique un coup important sur des SORT (liés, je suppose, aux GROUP BY) et sur Index Spool/Eager Spool (quid ?) |
||
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Déjà mettre des NOLOCK partout est une aberration. Ceci est anormal, alors que la norme consisterais tout simplement à lancer un SET ISOLATION TRANSACTION LEVEL READ UNCOMMITTED...
Ensuite tout dépend des index que vous avez dans la table. Postez le DDL de vos tables avec le DDL de TOUS les index des tables. 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
|
|
|
#7 | ||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Bonjour,
Pour les NOLOCK je ne savais pas. Il y a 10 lorsque je suis arrivé dans la boîte on m'a dit qu'il fallait impérativement mettre des NOLOCK partout, du coup bête et discipliné comme je suis j'ai appliqué la rêgle de l'entreprise à la lettre... Code :
|
||
|
00
|
|
|
#8 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Citation:
Pas d'index cluster sur la table ... Vos bases de données auraient-elle des problèmes de conception, et par là-même de performances ? @++
__________________
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
|
|
|
#9 |
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Nos bases de données datent de 20 ans et sont une transcription d'une base qui à l'époque était sous VAX (je n'étais pas encore arrivé, je n'ai "que" 10 ans et suis loin d'être expert SQL... Je prends note de l'information. Dois-je mettre en cluster index l'e-mail (ce qui me semble le plus pertinent) ?
Merci du conseil, maintenant en 20 min. j'ai mes résultats ! Ca parait magique quand on est néophyte... |
|
00
|
|
|
#10 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Non, le mieux serait de rajouter une colonne clef primaire ou index cluster unique en autoincrément.
Puis réindexer Code :
Merci de postez ces vues.... Avec cela, et un peu de RAM on devrait tomber à quelques secondes. 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
|
|
|
#11 | ||
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
V_ESEG3 et V_ESEG4 sont des vues :
Code :
|
||
|
00
|
|
|
#12 | |||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Citation:
En effet SQL Server maintient des statistiques de distribution des valeurs dans la colonne TIME. Mais il ne peut pas maintenir de statistiques sur le mois, le jour, le seconde, ... de chacune des date qui sont stockées dans cette colonne ! Et encore moins sur une différence en mois avec la date courante Votre prédicat conduit donc SQL Server à scanner toute la table, pour calculer la différence, et retourner seulement les lignes qui vérifient le prédicat. En revanche, si vous écrivez : Code :
WHERE [TIME] >= DATEADD(month, -6, GETDATE()) De la même façon vous calculez des groupes sur la valeur suivante : Citation:
On aurait pu en faire une colonne calculée (ce qui est possible même si la fonction n'est pas déterministe) mais pas l'indexer. Il vous faudrait donc : - au moment de l'insertion, calculer le jour de la semaine, puis réaliser l'insertion, c'est-à-dire modifier l'applicatif - ou ajouter un trigger sur la table pour peupler une colonne supplémentaire et l'indexer. Je vous invite à lire ce petit billet Mais je ne crois pas que ce soit nécessaire dans votre cas. Un index sur les colonnes TIME + TYPE devrait être suffisamment sélectif. Enfin, en ce qui concerne NOLOCK, il vous amène à lire la table sur laquelle vous avez mis cet indicateur sous le niveau d'isolation de transaction READ UNCOMMITTED. Sous ce niveau de transaction, chaque ligne vérifiant le prédicat de la requête est verrouillée le temps qu'elle soit lue ... mais pas tout le temps de la requête ! Donc si vous êtes en train d'exécuter une requête, et que dans le même temps je fais un UPDATE sur toute le table, vous allez en fait lire des données qui ne sont pas encore validées. Si mon UPDATE plante pour une quelconque raison, vous aurez donc lu des données qui sont fausses ! Vos collègues en sont friands parce que les verrous sont donc maintenus pour une durée très courte, ce qui augmente la concurrence d'accès à la table ... mais diminue la qualité des données ! Je vous invite à lire la documentation à ce sujet. Vous pouvez mettre les liens vers la documentation dans vos favoris ou télécharger celle-ci à partir des liens de ma signature. Citation:
Ou tu voulais dire ALTER INDEX ALL ON dbo.maTable REBUILD ? @++
__________________
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
|
|
|
#13 |
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Concernant mon problème actuelle, la table est/sera mise à jour une fois par jour au maximum, et mon calcul se fera hebdomadairement, donc je pense que le NOLOCK est sans "danger". Merci pour ces précieux conseils cependant ! Je vais les appliquer sans tarder !
|
|
00
|
|
|
#14 | ||||||||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Essayez avec ça :
Code :
Code :
Code :
Code :
Code :
Code :
Explication : les vues indexées, ça sert à ça !!! A lire sur le sujet : http://sqlpro.developpez.com/optimisation/indexation/ 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
|
|
|
#15 |
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Effectivement je n'aurais pas pu trouver ça tout seul...
Merci de ces conseils ! |
|
00
|
|
|
#16 |
|
Futur Membre du Club
![]() Stéphane BouvetChef de projet MOA Inscription : mai 2011 Messages : 40 ![]() |
Euh, question, pourquoi :
AN * 12 + (MOIS - 1) et pas AN * 100 + MOIS ? |
|
00
|
|
|
#17 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
As you like, cela devrait revenir au même, mais être plus lisible !
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
|
Copyright © 2000-2012 - www.developpez.com