我在表格中有多条记录,如下所示:
COLUMN1 | NUMBER
--------------------------------------
'http://namespace1/#1'| 1
'http://namespace1/#2'| 0
'http://namespace1/#3'| 0
'http://namespace1/#4'| 0
'http://namespace2/#1'| 0
'http://namespace2/#2'| 0
'http://namespace2/#3'| 0
'http://namespace2/#4'| 1
...
现在,我的查询如下:
SELECT COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%'
这个查询的问题是,当表中有很多记录时,它非常慢。只能返回一条记录。
这个查询有更快的替代方案吗?
答案 0 :(得分:2)
您需要在NUMBER和COLUMN1列上使用索引才能在此处使用,因为WHERE子句有2个条件。
当前COLUMN1索引由于NUMBER = 1位而被忽略,或者与密钥查找一起使用以获得NUMBER。无论哪种方式,这都解释了OP所看到的。
编辑:
索引是(NUMBER,COLUMN1)
还是(COLUMN1,NUMBER)
是反复试验。
我怀疑第二个,如果NUMBER上只有2个值,但是YMMV
答案 1 :(得分:1)
在column1和number列上添加索引。尝试两种方式,column1和number / number和column1。一次尝试一个索引。根据数据,它可能会有所不同。
索引帮助使用like命令,其中%不在like值的前面。在这种情况下,它应该有很多帮助。
答案 2 :(得分:1)
由于只能返回一条记录,因此可以执行top(1)。在某些情况下,top(1)将在第一次匹配时停止条件循环(当没有order by
时)。查询会更快。
SELECT top(1) COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%'
答案 3 :(得分:0)
COLUMN1
和NUMBER
上的covering index,无论是群集还是非群集,都可能是最佳选择。