2

我正在做涉及大量表之间连接的工作,并且我被告知使用子查询比其他命令慢得多,但在我一直在做的一些事情中,似乎有必要使用子查询或创建一张新桌子。因为我可能会多次调用同一个子查询,所以我一直在为每个子查询构建类似的表并使用它们。这看起来有效吗?请让我知道我是否应该以不同的方式做事。

4

3 回答 3

3

笼统地说使用子查询比其他命令慢得多是完全错误的。像往常一样,这取决于。这里没有人能够给你一个明确的答案来回答你的问题。但是,这应该很容易弄清楚。您可以轻松地创建这两种方法,并检查 SSMS 中生成的查询计划和 Profiler 中的查询统计信息(无论如何您都应该这样做)。这将确定针对您的特定问题的最佳方法。

于 2012-10-09T19:06:12.587 回答
0

您不仅限于这两个选择。您可以在查询中使用子查询、CTE、临时表或表变量。您可以在查询之外维护视图、索引视图或表。哪一个执行得最好取决于您的查询到底在做什么,目标表中有多少行,现有索引,机器上有多少可用磁盘空间/RAM等。此外,如果您使用的是子查询,有没有办法编写整个查询,这样子查询就不会被多次调用?也许使用一些创造性的加入方式或将其放入基于集合的操作中?

于 2012-10-09T19:15:26.563 回答
0

没有正确或错误的答案,但最可能的正确答案是使用公用表表达式或 CTE。

您需要记住的主要事情是,性能差异很大,这取决于一系列因素,包括数据量、数据的分布或统计、索引、子查询的选择性或一般性、磁盘的速度是,有多少查询可以保存在内存中以及一大堆其他东西。

一般来说,编写两个查询并在第一个查询之前添加以下内容:

SET STATISTICS IO ON

然后运行批处理并将视图切换到“消息”而不是查看数据集 - 您将看到每个查询和每个表发生的“逻辑读取”(以及其他内容)。

一般来说,您希望这些逻辑读取数较低。

如果可能,请确保使用实时数据的副本运行此测试,因为这将使您最接近在实时服务器上运行时会发生的情况。(再次最接近的近似值,因为 SQL 优化器可能正在优化一般服务器负载,例如复制或用户活动或其他正在运行的报告或其他任何东西)

根据您多次调用同一个子查询的描述,听起来 CTE 是您正在寻找的东西,而且这些通常比替代品执行得更好。

于 2012-10-09T22:13:19.050 回答