是否应该将所有子查询都替换为临时表?
Should all sub queries be replaced with temporary tables?
我一直在研究一个解决方案(在 SQL 服务器中),其中所有子查询都无一例外地用临时 tables 重写以提高性能。
举个例子,所有的查询都是这样的:
SELECT something
FROM (SELECT * FROM T1 WHERE condition1)
JOIN ...
已改写为:
SELECT *
INTO #tempTable
FROM T1
WHERE condition1
SELECT something
FROM #tempTable
JOIN ...
还建议 here 应避免所有子查询以支持临时 tables。
根据给定的事实,是否应该将所有子查询替换为临时 table?如果不是,什么时候应该考虑其中一个?
这太荒谬了。一个笑话。
您的 "subquery" 没问题。 SQL服务器只是忽略它。您可以将其重写为:
SELECT something
FROM T1 JOIN . . .
WHERE condition1
SQL服务器应该正确优化它。
根据我使用 SQL 服务器的经验,很少有需要创建临时 table 来优化查询的情况。更多时候,我使用查询提示来避免嵌套循环连接。
如果 需要临时 table,那么 table 上几乎总是有索引。这是使用临时 table 的关键原因之一。 (其他两个是因为通过一个查询或多个查询重复了相同的查询块)。
我在关于子查询的讨论中不经常看到的一点是人为因素,特别是嵌套对象的可读性和代码的可维护性.
与其他形式的人类阅读代码非常相似,重要的是人们 运行 和编辑查询能够理解它们是什么 运行 以及查询的不同部分如何相互交互.除了仅检索和传递少数元素的简单子查询之外,越来越复杂的子查询可能会变得更难以阅读和理解查询(以及它与超级查询的关系),并且可能由于其他原因而不是花时间理解查询而更难维护(比如嵌套涉及到很多重复代码)
更重要的是,一开始是一个简单的子查询可能会扩展到变得更复杂,此时您可能必须将子查询提取到临时 table 以使其可读/处理真正的性能问题(戈登·利诺夫提到的那种)。根据 comfortable 团队成员对此类重构的接受程度以及对使用子查询(例如存储过程)的脚本的任何依赖性,这种不得不增加重构时间的可能性可能意味着经理会引入 temp tables 作为 风格偏好 和 "performance boost".
我一直在研究一个解决方案(在 SQL 服务器中),其中所有子查询都无一例外地用临时 tables 重写以提高性能。
举个例子,所有的查询都是这样的:
SELECT something
FROM (SELECT * FROM T1 WHERE condition1)
JOIN ...
已改写为:
SELECT *
INTO #tempTable
FROM T1
WHERE condition1
SELECT something
FROM #tempTable
JOIN ...
还建议 here 应避免所有子查询以支持临时 tables。
根据给定的事实,是否应该将所有子查询替换为临时 table?如果不是,什么时候应该考虑其中一个?
这太荒谬了。一个笑话。
您的 "subquery" 没问题。 SQL服务器只是忽略它。您可以将其重写为:
SELECT something
FROM T1 JOIN . . .
WHERE condition1
SQL服务器应该正确优化它。
根据我使用 SQL 服务器的经验,很少有需要创建临时 table 来优化查询的情况。更多时候,我使用查询提示来避免嵌套循环连接。
如果 需要临时 table,那么 table 上几乎总是有索引。这是使用临时 table 的关键原因之一。 (其他两个是因为通过一个查询或多个查询重复了相同的查询块)。
我在关于子查询的讨论中不经常看到的一点是人为因素,特别是嵌套对象的可读性和代码的可维护性.
与其他形式的人类阅读代码非常相似,重要的是人们 运行 和编辑查询能够理解它们是什么 运行 以及查询的不同部分如何相互交互.除了仅检索和传递少数元素的简单子查询之外,越来越复杂的子查询可能会变得更难以阅读和理解查询(以及它与超级查询的关系),并且可能由于其他原因而不是花时间理解查询而更难维护(比如嵌套涉及到很多重复代码)
更重要的是,一开始是一个简单的子查询可能会扩展到变得更复杂,此时您可能必须将子查询提取到临时 table 以使其可读/处理真正的性能问题(戈登·利诺夫提到的那种)。根据 comfortable 团队成员对此类重构的接受程度以及对使用子查询(例如存储过程)的脚本的任何依赖性,这种不得不增加重构时间的可能性可能意味着经理会引入 temp tables 作为 风格偏好 和 "performance boost".