Sql 这两个查询中哪一个更有效?

Sql 这两个查询中哪一个更有效?,sql,select,sql-server-2005,Sql,Select,Sql Server 2005,我有以下两个问题,我相信使用三个索引扫描(第二个)而不是一个完整的更有效,但我需要更多的意见。另外,如何从第二个查询中的三个计数中获得一个计数?我怎样才能把它们组合成一个呢 第一个问题 SELECT count(*) FROM bldng WHERE (bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' OR bldng_type LIKE '%FACILITY-B%') AND area_sqf > 500 第二个问题

我有以下两个问题,我相信使用三个索引扫描(第二个)而不是一个完整的更有效,但我需要更多的意见。另外,如何从第二个查询中的三个计数中获得一个计数?我怎样才能把它们组合成一个呢

第一个问题

SELECT count(*) FROM bldng 
WHERE (bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%') AND area_sqf > 500
第二个问题

SELECT count(*) FROM bldng WHERE bldng_type LIKE '%PTR%' AND area_sqf > 500 
UNION ALL
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-A%' AND area_sqf > 500  
UNION ALL
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500
好的,这是我在使用“set statistics io on”运行两个查询后得出的结果

第一个(单行)查询:

第二个问题:

Category    Timestamp   Duration    Message Line    Position
Connection  3/27/2012 2:38:15 PM        3615: Table 'bldng'. Scan count 15, logical reads 76703, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.   1   0

Category    Timestamp   Duration    Message Line    Position
Connection  3/27/2012 2:38:15 PM        3615: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.    1   0

但我不知道如何解释这些。我是否比较逻辑读数33320<76703?那么,第一个系统的负载越少,是否意味着它运行的效率越高

运行一条语句通常比运行三条语句然后将结果合并在一起更有效

我假设您需要提供的所有过滤器的总数(将第二个查询的3行与第一个查询的总数相加)

当您说“使用3个索引”时,您是否在bldng_类型列上构建了3个不同的索引

我将坚持第一条语句,因为它通常只使用所有3个过滤器对bldng_类型列的索引执行一个过滤器,对area_sqf列执行一个过滤器,然后对过滤器的结果进行计数

如果运行第二个,它可能会尝试查询表3次,然后将结果合并在一起


但要真正确定,您需要查看查询的执行计划以确定它在做什么。

不是SQL专家,但根据我的记忆,单个语句通常更好,因为它允许优化器更好地完成其工作。虽然不能保证使用短路布尔逻辑,但在第一条语句中,它是优化器可以使用的选项,而在第二条语句中,您可以显式避免它。此外,您可能希望通过使用括号对OR比较进行分组来对OR比较进行优先级排序…

首先,您编写的语句中没有一个在
bldng_type
列上使用任何索引
LIKE
与字符串开头的通配符进行比较是不可优化的

在这种情况下,我想第一个查询效率更高,因为它涉及一个表扫描,而不是三个单独的表扫描。但见下文

“哪个查询更有效”的问题只能通过检查数据库引擎生成的查询计划来回答。该计划不仅取决于查询的结构,还取决于收集到的有关要比较的列的统计信息。由于这些统计信息可能会随着您在数据库中插入和更新数据而改变,因此最有效的查询计划也会随着时间的推移而改变


最后,“完美”数据库引擎将把所有语义相同的查询简化为相同的优化查询计划。在您引用的案例中,这是不可能的,因为查询实际上会产生不同的结果。但是,如果您编写的查询可以识别为相同的,那么它们(同样,在一个完美的数据库引擎中)应该在相同的时间内运行。

您使用的是什么数据库管理系统?您是否查看了每个查询的执行计划?此外,这些查询执行两种不同的操作。您正在尝试获取符合所有条件的记录数吗?是的,抱歉,更正了第一个条件中的错误。添加了“计数”@dido他们仍然是两个不同的结果集。你的意思是在第一个语句中添加
groupbybldng_type
?嗯,但是当我执行这两个语句时,它们似乎给出了相同的结果。你能详细说明一下区别是什么吗?不,我并不是想把一个“团体”放在旁边。但你为什么要问?会有帮助吗?为什么你认为我需要它?嗯,当我运行这两条语句时,第一条语句的执行速度似乎总是比第二条慢(比较运行它们所需的时间)。我不知道你说的执行计划是什么意思?我只是为一个新项目写这些。还没有开发出其他东西……执行所需时间的信息(来自我使用的编辑器)可靠吗?
Category    Timestamp   Duration    Message Line    Position
Connection  3/27/2012 2:38:15 PM        3615: Table 'bldng'. Scan count 15, logical reads 76703, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.   1   0

Category    Timestamp   Duration    Message Line    Position
Connection  3/27/2012 2:38:15 PM        3615: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.    1   0