|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre expérimenté
![]() Inscription : septembre 2007 Messages : 1 090 ![]() |
Bonjour j'ai une vue avec une requete faisant des jointures sur presque toutes les tables de la base (20) et elle dure 10 minutes á executer.
Je voulais savoir s'il existait une solution pour rendre la vue plus rapide par rapport á ces 10 minutes |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
il existe certainement un moyen, je dirai même qu'il en existe surement plusieurs. Mais pour cela, il faudrait qu'on ait au moins la définition de la vue. La façon dont vous interrogez la vue ensuite peut également jouer. si, "pour tester", vous faites un SELECT * FROM MaVue, il est évident que cela mettra plus de temps que si vous sélectionnez seulement les colonnes nécessaires, et que vous filtrez également au maximum. Donnez nous un peu plus d'info sur votre vue et ce que vous voulez faire |
|
|
00
|
|
|
#3 | ||
|
Membre expérimenté
![]() Inscription : septembre 2007 Messages : 1 090 ![]() |
les champs a afficher sont bien précis.
Cette vue est utilisée pour pouvoir faire une table pivot sous excel. voici la requete si cela peut vous aider. Code :
|
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
Il vous reste à nous communiquer votre version de bd, la volumétrie, la DDL des tables, les indexes et le plan d’exécution...
http://www.developpez.net/forums/d96...vement-poster/
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|
|
00
|
|
|
#5 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Il est impossible d'optimiser cette vue sans savoir : - quelles sont les requêtes qui l'utilisent, et leur plan d'exécution - quels sont les index sur les tables qui participent à la requête. Après un petit débroussaillage, on obtient : Code :
@++
__________________
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
|
|
|
#6 |
|
Membre expérimenté
![]() Inscription : septembre 2007 Messages : 1 090 ![]() |
Malheureusement je ne sais pas ce qu'est un plan de requete.
Tout ce que je sais, c'est que cette vue est utilisée par excel afin de générer une table Pivot. Les index ont été placé sur chaque clé (id) et sur 2-3 et sur toutes les foreign-key. En esperant que cela vous ai aidé ? |
|
|
00
|
|
|
#7 |
|
Membre expérimenté
![]() Inscription : septembre 2007 Messages : 1 090 ![]() |
j'oubliais SQLserver 2005 express
|
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() |
Vous pouvez executer ceci :
Code :
Code :
<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.0.1600.22"><BatchSequence><Batch><Statements><StmtSimple StatementText="exec [dbo].[Bon_Reception_SelectByDep_Design] 'BOPAKA'
" StatementId="1" StatementCompId="1" StatementType="EXECUTE PROC"><StoredProc ProcName="dbo.Bon_Reception_SelectByDep_Design"><Statements><StmtSimple StatementText="CREATE procedure [dbo].[Bon_Reception_SelectByDep_Design]
	@dep_design varchar(50)
as
begin
	select UserName as Rec_UserID,Rec_id,Rec_Ref,Rec_date,dep_design
	from dbo.Bon_Reception B left 
		Join dbo.aspnet_Users U On B.Rec_UserID=U.UserID
		join Depot D on D.Dep_id=B.Dep_id
		order by rec_id

