2013-04-02 45 views
1

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

SELECT * FROM与匹配(NOLOCK)其中CURRENT_STATE在( 'ACT', 'REJ')这个表中

enter image description here

总记录是30280527

如果我使用TOP子句来代替选择所有记录会提高性能吗?

+2

那你为什么不设置一个索引,看看它是否有帮助? – CBroe

+0

我也有很多插入在这张表中,索引可能会导致性能问题。 –

回答

0

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

不,您无法做任何事情来优化此查询。这是如此简单,没有任何工作。你唯一的选择是添加一个索引,并拒绝这样做,断言你有很多插入和性能会受到影响是愚蠢的。是的,索引确实会产生开销,但与其性能收益相比,这种开销是微不足道的。实际上,如果你在发生插入的同时运行上面的查询,我怀疑扫描表所需的I/O和CPU的数量很可能会导致更多的性能损失而不是维护索引并寻求它的开销。

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