+ -
当前位置:首页 → 问答吧 → SQL查询使用子查询与函数差别太大了

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

SQL code

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

这种方式也试过了,耗时也要3分钟左右。

作者: ggw128   发布时间: 2011-11-12

函数肯定最不可取 应为在扫描的时候都是全表扫描

子查询可以在子查询中根据条件过滤一些结果集 效率相对高点

最高的方式是1楼大版的 在连接字段加索引 效率不错。

作者: fredrickhu   发布时间: 2011-11-12

引用 2 楼 ggw128 的回复:

这种方式也试过了,耗时也要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

引用 5 楼 ap0405140 的回复:
优化方案:
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