我做的工作涉及很多表之间的连接,而且我被教导过使用子查询比其他命令要慢得多,但是在我做过的一些事情中我觉得有必要要么使用子查询,要么创建新表。因为我可能多次调用相同的子查询,所以我一直在为每个子查询构建类似的表,并使用它们。这看起来有效吗?如果我以不同的方式做事,请告诉我。
答案 0 :(得分:3)
使用子查询比其他命令慢很多,这是一个简单的说法。像往常一样,这取决于。这里没有人能够给你一个明确的答案。但是,这应该很容易弄清楚自己。您可以轻松地创建这两种方法,并检查SSMS中生成的查询计划和Profiler中的查询统计信息(无论如何您应该这样做)。这将确定解决您特定问题的最佳方法。
答案 1 :(得分:0)
您不仅限于这两种选择。您可以在查询中使用子查询,CTE,临时表或表变量。您可以在查询之外维护视图,索引视图或表。哪一个将执行最佳取决于您的查询正在做什么,目标表中有多少行,现有索引,机器上可用的磁盘空间/ RAM等等。此外,如果您使用子查询,有没有办法编写整个查询,以便多次调用子查询?也许使用一些创造性的加入方式或将其置于基于集合的操作中?
答案 2 :(得分:0)
没有正确或错误的答案,但最有效的正确答案是使用公用表格表达式或CTE。
您需要记住的主要事情是,性能会有很大差异取决于一系列因素,包括数据量,数据的传播或统计,索引,子查询的选择性或一般性,如何你的磁盘速度很快,可以在内存中保存多少查询以及其他一些东西。
一般来说,编写两个查询并在第一个查询之前添加以下内容:
SET STATISTICS IO ON
然后运行批处理并将视图切换为“消息”而不是查看数据集 - 您将看到每个查询和每个表产生的“逻辑读取”(以及其他内容)。
一般来说,您希望这些逻辑读取更低。
如果可能的话,请确保使用实时数据的副本运行此测试,因为这将使您最接近在实时服务器上运行时将会发生的情况。 (再次接近最近,因为SQL优化器可能正在针对一般服务器负载进行优化,例如由于复制或用户活动或其他报告正在运行或者其他任何报告)
按照你多次调用相同子查询的描述,听起来像你正在寻找的CTE,这些通常比替代品更好。