【问题标题】:whats a good way to optimize a table? SQL server 2k8什么是优化表的好方法? SQL 服务器 2k8
【发布时间】:2014-12-30 14:00:09
【问题描述】:

考虑一个有 4 列的“订单”表

OrderNumber : DealerNumber : Code : Time

OrderNumber、DealerNumber 和 Code 上有一个非聚集索引。时间没了

所以

select * from Orders where OrderNumber = 10 and DealerNumber = 20

非常快。 但是表越大,检索到的重复项就越多。可以找到 2010 年的订单和 2014 年的订单。 所以我把查询改成

select *
from Orders
where OrderNumber = 10 and DealerNumber = 20 and [Time] > getdate() - 180

但这会将查询的执行时间从 30 分钟,所以这不是一个选项。

我听说过一些关于过滤索引的事情。在 [Time] 列上放置过滤索引是否明智?如果是这样,生成索引会需要很长时间吗?

或者有更好的选择让第二个查询运行得非常快?

【问题讨论】:

  • 为什么不直接将Time 包含到现有索引中?

标签: sql sql-server sql-server-2008 indexing


【解决方案1】:

您应该为此查询考虑的索引是Orders(OrderNumber, DealerNumber, [Time])

但是,我不确定为什么第一个版本会这么快而第二个版本那么慢。以下是三种可能性:

  • 您正在通过返回第一条记录的时间来衡量性能,而第一个查询确实需要很长时间。
  • time 上有一个索引,而优化器会因为使用该索引而感到困惑。
  • 其他进程已锁定该表。

我不认为过滤索引对这个查询特别有用。

顺便说一句,getdate() 在日期上有一个时间分量。所以你可能想要:`[Time] > cast(getdate() - 180 as date)。

【讨论】:

  • 你是对的,它与 [Time] 列无关,当我前段时间测试它时,它是意外导致缓慢的其他原因,我认为是这个。没关系,问题是无效的,反正学了一些 SQL 的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2023-03-30
  • 2016-12-07
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多