数据库的优化(非连接查询和连接查询的巧用)
2011-07-18 17:34
302 查看
对于同一个问题, 在数据库查询的时间有很多方法,都能实现自己想要的结果,但是速度有快又慢,这就涉及到数据库的优化问题,虽然小生不才,真正刚刚接触数据库不久,但是遇到一个问题,感觉属于一个常见问题。情况是这样的
在张总表(T_Product_Sale商品的总的生产和销售表)里面,还有二关联的表(一个是代理商退货表T_Oda,还有个是售后维修表T_Repair。),现在要根据这三个表要导出另外一个表(T_Return)
当我想算出本月的销售量的时候问题就出现了,
一种方法是要可以根据T_return的参数(月份,商品型号)来给T_Product_Sale表来进行连接查询。
select replace (convert(char(7),B.scan_date),'/','') as MonthType
,count(*) as AmountSale
,GdsName as GdsName
into #AmtSaleTemp
from T_Return A
,T_Product_Sale B
where A.MonthType = replace (convert(char(7),B.scan_date),'/','')
group by replace (convert(char(7),B.scan_date),'/',''),GdsName
另外一个方法是通过T_Product_Sale自身查询。
sql如下:
select dbo.F_Tanc_MonthType(scan_date) as MonthType
,GdsName = ( case
when item_name like '%IdeaPadU%' then 'U1Pad'
else 'Y1011' end)
,count(*) as AmountSale
into #AmtSaleTemp
from T_Product_Sale
group by dbo.F_Tanc_MonthType(scan_date)
,( case
when item_name like '%IdeaPadU%' then 'U1Pad'
else 'Y1011' end)
第一种方法实现的时间是一1分钟30多秒,第二种方法用了五秒,而且第二种方法还把所有行数出来了,第一个只把T_Return要求的行数查询出来了
反思一下这样的情况,其实是考虑问题的角度不一样,一种是很直接的的连接查询(按条件根据要求去查询),另一个是从全局来看非连接查询就搞定了
最终都是通过#AmtSale这个临时表
update A
set A.AmountFr=B.AmountFr
from T_Return A
,#AmtSale B
where A.MonthType=B.MonthType
and A.GdsName = B.GdsName
来把数据更新到表T_Return里面
在张总表(T_Product_Sale商品的总的生产和销售表)里面,还有二关联的表(一个是代理商退货表T_Oda,还有个是售后维修表T_Repair。),现在要根据这三个表要导出另外一个表(T_Return)
当我想算出本月的销售量的时候问题就出现了,
一种方法是要可以根据T_return的参数(月份,商品型号)来给T_Product_Sale表来进行连接查询。
select replace (convert(char(7),B.scan_date),'/','') as MonthType
,count(*) as AmountSale
,GdsName as GdsName
into #AmtSaleTemp
from T_Return A
,T_Product_Sale B
where A.MonthType = replace (convert(char(7),B.scan_date),'/','')
group by replace (convert(char(7),B.scan_date),'/',''),GdsName
另外一个方法是通过T_Product_Sale自身查询。
sql如下:
select dbo.F_Tanc_MonthType(scan_date) as MonthType
,GdsName = ( case
when item_name like '%IdeaPadU%' then 'U1Pad'
else 'Y1011' end)
,count(*) as AmountSale
into #AmtSaleTemp
from T_Product_Sale
group by dbo.F_Tanc_MonthType(scan_date)
,( case
when item_name like '%IdeaPadU%' then 'U1Pad'
else 'Y1011' end)
第一种方法实现的时间是一1分钟30多秒,第二种方法用了五秒,而且第二种方法还把所有行数出来了,第一个只把T_Return要求的行数查询出来了
反思一下这样的情况,其实是考虑问题的角度不一样,一种是很直接的的连接查询(按条件根据要求去查询),另一个是从全局来看非连接查询就搞定了
最终都是通过#AmtSale这个临时表
update A
set A.AmountFr=B.AmountFr
from T_Return A
,#AmtSale B
where A.MonthType=B.MonthType
and A.GdsName = B.GdsName
来把数据更新到表T_Return里面
相关文章推荐
- 数据库远程连接查询优化实验
- 数据库的优化(非连接查询和连接查询的巧用)
- 利用javabean轻松实现对数据库的连接、查询以及增删改!------使用范例
- 数据库连接查询原理 (哈希, 嵌套, 合并)
- c#缓存机制,用于大批量连接数据库的性能优化,可减少对数据库的消耗。
- 关于mysql 使用or连接索引失效引起的慢查询优化的初步实践
- java连接数据库查询
- 数据库——连接查询(子查询)
- 数据库集合查询的优化
- 数据库查询优化浅谈
- 查询SQL Server中的数据库连接用户名与连接密码
- 数据库多表连接查询
- 数据库多表连接查询
- 数据库连接情况查询
- mysql 数据库查询优化
- 数据库查询优化方案
- MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适
- mysql 查询(数据库字段连接及截取及日期)
- 【数据库】——SQL连接查询
- 数据库查询优化——给临时表建索引