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

问题描述

| 我在一个表中有多个记录,如下所示:
       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
上的覆盖索引(群集或非群集)覆盖。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...