【问题标题】:Tuning in large queries in SQL Server在 SQL Server 中调整大型查询
【发布时间】:2017-03-14 17:49:30
【问题描述】:

我是 SQL Server 的新手,但在 Oracle 数据库中花费了足够的时间。在我正在管理的当前应用程序中,包含许多用于接收上游数据的非规范化临时表。

已在临时表上创建视图,每个表由大约 40 个表和多个连接组成。这些视图加载与另一个数据库中的视图同名的数据集市表。

这些视图需要花费大量时间来加载数据集市表,大约需要 5 小时。逻辑是截断加载,即每天截断整个数据库,并使用格式文件将数据从源系统文件加载到暂存区表中。

如何调整这些视图以加快加载过程,因为截断加载过程是故意编写的?

【问题讨论】:

  • 那么,在运行进程之前,临时表是否被截断?临时表没有索引,对吧?
  • 是的,每次从文件加载临时表时,它们都会被截断。我们确实在临时表上创建了主键索引。
  • 在插入临时表之前删除 PK 和任何其他索引,如果需要,在过程结束时再次创建它们。插入有索引的表比插入没有索引的表需要更多的时间,而且它们会变得碎片化。如果您在没有索引的情况下插入它会更快,并且一旦您创建它们,它们将没有碎片,从而使它们更易于阅读。

标签: sql-server database tsql view query-tuning


【解决方案1】:

你可能需要看看正常的东西:

  • 开启statistics io,看看哪个表导致查询中的大部分I/O
  • 从实际计划中的最左侧节点检查您的查询计划创建不会超时(因为所有连接)
  • 查看计划中的粗箭头(=正在处理的大量行)
  • 检查计划中的任何昂贵操作(排序、假脱机、具有大量行数的键查找)
  • 检查计划中估计的行数与实际行数的数量级差异

不要太在意实际计划中的成本百分比,这些只是估计值,可能会产生极大的误导。

如果没有更多细节(创建表和索引子句、实际查询计划)等,很难提供更详细的信息。

【讨论】:

  • 假设在 40 个表中,有 10 个表被连接在一起为视图生成 x 列,可以将它们转换为 CTE,然后使用它们进行主视图查询。可以调整 CTE 以提高性能吗?
  • 我认为这在很大程度上取决于您在 CTE 中所做的事情(或者例如在派生表中或可能在内联函数中) - 有时看起来你会得到更好的结果,有时至少我觉得它会错误的方式:)
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
相关资源
最近更新 更多