Sqlserver查询优化在大表的子句中

时间:2013-04-02 13:41:35

标签: sql-server-2005 query-optimization

我有以下查询扫描大表但遗憾的是我没有此列的索引,但通常我必须在此列上运行查询。有没有办法可以优化这个查询。

select * from from(nolock)CURRENT_STATE in('ACT','REJ')

enter image description here

此表中的总记录为30280527

如果我使用top子句而不是选择所有记录会改善性能吗?

1 个答案:

答案 0 :(得分:0)

是的,如果您使用TOP子句,它将提高与子句排除的行数成比例的性能。但是,您只会返回在TOP子句指定的范围内的行。

不,您无法优化此查询。它很简单,没有任何东西可以使用。你唯一的选择是添加一个索引,并拒绝这样做,因为断言你有很多插入和性能会受到愚蠢。是的,索引确实会产生开销,但与性能提升相比,这种开销是微不足道的。

事实上,如果您在插入发生的同时运行上述查询,我​​怀疑扫描表所需的I / O和CPU数量很可能会比维护索引并寻求索引的开销。

如果您绝对必须保持表无索引(因为您已经测试了添加了索引的性能且结果不可接受),请考虑设置某种形式的复制,其中您有一个无索引表来接受插入,和另一个偶尔从第一个表中接收数据的表,并将索引放在第二个表上并对其运行查询。