SQL性能问题(没有where子句VS其中column LIKE '%')

SQL性能问题(没有where子句VS其中column LIKE '%')

问题描述:

在查询中,有没有做一个打任何性能where子句,像这样SQL性能问题(没有where子句VS其中column LIKE '%')

select bunchofstuff from sometable where column like '%' 

VS

select bunchofstuff from sometable 

大厦一些动态查询,只是好奇而已。谢谢。

+2

你会认为被优化掉 – 2010-04-19 14:24:30

2005年SQL,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 

意味着成本将几乎是相同的,因为都返回SAM Ë结果集:

(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%),因为它看来,过滤器被解析即使它没有效果也可以应用。

+3

但结果集可以是不同的,如果搜索列允许空值 – 2010-04-19 15:19:33

+0

这可能是如果你建立所有这样的动态SQL像这样 – 2010-04-19 17:12:17

任何时候你过滤结果,业绩将是一个慢一点(当然,除非,查询优化器优化了空like

我的假设是,由于这是一个动态查询,有在通配符之后将成为某种东西。

根据表的大小,通配符like子句可能会导致轻微减速或秒/分数量级的内容。

+0

大多数时候会有外卡后,什么都没有。我可以做一些像 其中(参数为null或列参数+'%'), 只是做了很多论文,希望只是做一个像'%'的列,如果参数没有值(默认为'')不会是一个表现冲击。看起来像是。我可以承受一点额外的打字我猜:) – infocyde 2010-04-19 14:32:07

这些是不同的查询,并且如果所讨论的列允许NULL,将返回不同的结果!

如果你希望所有的行,只是删除WHERE

当我代码生成SQL和它更容易尝试插入一个空操作不是试图把所有的括号开头和结尾的东西吧 - 我通常使用类似WHERE (0 = 1) OR ...或... WHERE (1 = 1) AND

有被认为是一堆因素:

  1. 如果你必须使用“%”然后确保你至少给类似“一%”
  2. 接下来,如果你想使用动态查询尝试使用Optional Parameters代替
  3. 确保您正在搜索的列(S)为索引(非群集)正确。

HTH

你问我们一个问题,你在回答的最佳位置。我们不知道您的特定环境看起来像(哪个数据库,操作系统,硬件配置,前端设置等)。

您应该运行此查询两种方式和你自己,无论是通过定时每个查询或使用数据库的分析工具/选项检查性能。

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

这种方法的最好的部分是,你将得到更好的装备来回答这些类型的在未来为自己的问题。

什么凯德鲁写道......在SP的情况下,你将有一个参数:@ApplyFilter诠释

,并在你的SELECT语句中你会:

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

这样 - 应用水平会决定过滤器是否适用并将其传递给SP。以上将返回0行;如果你的逻辑是返回所有行没有应用过滤器时,你会:

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