SQL性能问题(没有where子句vs列'%'之类的列)

时间:2010-04-19 14:22:39

标签: sql-server performance

在一个查询中,通过执行像这样的where子句

是否有任何性能损失
select bunchofstuff from sometable where column like '%'

VS

select bunchofstuff from sometable

构建一些动态查询,只是好奇。感谢。

7 个答案:

答案 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)

有许多因素需要考虑:

  1. 如果您必须使用“%”,请确保至少提供类似“a%”
  2. 的内容
  3. 如果您想使用动态查询,请尝试使用Optional Parameters代替
  4. 确保您正在搜索的列已正确编入索引(非群集)。
  5. HTH

答案 5 :(得分:0)

Cade Roux写的内容......如果是SP,你会得到一个参数:@ApplyFilter int

并在您的select语句中,您将拥有:

SELECT ....
WHERE 
(@ApplyFilter = 1) and ....

这种方式 - 应用程序级别将决定过滤器是否适用并将其传递给SP。以上将返回0行;如果您的逻辑是在没有应用过滤器的情况下返回所有行,那么您将拥有:

SELECT ....
WHERE 
(@ApplyFilter = 0) and ....

答案 6 :(得分:-1)

您问我们一个最适合回答的问题。我们不知道您的特定环境是什么样的(哪个数据库,操作系统,硬件配置,前端设置等)。

您应该双向运行此查询并自行检查性能,方法是对每个查询进行计时或使用数据库的性能分析工具/选项。

数据库性能测试确实很棘手。如果您不确定如何测试,可以发布一个新问题,询问如何测试性能。确保您具体了解DBMS版本,因为这通常是高度数据库特定的。

关于这种方法最好的部分是你将来能够更好地为自己回答这些问题。