Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化表格的好方法是什么?SQL server 2k8_Sql_Sql Server_Sql Server 2008_Indexing - Fatal编程技术网

优化表格的好方法是什么?SQL server 2k8

优化表格的好方法是什么?SQL server 2k8,sql,sql-server,sql-server-2008,indexing,Sql,Sql Server,Sql Server 2008,Indexing,考虑一个包含4列的表“Orders” 订单号:经销商编号:代码:时间 OrderNumber、DealerNumber和Code上有一个非聚集索引。时间不分先后 所以 速度相当快。 但表越大,检索到的重复项越多。可以找到2010年的订单和2014年的订单。 因此,我将查询改为 select * from Orders where OrderNumber = 10 and DealerNumber = 20 and [Time] > getdate() - 180 但这会将查询的执行时间从

考虑一个包含4列的表“Orders”

订单号:经销商编号:代码:时间

OrderNumber、DealerNumber和Code上有一个非聚集索引。时间不分先后

所以

速度相当快。 但表越大,检索到的重复项越多。可以找到2010年的订单和2014年的订单。 因此,我将查询改为

select *
from Orders
where OrderNumber = 10 and DealerNumber = 20 and [Time] > getdate() - 180
但这会将查询的执行时间从<1秒更改为>30分钟,因此这不是一个选项

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


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

对于这个查询,您应该考虑的索引是
订单(OrderNumber,DealerNumber,[Time])

然而,我不知道为什么第一个版本会这么快,第二个版本会这么慢。这里有三种可能性:

  • 您通过返回第一条记录的时间来衡量性能,而第一个查询确实需要很长时间
  • 时间上有一个索引,优化器会感到困惑,因为它使用了该索引
  • 其他进程已锁定该表
我不认为过滤索引对这个查询特别有用


顺便说一下,
getdate()
在日期上有一个时间组件。所以你可能想要:`[Time]>cast(getdate()-180作为date)。

为什么不将
Time
包含到你现有的索引中呢?你是对的,它与[Time]列无关,当我不久前测试它时,它是其他东西意外地导致了速度缓慢,我假设是这样的。不管这个问题是否无效,还是学了一些SQL知识
select *
from Orders
where OrderNumber = 10 and DealerNumber = 20 and [Time] > getdate() - 180