为啥同一个查询,做成函数反而慢了呢 本帖最后由 u013478753 于 2014-01-16 19:50:13 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可是我整个函数里只用了一个表变量就是@ret 就是函数的返回值, 而且因为是统计数据,记录数并不多, 可是我整个函数里只用了一个表变量就是@ret 就是函数的返回值, 而且因为是统计数据,记录数并不多,哦,那这样,你把执行计划贴出来看看把 我发现了一个新的现象比如有表 table1(col1 varchar(10),col2 varchar(10)) 并且col1和col2都有独立索引(不是组合索引)declare @v_col1 varchar(10),@v_col2 varchar(10)select @v_col1 = '123',@v_col2 = nullselect * from table1 where (@v_col1 is null or rtrim(@v_col1) = '' or col1 = @v_col1) --参数为空表示所有 and (@v_col2 is null or rtrim(@v_col2) = '' or col2 = @v_col2)可以看出由于@v_col2 值是null 所以虽然写了or col2 = @v_col2,但是这个条件是不会发挥作用的,也不会增加查询耗时神奇的是我把这一整行"不会影响查询速度的条件"给删掉变成下面的样子declare @v_col1 varchar(10),@v_col2 varchar(10)select @v_col1 = '123',@v_col2 = nullselect * from table1 where (@v_col1 is null or rtrim(@v_col1) = '' or col1 = @v_col1) --参数为空表示所有结果居然是查询耗时增加了,注意是增加了而不是减少了,也就是说,加一个"无耗时"的条件以后,查询速度反而加快耗时增加以后,查询分析器的耗时变的和用函数查询的耗时相同了,真是汗我去函数里也把这一整行给备注掉(因为我在测试的时候这个参数就是传null的 比如 select * from f_a('123',null) )结果函数的耗时没有任何变化 那我就不懂了,表值函数要受到比存储过程多的限制(只能做只读操作),然后还比存储过程慢,那它存在的意义是什么有意义,就是能这么查询,还能关联:select * from dbo.表值函数(参数)而存储过程,只能这样:exec 存储过程 参数 执行计划主要检查开销COST的大小和开销百分比%(注:线条粗细也是比较直观的),如果偏大就说明有tuning的空间,可以调整写法,合理使用索引,再查看执行计划开销的变化。 弱弱的问题 ,请详细解答,谢谢SQL insert select Union 标题写长点怕看不到。。。。。。。 大容量数据库的完整性备份问题 求一SQL语句. SQL Server 2012 无法打开vs_setup.msi 包含子一级目录权限的sql代码怎样写? sql2005比sql2000好在哪里? 如何用sql 语句将 04/05/1982转换成05/04/1982? 急 在线的请帮忙写一下这条语句,在线等。 在s'ql2000中怎样使选出的时间显示为x年x月x日的格式呢 一台Linux机器上,创建了两个数据库,问题!! 不能DROP 表 问个有点傻的问题
可是我整个函数里只用了一个表变量就是@ret 就是函数的返回值, 而且因为是统计数据,记录数并不多,
可是我整个函数里只用了一个表变量就是@ret 就是函数的返回值, 而且因为是统计数据,记录数并不多,哦,那这样,你把执行计划贴出来看看把
比如
有表 table1(col1 varchar(10),col2 varchar(10)) 并且col1和col2都有独立索引(不是组合索引)
declare @v_col1 varchar(10),@v_col2 varchar(10)
select @v_col1 = '123',@v_col2 = null
select * from table1
where (@v_col1 is null or rtrim(@v_col1) = '' or col1 = @v_col1) --参数为空表示所有
and (@v_col2 is null or rtrim(@v_col2) = '' or col2 = @v_col2)可以看出由于@v_col2 值是null 所以虽然写了or col2 = @v_col2,但是这个条件是不会发挥作用的,也不会增加查询耗时神奇的是我把这一整行"不会影响查询速度的条件"给删掉变成下面的样子
declare @v_col1 varchar(10),@v_col2 varchar(10)
select @v_col1 = '123',@v_col2 = null
select * from table1
where (@v_col1 is null or rtrim(@v_col1) = '' or col1 = @v_col1) --参数为空表示所有
结果居然是查询耗时增加了,注意是增加了而不是减少了,也就是说,加一个"无耗时"的条件以后,查询速度反而加快
耗时增加以后,查询分析器的耗时变的和用函数查询的耗时相同了,真是汗
我去函数里也把这一整行给备注掉(因为我在测试的时候这个参数就是传null的 比如 select * from f_a('123',null) )
结果函数的耗时没有任何变化
那我就不懂了,表值函数要受到比存储过程多的限制(只能做只读操作),然后还比存储过程慢,那它存在的意义是什么有意义,就是能这么查询,还能关联:select * from dbo.表值函数(参数)而存储过程,只能这样:exec 存储过程 参数