2016-05-04 78 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