问题描述
|
我在一个表中有多个记录,如下所示:
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/%\'
该查询的问题在于,当表中有很多记录时,它非常慢。只能返回一条记录。
有没有比该查询更快的替代方法?
解决方法
由于WHERE子句有2个条件,因此在NUMBER和COLUMN1列上都需要一个索引才能使用。
由于NUMBER = 1位,当前的COLUMN1索引被忽略,或者与键查找一起使用以获取NUMBER。无论哪种方式,这都可以解释OP看到的内容。
编辑:
索引是
(NUMBER,COLUMN1)
还是ѭ3and是反复试验。
我怀疑第二个值是否只有NUMBER上的2个值,但YMMV
,在column1和number列上添加索引。尝试两种方式,column1和number / number和column1。一次尝试一个索引。根据数据,可能会有所不同。
索引可帮助like命令,其中%不在like值的最前面。在这种情况下,它应该会有所帮助。
,由于只能返回一条记录,因此可以执行top(1)。在某些情况下,top(1)将在第一个匹配项(没有order by
)时停止条件循环。查询将更快。
SELECT top(1) COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE \'http://namespace1/%\'
,最好将COLUMN1
和NUMBER
上的覆盖索引(群集或非群集)覆盖。