SQL查询使用子查询与函数差别太大了
时间:2011-11-12
来源:互联网
表结构:
t_Goods(品号表) 有70,000多笔资料
t_Samples(样品表) 有50,000多笔资料,SampleCode不是索引键。
*/
--返回样品名称的函数
Create Function fn_GetSampleName(
@samplecode nvarchar(100))
Returns nvarchar(200) as
Begin
Declare @SampleName nvarchar(200)
select @SampleName=SampleName From t_Samples where SampleCode=@Samplecode
return @sampleName
End
--使用函数的方式查出样品名称,执行10次,平均耗时3-5分钟
select A.*, SampleName=dbo.GetSampleName(A.SampleCode)
From t_Goods A
--使用子查询的方式查出样品名称,执行10,平均耗时只要20秒。
select A.*,SampleName=(select X.SampleName From t_Samples X where X.SampleCode=A.SampleCode)
From t_Goods A
请大家帮忙分析一下以上问题,以及优化方案。
作者: ggw128 发布时间: 2011-11-12
select a.*,b.SampleName from t_Goods as a left join t_Samples as b on a.SampleCode=b.SampleCode
这样直接用最优
作者: roy_88 发布时间: 2011-11-12
作者: ggw128 发布时间: 2011-11-12
子查询可以在子查询中根据条件过滤一些结果集 效率相对高点
最高的方式是1楼大版的 在连接字段加索引 效率不错。
作者: fredrickhu 发布时间: 2011-11-12
这种方式也试过了,耗时也要3分钟左右。
SampleCode在条件列加上索引,估计30秒内出来
作者: roy_88 发布时间: 2011-11-12
1. 2个表的SampleCode上都建索引(值得建).
2. a表只返回需要的字段,难道非得全部(select a.*)?
3. 然后试试这个,
SQL code
select a.[需要的字段],b.SampleName from t_Goods as a left join t_Samples as b on a.SampleCode=b.SampleCode
作者: ap0405140 发布时间: 2011-11-12
作者: muxingrenlgm 发布时间: 2011-11-12
t_Samples 的 SampleCode是否重复,如果重复你需要怎么取出SampleName
从你写出的看,好像是不重复的,如果不重复,直接连接+必要的索引性能应该不会太差(正常查询),你举得例子不是正常查询,一次返回全部数据是不正常的,应该有筛选条件
t_Samples 的 SampleCode索引必须
t_Goods 的索引主要看筛选条件
作者: NBDBA 发布时间: 2011-11-12
优化方案:
1. 2个表的SampleCode上都建索引(值得建).
2. a表只返回需要的字段,难道非得全部(select a.*)?
3. 然后试试这个,
SQL code
select
a.[需要的字段],b.SampleName
from t_Goods as a
left join t_Samples as b on a.SampleCode=b.Sampl……
select a.* 只是个比方,在实际应用时,是select a.[需要的字段]
作者: ggw128 发布时间: 2011-11-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28