2016-05-04 4 views
2

So wie ich dachte, dass ich mit SSIS gut wurde.Extrem langsame SSIS-Abfrage

Innerhalb eines SSIS-Pakets, ich versuche, meine Version von Pinal Dave XML-Plan Cache Abfrage Sie hier zu verwenden: http://blog.sqlauthority.com/2009/03/17/sql-server-practical-sql-server-xml-part-one-query-plan-cache-and-cost-of-operations-in-the-cache/

Meine Version kommt noch hinzu, eine SELECT TOP 50 mit einer ORDER BY estimatedcost DESC.

Meine Frage:

WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan'), 
CachedPlans 
(
ParentOperationID, 
OperationID, 
PhysicalOperator, 
LogicalOperator, 
EstimatedCost, 
EstimatedIO, 
EstimatedCPU, 
EstimatedRows, 
PlanHandle, 
QueryText, 
QueryPlan, 
CacheObjectType, 
ObjectType) 
AS 
(
SELECT 
RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID, 
RelOp.op.value(N'@NodeId', N'int') AS OperationID, 
RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator, 
RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator, 
RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost, 
RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO, 
RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU, 
RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows, 
cp.plan_handle AS PlanHandle, 
st.TEXT AS QueryText, 
qp.query_plan AS QueryPlan, 
cp.cacheobjtype AS CacheObjectType, 
cp.objtype AS ObjectType 
FROM sys.dm_exec_cached_plans cp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp 
CROSS APPLY qp.query_plan.nodes(N'//RelOp') RelOp (op) 
) 
SELECT TOP 50 
PlanHandle, 
ParentOperationID, 
OperationID, 
PhysicalOperator, 
LogicalOperator, 
QueryText, 
CacheObjectType, 
ObjectType, 
EstimatedCost, 
EstimatedIO, 
EstimatedCPU, 
EstimatedRows 
FROM CachedPlans 
WHERE CacheObjectType = N'Compiled Plan' 
ORDER by estimatedcost desc; 

In SSMS diese Abfrage wird im Sub 30 Sekunden Bereich, aber wenn ich es in dem SSIS-Paket ausführen dauert es 3-4 Stunden in Anspruch nehmen, wenn es vor der Wartung überhaupt abgeschlossen übertrumpft es.

Das SSIS-Paket wird nachts ausgeführt, wenn der Server nur wenig belastet wird, und exportiert dann die Ergebnisse in eine CSV-Textdatei.

Das Paket scheint in Ordnung zu sein, bis es zur Ausführung der Abfrage kommt und es dann einfach stundenlang hängt.

Server-Statistik: Server 2008 (64 Bit) SQL Server 2008R2 (64 bit) 24 GB RAM (16 bis SQL, 8 bis O) E5620 @ 2,4 GHz (2 Procs)

Edit:
Dinge, die ich versucht habe:

--Writing die Ausgabe zu einer globalen Temp-Tabelle (und eine reguläre Tabelle) und dann diese Tabelle für die Ausgabe abfragen.
- Innerhalb des SSIS-Pakets wird eine gespeicherte Prozedur mit der Abfrage erstellt und dann ausgeführt, die in eine temporäre Tabelle (und eine reguläre Tabelle) ausgegeben wird. Anschließend wird diese Tabelle für die Ausgabe abgefragt.

+0

Es ist möglich, das SSIS-Paket nicht genügend Speicher, um Puffer zuzuordnen, so dass es die Daten sehr langsam aus der Tabelle akzeptieren muss. Ich schlage vor, Sie laden die Daten zu einem Papierkorb Ziel, und dies wird das CSV-Ziel als das Problem ausschließen –

+0

Auch, wenn Sie dies in SSMS ausführen, warten Sie auf alle 50 Datensätze ankommen? –

+0

@ Nick.McDermaid: Ich habe versucht, die Dinge zu beschleunigen, indem Sie die Ausgabe sowohl auf globale temporäre Tabellen als auch auf reguläre Tabellen ohne erkennbare Änderung der Geschwindigkeit schreiben. Ja, ich warte auf alle 50 Einträge.Ich werde meinen Beitrag mit diesen Informationen aktualisieren. – DBADon

Antwort

1

Wenn Sie sicher sind, dass die Abfrage keine Zeit braucht.

1) erstellen SP

a) if exit drop the table (Think a unique name) 

b) create TABLE (SAME unique name) 

c) INSERT the result into the table 
SSIS-Paket erstellen
a) Call the sp in execute sql task 

    b) Create data flow select all data from the table (created in sp) and dump in cSV using flat file destination . 

oder

Wie pro Ihre Frage Abfrage führt sehr schnell in SSMS, und Sie tun, jede Transformation auf Ergebnis eingestellt in ssis.

Try BCP Ausgabebefehl

https://msdn.microsoft.com/en-IN/library/ms162802.aspx

+0

Ich habe die Dinge, die Sie vorgeschlagen haben versucht, und ich habe nicht einen Gewinn an Geschwindigkeit gesehen. Ich habe meinen ursprünglichen Beitrag aktualisiert, um Ihre Vorschläge hinzuzufügen. Vielen Dank! – DBADon

+0

Nach Ihrer Frage Abfrage führt sehr schnell in ssms. Und Sie tun keine Transformation auf Ergebnismenge, versuchen Sie BCP Ausgabebefehl https://msdn.microsoft.com/en-IN/library/ms162802.aspx –

+0

Es sieht aus wie ich war über Dinge komplizieren. Ihre BCP-Idee ist brillant in ihrer Einfachheit. Vielen Dank! – DBADon

0

Als eine andere Art und Weise können Sie mehrere temporäre Tabellen erstellen und jeder Prozess verbinden und die Daten in der Tabelle Dump .. schließlich letzte temporäre Tabelle den gesamten Datensatz halten Sie kann diese Aufgabe mit der SSIS-SQL-Aufgabe

+0

Wie Sie vorschlagen, werde ich versuchen, alles in separate Tabellen zu brechen und dann zu kombinieren. Ich werde updaten sobald ich das neu schreiben und ausprobieren kann. Vielen Dank! – DBADon