变量vv="[000001][000002][000003]...[000123]",可能比较长。
表1有约100万条记录,其中的字段1有的是“[000001]”,有的是“[000012][000013]”,等等。
想用下面的句子查询满足条件的记录:
select 字段1,字段2,字段3 from 表1 where charindex(字段1,vv)>0
不知是否会影响速度?
按理charindex通常是这样用的:charindex(vv,字段1),但用于上述情况可能不适合。
各位高手请赐教!
11 个解决方案
#1
where 表达式左边最好不要用函数,会绕过索引,从而影响速度。
#2
由于,你的语句:
select 字段1,字段2,字段3 from 表1 where charindex(字段1,vv)>0
中使用了charindex函数,肯定快不了。
就算是建立了索引,也用不上索引,所以也没办法提升速度。
select 字段1,字段2,字段3 from 表1 where charindex(字段1,vv)>0
中使用了charindex函数,肯定快不了。
就算是建立了索引,也用不上索引,所以也没办法提升速度。
#3
要讲求效率,只能从设计上改善了
#4
重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?
#5
加一列呗,计算列,
#6
如果你的vv的值是固定的还可以使用计算列,来建个索引。
#7
可以这样,新增一个计算列,然后给计算列,建立一个索引,不过建了索引后的性能,取决于查询返回的结果条数,你有100w的记录,如果的查询结果返回50w条,那么这个索引不会提高查询的速度,之后返回少了的数据时,索引才能用来提高查询的速度:
drop table tb
create table tb(ID int,aaa varchar(100))
insert into tb
select 1,'[000001][000002][000003][000004]' union all
select 2,'[000001][000002]' union all
select 3,'[000112][000113]' union all
select 4,'[000004]' union all
select 5,'[000100][000101]' union all
select 6,'[000102][000103]'
go
alter table tb
add compute_column as charindex(aaa,'[000001][000002][000003][000004]')
go
create index idx_tb_cc on tb(compute_column)
go
select *
from tb
where compute_column > 0
/*
ID aaa compute_column
1 [000001][000002][000003][000004] 1
2 [000001][000002] 1
4 [000004] 25
*/
#8
建个索引试试.
create index ix_表1_字段1 on 表1(字段1) include(字段2,字段3)
#9
变量vv是不固定的,是留给用户选定的一个数列,起点不定,数列范围也不定,比如用户选定从[000056]起,范围50个,即从[000056]...[000105],放于vv中,然后需要检索字段1中有含在vv中的记录。因此我觉得增加一个计算列似乎没多大用处。
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?
#10
那就用全文检索技术,可以建立全文索引,速度非常快:
运用SQL Server的全文检索来提高模糊匹配的效率
http://blog.csdn.net/sqlserverdiscovery/article/details/11091851
#11
建索引会导致索引扫描,但总比没有索引时,全表扫描的效率高.
create index ix_表1_字段1 on 表1(字段1) include(字段2,字段3)
#1
where 表达式左边最好不要用函数,会绕过索引,从而影响速度。
#2
由于,你的语句:
select 字段1,字段2,字段3 from 表1 where charindex(字段1,vv)>0
中使用了charindex函数,肯定快不了。
就算是建立了索引,也用不上索引,所以也没办法提升速度。
select 字段1,字段2,字段3 from 表1 where charindex(字段1,vv)>0
中使用了charindex函数,肯定快不了。
就算是建立了索引,也用不上索引,所以也没办法提升速度。
#3
要讲求效率,只能从设计上改善了
#4
重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?
#5
加一列呗,计算列,
#6
如果你的vv的值是固定的还可以使用计算列,来建个索引。
#7
可以这样,新增一个计算列,然后给计算列,建立一个索引,不过建了索引后的性能,取决于查询返回的结果条数,你有100w的记录,如果的查询结果返回50w条,那么这个索引不会提高查询的速度,之后返回少了的数据时,索引才能用来提高查询的速度:
drop table tb
create table tb(ID int,aaa varchar(100))
insert into tb
select 1,'[000001][000002][000003][000004]' union all
select 2,'[000001][000002]' union all
select 3,'[000112][000113]' union all
select 4,'[000004]' union all
select 5,'[000100][000101]' union all
select 6,'[000102][000103]'
go
alter table tb
add compute_column as charindex(aaa,'[000001][000002][000003][000004]')
go
create index idx_tb_cc on tb(compute_column)
go
select *
from tb
where compute_column > 0
/*
ID aaa compute_column
1 [000001][000002][000003][000004] 1
2 [000001][000002] 1
4 [000004] 25
*/
#8
建个索引试试.
create index ix_表1_字段1 on 表1(字段1) include(字段2,字段3)
#9
变量vv是不固定的,是留给用户选定的一个数列,起点不定,数列范围也不定,比如用户选定从[000056]起,范围50个,即从[000056]...[000105],放于vv中,然后需要检索字段1中有含在vv中的记录。因此我觉得增加一个计算列似乎没多大用处。
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?
#10
那就用全文检索技术,可以建立全文索引,速度非常快:
运用SQL Server的全文检索来提高模糊匹配的效率
http://blog.csdn.net/sqlserverdiscovery/article/details/11091851
#11
建索引会导致索引扫描,但总比没有索引时,全表扫描的效率高.
create index ix_表1_字段1 on 表1(字段1) include(字段2,字段3)