带变量的查询无法引用索引,故查询效率偏低,用动态SQL,不过因为exec()执行的字符串不是预编译的,所以跟存储过程外部直接执行SQL语句的效率差不多。create proc ddd @value as nchar(50) as begin declare @v1 as varchar(50) set @v1 = '%'+rtrim(@value)+'%' exec('select f1 from tbl where f2 like '''+@v1+'''') end
汗ing,刚留意到,这个查询本来就无法引用索引。
改成: select f1 from tbl where charindex('value',f2)>0 试试看
to runnerWujin() ,你好,其實你也看到了我沒有用到索引功能,在這種沒有用到索引的情況下,一個sql語句和一個包含了這條sql語句的sp速度差上一倍,究竟是什麼問題呢???如果有可能的話請各位針對性的討論一下,仔細分析一下上面的sql語句,謝謝!!
将存储过程改为: create proc ddd ( @value as nchar(50) ) as begin declare @v1 as varchar(50) set @v1 = '%'+@value+'%' ------>这句。两条语句的条件不是完成一致,有时执行时间会差很多 select f1 from tbl where f2 like @v1 end
根据楼主的意思,我在测试表中插入了400多万条记录,进行测试。。 结果表明: 用存储过程查询所用时间与普通方式查询(select f1 from tbl where f2 like '%value%')所用时间差不多,有时还比它快一点(由于查询时间较长,两次查询我分别只测试了两次)。相信不应该是你上面所说的问题。 你可以找找是否是其他原因造成的。比如是否打有sp4补丁,或重建该表的索引.
@value as nchar(50)
as
begin
declare @v1 as varchar(50)
set @v1 = '%'+rtrim(@value)+'%'
exec('select f1 from tbl where f2 like '''+@v1+'''')
end
select f1 from tbl where charindex('value',f2)>0 试试看
LIKE语句是需要逐项对比判断,是需要搜索数据库每一条记录,故你建立了索引等于没有建,性能当初提升不了。
解决方法有二:加大CPU、改搜索为全文搜索
create proc ddd
(
@value as nchar(50)
)
as
begin
declare @v1 as varchar(50)
set @v1 = '%'+@value+'%' ------>这句。两条语句的条件不是完成一致,有时执行时间会差很多
select f1 from tbl where f2 like @v1
end
还有建立存储过程的时候,将传入参数改为"@value as varchar(50)"试试看
结果表明:
用存储过程查询所用时间与普通方式查询(select f1 from tbl where f2 like '%value%')所用时间差不多,有时还比它快一点(由于查询时间较长,两次查询我分别只测试了两次)。相信不应该是你上面所说的问题。
你可以找找是否是其他原因造成的。比如是否打有sp4补丁,或重建该表的索引.
http://community.csdn.net/Expert/topic/4428/4428715.xml?temp=.9201929