SSIS任务的索引优化

时间:2009-08-20 17:53:00

标签: sql sql-server ssis indexing performance

我正在使用SSIS在我的仓库中加载表格。由于我的SSIS很慢,所以在表格上构建索引似乎是一个好主意。

此仓库中没有主键(因此,外键),索引(群集或其他),约束。换句话说,它是100%无效率的。

我们将根据使用情况放置索引 - 通过分析新查询和当前查询性能。

因此,我没有采用老式的汗水和咕噜咕噜的方式来实际阅读SQL语句和执行计划,而是认为我会使用闪亮的新数据库引擎优化顾问。

我在我的SSIS包中关闭了SQL日志并运行了“Tuning”跟踪,将其保存到表中并分析了Tuning Advisor中的输出。大多数查找都是以:

完成的

exec sp_executesql N'SELECT [Active], [CompanyID], [CompanyName], [CompanyShortName], [CompanyTypeID], [HierarchyNodeID] FROM [dbo].[Company] WHERE ([CompanyID]=@P1) AND ([StartDateTime] IS NOT NULL AND [EndDateTime] IS NULL)',N'@P1 int',1

exec sp_executesql N'SELECT [Active], [CompanyID], [CompanyName], [CompanyShortName], [CompanyTypeID], [HierarchyNodeID] FROM [dbo].[Company] WHERE ([CompanyID]=@P1) AND ([StartDateTime] IS NOT NULL AND [EndDateTime] IS NULL)',N'@P1 int',2

exec sp_executesql N'SELECT [Active], [CompanyID], [CompanyName], [CompanyShortName], [CompanyTypeID], [HierarchyNodeID] FROM [dbo].[Company] WHERE ([CompanyID]=@P1) AND ([StartDateTime] IS NOT NULL AND [EndDateTime] IS NULL)',N'@P1 int',3

exec sp_executesql N'SELECT [Active], [CompanyID], [CompanyName], [CompanyShortName], [CompanyTypeID], [HierarchyNodeID] FROM [dbo].[Company] WHERE ([CompanyID]=@P1) AND ([StartDateTime] IS NOT NULL AND [EndDateTime] IS NULL)',N'@P1 int',4

并且在分析时,这些语句的原因是“事件不引用任何表”。咦?它没有看到FROM dbo.Company ?? !!这是怎么回事?

所以,我有很多问题:

  1. 如何让它捕获我的跟踪中执行的实际语句,而不是批量提交的内容?
  2. 是否有任何最佳实践可以用于调优与针对SQL Server 2008运行的SSIS包相关的性能?

1 个答案:

答案 0 :(得分:1)

仓库总是有索引,至少在我的宇宙中:-)。 ETL加载通常很容易索引,因为查询非常基本。 (您只需索引业务键列,以便在查找中更快地获取仓库密钥。)

E.G。 “WHERE([CompanyID] = @ P1)AND([StartDateTime] IS NOT NULL且[EndDateTime] IS NULL)”看起来可能是CompanyID是查找键并需要索引。

您在示例中看到的是参数化SQL(这很好)。您是否考虑过使用缺少的索引DMV而不是调优向导?我个人喜欢这种方法,因为它简单直接。只是不要立即采取所有建议的索引;需要做出判断,看看哪些是真正明智的。

另外,如果您的负载很慢,可能是由于其他原因造成的。外键是否在玩?你是批量加载(这是棘手的,因为你可以要求服务器进行批量插入,它可以根据目标表中的聚簇索引和非聚簇索引的细节忽略您的请求)