在 SQL Server 中调整大型查询

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

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

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

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

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

【讨论】:

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

以上是关于在 SQL Server 中调整大型查询的主要内容,如果未能解决你的问题,请参考以下文章

大型sql server查询性能优化

SQL Server 中对大型数据集的慢速不同查询

SQL Server 2008,Sybase - 低带宽上的大型选择查询

提高大型表上的 SQL Server 查询性能

Python:将大型 SQL Server 查询结果导出到 .txt 文件

查询大型 SQL Server 表时,pymssql/pyodbc 性能(cursor.execute)非常慢