【问题标题】:Query optimizer in SQL ServerSQL Server 中的查询优化器
【发布时间】:2012-10-22 15:19:51
【问题描述】:

我们有以下代码:

select * from View1 where (Timestamp >= @x) and (SomeCode like 'ABC%')

它运行非常慢。但是代码

select * from View1 where (Timestamp >= @x)      (*)

运行非常快。此外,SomeCode like... 过滤器在之前的 (*) 代码上运行得非常快。因此,两相时速度很快。 (View1 是一个 CLR 计算视图。)

问题:如何建议 SQL Server 2008 R2 分两个阶段进行查询(更准确地说是两个过滤器),即首先是 Timestamp 过滤器,然后是 SomeCode过滤器。

注意:嵌套查询对我们不起作用,它也很慢。

【问题讨论】:

  • View1 是否已编入索引?如果没有,View1 下的表是否已编入索引?
  • 什么是“CLR 计算视图”google.co.uk/…
  • @egrunin,这是不正确的。使用starts with like 将允许您使用索引。如果他像你那样做containsends with,那就对了。
  • @egrunin - 不正确。如果使用LIKE 而不使用%,则可以使用索引,原因与= (WHERE a LIKE 'hello') 相同,如果第一部分缺少%,它甚至可以使用索引(WHERE a LIKE 'hello%')
  • @marc_s :非常清楚。我会把我的错误言论作为例子留给别人看:)

标签: sql sql-server-2008-r2 query-optimization


【解决方案1】:

可能有更好的方法,但这个对我有用:

SELECT * from (SELECT * FROM View1 WHERE Timestamp >= @x) x
WHERE field_x LIKE 'ABC%'

这会强制首先运行快速查询。

回应 cmets:

也许“力”这个词不合适,但我确实观察到它会产生影响。如果有人有更好的建议,我会修改。

回复您的评论:

“不起作用” = 仍然很慢?

在什么情况下:时间戳列是否被索引? SQL Server 是否因较大的查询而在资源(内存、磁盘空间)上运行不足?你看过执行计划吗?

如果你真的强迫这个问题会发生什么:

SELECT * into #tmp FROM View1 WHERE Timestamp >= @x
SELECT * from #tmp WHERE field_x LIKE 'ABC%'

【讨论】:

  • 将第一个过滤器用作派生表不会强制首先运行该查询,优化器将选择运行该查询的最佳方式
  • 运行缓慢,是的。内存、磁盘——一切都很好。
  • @egrunin:我已经写过,拆分时,它运行得很快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多