极慢的SSIS查询

时间:2016-05-04 01:08:23

标签: sql sql-server ssis sql-server-2008-r2

正如我以为我的SSIS变得越来越好。

在SSIS包中,我正在尝试使用我在此处找到的Pinal 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/

我的版本只添加了带有ORDER BY估计成本DESC的SELECT TOP 50。

我的查询:

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文本文件。

该软件包似乎可以正常运行,直到它执行查询,然后它会挂起几个小时。

服务器统计信息: Server 2008(64位) SQL Server 2008R2(64位) 24 GB RAM(16到SQL,8到OS) E5620 @ 2.4 GHz(2个触发器)

编辑:
我尝试过的事情:

- 将输出写入全局临时表(和常规表),然后查询该表以获取输出。
- 在SSIS包中,使用输出到临时表(和常规表)的查询创建然后执行存储过程,然后查询该表以获取输出。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

另一种方法是,您可以创建多个临时表并处理每个连接并将数据转储到表中。最后,最后一个临时表包含整个数据集   您可以使用SSIS sql任务执行此任务