【问题标题】:The Data Loading Performance (SQL Server 2008)数据加载性能 (SQL Server 2008)
【发布时间】:2016-10-24 04:39:15
【问题描述】:

我有一个大查询,以便从 40 个表中获取数据;查询包含(40 个表选择),每个选择都包含案例和多连接和条件,每个表选择后我都有 UNION

这些表中的这些选择存在于 CTE 中,然后是 CTE 中的最终选择。

主要问题是性能问题,因为我在每个表中都有大量数据。

您能否提供您的主要想法或提示以提高查询性能?

【问题讨论】:

  • 这是一个非常广泛的问题。您为什么要为此使用 CTE,为什么将所有数据合并到一个大查询中?你的索引正确吗?
  • 把问题分解成更小的部分。单独检查每个 SELECT。哪些是问题查询?
  • 当然,索引是正确的。我还使用联合来从很多表中返回确切的数据!
  • 您需要删除重复项,还是可以改为 UNION ALL?有些选择与其他选择相似吗?
  • 这个问题现在无法回答。没有真正的数据可供我们任何人使用。但是,即使您确实编辑了问题以包含所有相关数据,它也可能太长且太麻烦。尝试将查询分解为更小的部分,看看您可以在所有这些部分中单独改进什么。

标签: sql sql-server performance sql-server-2008


【解决方案1】:
  1. 查看所有 40 个表大小,并在查询计划中查看 SQL 是否扫描或查找这些表。如果是扫描的话,显然是及时的I/O操作。
  2. 检查查询计划中表的统计信息和估计行与实际行。这可能会导致 TempDB 中的计划无效和溢出。
  3. 由于数据很多,可能内存不足,并且您的页面预期寿命较低,甚至交换文件活动。
  4. 由于有 40 个表,SQL Server 可能无法提供最佳执行计划。然后你必须看看它失败的地方并修复它。

最好的办法是遵循先前的建议,并尽可能将您的查询分成更小的部分。

例如,如果你有类似的东西:

;WITH CTE as (SELECT a FROM A UNION SELECT b FROM B)
SELECT * FROM CTE 
INNER JOIN C on CTE.a = C.c

尝试用这个替换它:

SELECT * FROM A 
INNER JOIN C on A.a = C.c
UNION
SELECT * FROM B
INNER JOIN C on B.b = C.c

或者甚至做这样的事情:

SELECT * INTO #t
FROM A INNER JOIN C on A.a = C.c
GO
INSERT INTO #t
SELECT * FROM B INNER JOIN C on B.b = C.c
GO
SELECT * FROM #t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多