我有以下扫描大表的查询,不幸的是我在此列上没有索引,但通常我必须在此列上运行查询。有没有办法我可以优化这个查询。
select * from match with (nlock) where CURRENT_STATE in ('ACT','REJ')
此表中的总记录是 30280527
如果我使用 top 子句而不是选择所有记录会提高性能吗?
我有以下扫描大表的查询,不幸的是我在此列上没有索引,但通常我必须在此列上运行查询。有没有办法我可以优化这个查询。
select * from match with (nlock) where CURRENT_STATE in ('ACT','REJ')
此表中的总记录是 30280527
如果我使用 top 子句而不是选择所有记录会提高性能吗?
是的,如果您使用 TOP 子句,它将提高与该子句排除的行数成正比的性能。但是,您也只能取回在 TOP 子句指定的范围内的行。
不,您无法优化此查询。它是如此简单,没有什么可以使用的。你唯一的选择是添加一个索引,而拒绝这样做是愚蠢的。是的,索引确实会产生开销,但与它们的性能提升相比,这种开销是微不足道的。
事实上,如果您在发生插入的同时运行上述查询,我怀疑扫描表所需的 I/O 和 CPU 量很可能会比维护一个索引并寻找它。
如果您绝对必须保持表无索引(因为您已经测试了添加索引的性能并且结果不可接受),请考虑设置某种形式的复制,其中您有一个无索引表来接受插入,另一个表偶尔会从第一个表接收数据,并将索引放在第二个表上并对其运行查询。