这句会影响查询速度吗?

时间:2022-08-05 04:23:47
情况如下:
变量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函数,肯定快不了。

就算是建立了索引,也用不上索引,所以也没办法提升速度。

#3


要讲求效率,只能从设计上改善了

#4


重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?

#5


引用 4 楼 gxbsdzf 的回复:
重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?


加一列呗,计算列,

#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,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?

#10


引用 9 楼 gxbsdzf 的回复:
变量vv是不固定的,是留给用户选定的一个数列,起点不定,数列范围也不定,比如用户选定从[000056]起,范围50个,即从[000056]...[000105],放于vv中,然后需要检索字段1中有含在vv中的记录。因此我觉得增加一个计算列似乎没多大用处。
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?


那就用全文检索技术,可以建立全文索引,速度非常快:

运用SQL Server的全文检索来提高模糊匹配的效率
http://blog.csdn.net/sqlserverdiscovery/article/details/11091851

#11


引用 9 楼 gxbsdzf 的回复:
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?

建索引会导致索引扫描,但总比没有索引时,全表扫描的效率高.

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函数,肯定快不了。

就算是建立了索引,也用不上索引,所以也没办法提升速度。

#3


要讲求效率,只能从设计上改善了

#4


重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?

#5


引用 4 楼 gxbsdzf 的回复:
重新设计表1是比较困难了。除了charindex函数,不知还有没有能实现上述要求的查询语句?


加一列呗,计算列,

#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,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?

#10


引用 9 楼 gxbsdzf 的回复:
变量vv是不固定的,是留给用户选定的一个数列,起点不定,数列范围也不定,比如用户选定从[000056]起,范围50个,即从[000056]...[000105],放于vv中,然后需要检索字段1中有含在vv中的记录。因此我觉得增加一个计算列似乎没多大用处。
目前是用charindex(字段1,vv)>0,因数据量还少,还看不出速度上的问题,但随着记录的增加(预计会有两三百万),很担心其效率。
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?


那就用全文检索技术,可以建立全文索引,速度非常快:

运用SQL Server的全文检索来提高模糊匹配的效率
http://blog.csdn.net/sqlserverdiscovery/article/details/11091851

#11


引用 9 楼 gxbsdzf 的回复:
因该句会导致索引无效,因此建立索引也不行了。
有更高效的复合语句吗?

建索引会导致索引扫描,但总比没有索引时,全表扫描的效率高.

create index ix_表1_字段1 on 表1(字段1) include(字段2,字段3)