T-SQL中LIKE关键字的性能问题

时间:2011-05-25 15:15:16

标签: sql tsql

我在表格中有多条记录,如下所示:

       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/%'

这个查询的问题是,当表中有很多记录时,它非常慢。只能返回一条记录。

这个查询有更快的替代方案吗?

4 个答案:

答案 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)

COLUMN1NUMBER上的covering index,无论是群集还是非群集,都可能是最佳选择。