2016-05-04 118 views
2

正如我以爲我在SSIS中獲得了不錯的成績。極慢的SSIS查詢

在SSIS包,我想用我的版本皮納爾Dave的XML計劃緩存查詢發現這裏: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/

我的版本只是增加了一個SELECT TOP 50的ORDER BY estimatedcost DESC。

我的查詢:

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; 

在SSMS此查詢的子系統30的第二範圍運行,但是當我在SSIS包的執行它,它需要3-4個小時才能完成,如果維護之前完成所有勝過它。

當服務器負載非常小時,SSIS包在晚上執行,然後將結果導出到CSV文本文件。

該包似乎做得很好,直到它執行查詢,然後它只是掛起幾個小時。

服務器統計: 服務器2008(64位) SQL服務器2008R2(64位) 24 GB RAM(16到SQL,8至OS) E5620 @ 2.4GHz的(2個進程)

編輯:
我試過的東西:

- 將輸出寫入全局臨時表(和常規表),然後查詢該表的輸出。
- 在SSIS包中,創建並執行一個存儲過程,並將查詢輸出到臨時表(和常規表),然後查詢該表以獲取輸出。

+0

有可能SSIS包沒有足夠的內存來分配緩衝區,因此它必須從表中非常緩慢地接受數據。我建議你將數據加載到垃圾目的地,這將排除CSV目標,問題 –

+0

另外,當你在SSMS中運行這個時,你是否等待所有50條記錄到達? –

+0

@ Nick.McDermaid:我試圖通過將輸出寫入全局臨時表和常規表來加快速度,但沒有任何明顯的速度變化。是的,我正在等待所有50條記錄到達。我會用這個信息更新我的帖子。 – DBADon

回答

1

如果您確定查詢沒有花費時間。

1)建立SP

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

b) create TABLE (SAME unique name) 

c) INSERT the result into the table 

2創建SSIS包

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 . 

根據您的問題查詢執行速度非常快SSMS中,和你正在做的結果進行任何改造在ssis中設置。

嘗試BCP輸出指令

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

+0

我嘗試了你提出的建議,並且我沒有看到速度增益。我已更新我的原始文章以包含您的建議。謝謝! – DBADon

+0

按照您的問題查詢執行非常快,SSMS。而你正在做的結果集進行任何改造,嘗試BCP輸出指令https://msdn.microsoft.com/en-IN/library/ms162802.aspx –

+0

它看起來像我過於複雜的事情。您的BCP理念在簡單性方面非常出色。謝謝! – DBADon

0

的另一種方式,你可以創建多個臨時表和過程中的每個連接和數據轉儲到表..終於在臨時表保持整個數據集 你可以使用SSIS sql任務執行此任務

+0

正如你所建議的那樣,我會嘗試把所有東西都分解成單獨的表格然後合併。我會盡快更新,並重新嘗試。謝謝! – DBADon