在一个查询中,通过执行像这样的where子句
是否有任何性能损失select bunchofstuff from sometable where column like '%'
VS
select bunchofstuff from sometable
构建一些动态查询,只是好奇。感谢。
答案 0 :(得分:3)
在SQL 2005上,SP3运行以下
set statistics io on
select * from sys.columns where name like '%'
set statistics io off
set statistics io on
select * from sys.columns
set statistics io off
表明成本几乎相同,因为两者都返回相同的结果集:
(1134 row(s) affected)
Table 'syscolpars'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
启用查询计划和/或统计信息IO显示select * from sys.columns where name like '%'
稍微贵一点(查询成本的51%与select * from sys.columns
的49%相比),因为它似乎解析了过滤器即使它没有效果也应用。
答案 1 :(得分:2)
这些是不同的查询,如果相关列允许NULL,将返回不同的结果!
如果您想要所有行,只需删除WHERE
答案 2 :(得分:1)
每次过滤结果时,性能都会慢一点(当然,除非查询优化器优化出空like
)
我的假设是,因为这是一个动态查询,所以在通配符之后会有一些东西。
根据表的大小,通配符like
子句可能会导致轻微的减速或大约秒/分钟。
答案 3 :(得分:1)
当我是代码生成SQL时,尝试插入无操作比尝试获取所有括号以及前导和尾随事物更容易 - 我通常使用WHERE (0 = 1) OR
之类的东西...或者WHERE (1 = 1) AND
...
答案 4 :(得分:1)
有许多因素需要考虑:
HTH
答案 5 :(得分:0)
Cade Roux写的内容......如果是SP,你会得到一个参数:@ApplyFilter int
并在您的select语句中,您将拥有:
SELECT ....
WHERE
(@ApplyFilter = 1) and ....
这种方式 - 应用程序级别将决定过滤器是否适用并将其传递给SP。以上将返回0行;如果您的逻辑是在没有应用过滤器的情况下返回所有行,那么您将拥有:
SELECT ....
WHERE
(@ApplyFilter = 0) and ....
答案 6 :(得分:-1)
您问我们一个您最适合回答的问题。我们不知道您的特定环境是什么样的(哪个数据库,操作系统,硬件配置,前端设置等)。
您应该双向运行此查询并自行检查性能,方法是对每个查询进行计时或使用数据库的性能分析工具/选项。
数据库性能测试确实很棘手。如果您不确定如何测试,可以发布一个新问题,询问如何测试性能。确保您具体了解DBMS版本,因为这通常是高度数据库特定的。
关于这种方法最好的部分是你将来能够更好地为自己回答这些问题。