" StatementId="2" StatementCompId="3" StatementType="SELECT" StatementSubTreeCost="0.0101501" StatementEstRows="2" StatementOptmLevel="FULL" QueryHash="0xB9446B0E170F9F39" QueryPlanHash="0x616A7531F7FFD3CF" StatementOptmEarlyAbortReason="GoodEnoughPlanFound"><StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/><QueryPlan CachedPlanSize="24" CompileTime="31" CompileCPU="31" CompileMemory="168"><RelOp NodeId="0" PhysicalOp="Nested Loops" LogicalOp="Left Outer Join" EstimateRows="2" EstimateIO="0" EstimateCPU="4.18e-005" AvgRowSize="322" EstimatedTotalSubtreeCost="0.0101501" Parallel="0" EstimateRebinds="0" EstimateRewinds="0"><OutputList><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_id"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_Ref"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_date"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserName"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" Alias="[D]" COLUMN="Dep_design"/></OutputList><NestedLoops Optimized="0"><Predicate><ScalarOperator ScalarString="[DB_STOCK].[dbo].[Bon_Reception].[Rec_UserID] as [B].[Rec_UserID]=[DB_STOCK].[dbo].[aspnet_Users].[UserId] as [U].[UserId]"><Compare CompareOp="EQ"><ScalarOperator><Identifier><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_UserID"/></Identifier></ScalarOperator><ScalarOperator><Identifier><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserId"/></Identifier></ScalarOperator></Compare></ScalarOperator></Predicate><RelOp NodeId="1" PhysicalOp="Nested Loops" LogicalOp="Inner Join" EstimateRows="2" EstimateIO="0" EstimateCPU="8.36e-006" AvgRowSize="80" EstimatedTotalSubtreeCost="0.00673376" Parallel="0" EstimateRebinds="0" EstimateRewinds="0"><OutputList><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_id"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_Ref"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_date"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_UserID"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" Alias="[D]" COLUMN="Dep_design"/></OutputList><NestedLoops Optimized="0"><OuterReferences><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Dep_id"/></OuterReferences><RelOp NodeId="2" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="2" EstimateIO="0.003125" EstimateCPU="0.0001592" AvgRowSize="58" EstimatedTotalSubtreeCost="0.0032842" TableCardinality="2" Parallel="0" EstimateRebinds="0" EstimateRewinds="0"><OutputList><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_id"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_Ref"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_date"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_UserID"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Dep_id"/></OutputList><IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" NoExpandHint="0"><DefinedValues><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_id"/></DefinedValue><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_Ref"/></DefinedValue><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_date"/></DefinedValue><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Rec_UserID"/></DefinedValue><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Dep_id"/></DefinedValue></DefinedValues><Object DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" INDEX="[PK__Bon_Rece__81BFDDA25FB337D6]" Alias="[B]" IndexKind="Clustered"/></IndexScan></RelOp><RelOp NodeId="3" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="36" EstimatedTotalSubtreeCost="0.0034412" TableCardinality="9" Parallel="0" EstimateRebinds="0" EstimateRewinds="1"><OutputList><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" Alias="[D]" COLUMN="Dep_design"/></OutputList><IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" NoExpandHint="0"><DefinedValues><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" Alias="[D]" COLUMN="Dep_design"/></DefinedValue></DefinedValues><Object DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" INDEX="[PK__Depot__0C2841550425A276]" Alias="[D]" IndexKind="Clustered"/><SeekPredicates><SeekPredicateNew><SeekKeys><Prefix ScanType="EQ"><RangeColumns><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Depot]" Alias="[D]" COLUMN="Dep_id"/></RangeColumns><RangeExpressions><ScalarOperator ScalarString="[DB_STOCK].[dbo].[Bon_Reception].[Dep_id] as [B].[Dep_id]"><Identifier><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[Bon_Reception]" Alias="[B]" COLUMN="Dep_id"/></Identifier></ScalarOperator></RangeExpressions></Prefix></SeekKeys></SeekPredicateNew></SeekPredicates></IndexScan></RelOp></NestedLoops></RelOp><RelOp NodeId="4" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="5" EstimateIO="0.0032035" EstimateCPU="8.4e-005" AvgRowSize="283" EstimatedTotalSubtreeCost="0.0033715" TableCardinality="5" Parallel="0" EstimateRebinds="0" EstimateRewinds="1"><OutputList><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserId"/><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserName"/></OutputList><IndexScan Ordered="0" ForcedIndex="0" NoExpandHint="0"><DefinedValues><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserId"/></DefinedValue><DefinedValue><ColumnReference DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" Alias="[U]" COLUMN="UserName"/></DefinedValue></DefinedValues><Object DATABASE="[DB_STOCK]" Schema="[dbo]" TABLE="[aspnet_Users]" INDEX="[aspnet_Users_Index]" Alias="[U]" IndexKind="Clustered"/></IndexScan></RelOp></NestedLoops></RelOp></QueryPlan></StmtSimple></Statements></StoredProc></StmtSimple></Statements></Batch></BatchSequence></ShowPlanXML>
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
||
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Un plan de requête est ce que SQL Server calcule avant d'exécuter pour la première fois une requête, de façon à l'exécuter le plus rapidement possible. Il est exposé : 1. soit comme vous le propose WOLO Laurent, ce qui sera pour nous le meilleur moyen de vous aider 2. soit en activant la capture du plan d'exécution réel : ![]() qui montre le plan d'exécution sous forme graphique. En effectuant un clic-droit sur celui-ci, vous pouvez le sauvegarder comme document XML 3. soit sous forme d'un document XML, comme en 1., à l'aide de la vue sys.dm_exec_query_plans @++
__________________
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
|
|
|
#10 |
![]() ![]() ![]() |
Sauf que tortuegenie ne réagit plus.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
1) les règles d'intégrité référentielles ont-elles toutes été mise en place (contraintes Foreign Key) ?
2) pouvez vous remplacer cette table par une vue indexée ? (dans ce cas, ajouter les préfixes de schéma des tables que vous avez oublié, et créez là en schéma binding.) 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 * * * * * |
|
10
|
|
|
#12 | ||
|
Membre Expert
![]() |
+1 pour le point 1...
Citation:
Citation:
La question est: a quelle fréquence est utilisée cette vue? Les données ciblées sont'elle temps réel ou peut'on prévoir une solution avec un différé de 6/12 heures par exemple (OLAP mis à jour tous les X heures?...). Enfin, la requête est'elle lourde à exécuter ou longue à afficher? si vous rapatriez 1 giga de données par le réseau une vue indexée ne vous fera pas gagner grand chose, le coût n’étant pas imputable à la requête mais au rapatriement des données par le réseau etc (bon ok 10 minutes ça fait beaucoup mais quel est la qualité du réseau?).
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com