执行效率问题

spland 2008-12-19 04:14:44
有商品表 T1MM11_GOODS_CODE
主key是商品code(GOODS_CODE),有效日(ORDER_EFFECT_DATE)
要抽出这个表基于某个日期(下面的例子用2008/12/19)的所有有效商品code
我这里有2中做法
A方法
select T1.GOODS_CODE
from T1MM11_GOODS_CODE T1
inner join
(select GOODS_CODE,Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE<'2008/12/19'
group by GOODS_CODE) T3
On T1.GOODS_CODE=T3.GOODS_CODE
And T1.ORDER_EFFECT_DATE=T3.ORDER_EFFECT_DATE
Where T1.DEL_FLG='0'

B方法
select T1.GOODS_CODE
from T1MM11_GOODS_CODE T1
where ORDER_EFFECT_DATE=
(select Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE<'2008/12/19'
AND T1.GOODS_CODE=T2.GOODS_CODE
group by GOODS_CODE)
and T1.DEL_FLG='0'

现在表的数据是14万
执行的结果是B方法明显比A方法快
但是换其他的表后,有A方法比B方法快的情况
请高人指点,是不是在某些特定情况下,A,B方法各有快慢?
或者那位有更好的做法?
谢谢指点
...全文
201 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooily 2008-12-22
  • 打赏
  • 举报
回复
不懂,up
西北刘五 2008-12-22
  • 打赏
  • 举报
回复
第一种是内连接,第二种是子查询,一般情况下内连接比子查询快些,但是由于查询时先扫描哪个表,是否用到索引,使用索引的顺序都会影响查询速度的,所以没有什么绝对的,得根据实际情况做些调整。
h_lj 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 mantisXF 的回复:]
SQL code-- 这问题真有趣..
SELECT DISTINCT GOODS_CODE
FROM T1MM11_GOODS_CODE
WHERE ORDER_EFFECT_DATE < '2008/12/19'
AND DEL_FLG = '0';
引用楼主 spland 的帖子:
有商品表 T1MM11_GOODS_CODE
主key是商品code(GOODS_CODE),有效日(ORDER_EFFECT_DATE)
要抽出这个表基于某个日期(下面的例子用2008/12/19)的所有有效商品code
我这里有2中做法
A方法
select T1.GOODS_CODE
from T1MM11…
[/Quote]

楼上什么意思?什么真有趣
孑冰 2008-12-22
  • 打赏
  • 举报
回复
怎么,难道sql语句有什么问题吗?
mantisXF 2008-12-22
  • 打赏
  • 举报
回复
-- 这问题真有趣..
SELECT DISTINCT GOODS_CODE
FROM T1MM11_GOODS_CODE
WHERE ORDER_EFFECT_DATE < '2008/12/19'
AND DEL_FLG = '0';
[Quote=引用楼主 spland 的帖子:]
有商品表 T1MM11_GOODS_CODE
主key是商品code(GOODS_CODE),有效日(ORDER_EFFECT_DATE)
要抽出这个表基于某个日期(下面的例子用2008/12/19)的所有有效商品code
我这里有2中做法
A方法
select T1.GOODS_CODE
from T1MM11_GOODS_CODE T1
inner join
(select GOODS_CODE,Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE <'2008/12/19'
group by GOODS…
[/Quote]
chance2000 2008-12-22
  • 打赏
  • 举报
回复
试一试这种写法:
SELECT T1.GOODS_CODE
FROM T1MM11_GOODS_CODE T1,
(SELECT GOODS_CODE, MAX(ORDER_EFFECT_DATE) AS ORDER_EFFECT_DATE
FROM T1MM11_GOODS_CODE
WHERE ORDER_EFFECT_DATE < '2008/12/19'
AND DEL_FLG = '0'
GROUP BY GOODS_CODE) T2
WHERE T1.GOODS_CODE = T2.GOODS_CODE
AND T1.ORDER_EFFECT_DATE < '2008/12/19'
AND T1.DEL_FLG = '0'
w7210982 2008-12-22
  • 打赏
  • 举报
回复
学习下
zhuhongtao4 2008-12-21
  • 打赏
  • 举报
回复
没有哪个方法一定比另一个好,只有经过自己使用优化方法比对之后才能知道。
codearts 2008-12-21
  • 打赏
  • 举报
回复
select T1.GOODS_CODE 
from T1MM11_GOODS_CODE T1
where ORDER_EFFECT_DATE=
(select Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE <'2008/12/19'
AND T1.GOODS_CODE=T2.GOODS_CODE
--group by GOODS_CODE 这个group by 加在这干嘛呢,多余
)
and T1.DEL_FLG='0'
h_lj 2008-12-20
  • 打赏
  • 举报
回复
可能是我没看明白楼主的需求,但就我目前的理解来看,不是要取出所有在有效期之前的商品code吗?
那为什么要这么麻烦呢
select distinct GOODS_CODE
from T1MM11_GOODS_CODE
where ORDER_EFFECT_DATE <'2008/12/19'
and DEL_FLG = '0'
这样不就好了吗?
范佩西_11 2008-12-19
  • 打赏
  • 举报
回复
ORDER_EFFECT_DATE、DEL_FLG 建索引。再把sort_area_size hash_area_size调大些
spland 2008-12-19
  • 打赏
  • 举报
回复
row_number() 的方法也是可以的
我之前也是试过,速度是介于A,B之间
我想了解的是,什么是可能影响A,B执行难效率的因素
Andy__Huang 2008-12-19
  • 打赏
  • 举报
回复
在我看来,方法B比较好!
为什么两次查询结果各有快慢呢?它和被连接的表数据量大小有关系
被连接的表数据量大,搜索的结果多,符合条件的多,连接就会慢
反之,它会快!
中国风 2008-12-19
  • 打赏
  • 举报
回复

select * 
from T1MM11_GOODS_CODE a
where not exists(select 1 from T1MM11_GOODS_CODE where ORDER_EFFECT_DATE=a.ORDER_EFFECT_DATE and ORDER_EFFECT_DATE>a.ORDER_EFFECT_DATE)


參照寫法;有幾种方法都是通用的
http://topic.csdn.net/u/20081106/11/b2f6633d-f96e-444f-9264-8d8528d308fa.html
fuyou001 2008-12-19
  • 打赏
  • 举报
回复
楼主的SQL在用了函数慢吗
范佩西_11 2008-12-19
  • 打赏
  • 举报
回复
奶奶的还错了一点。
select GOODS_CODE
from (select GOODS_CODE,
row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc) rn
from T1MM11_GOODS_CODE
Where ORDER_EFFECT_DATE < '2008/12/19'
and DEL_FLG = '0')
where rn = 1
范佩西_11 2008-12-19
  • 打赏
  • 举报
回复
select GOODS_CODE
from (select GOODS_CODE,
row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc) rn
from T1MM11_GOODS_CODE
Where ORDER_EFFECT_DATE < '2008/12/19'
and T1.DEL_FLG = '0')
where rn = 1
范佩西_11 2008-12-19
  • 打赏
  • 举报
回复
select GOODS_CODE
from (select GOODS_CODE,
row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc from T1MM11_GOODS_CODE) rn
Where ORDER_EFFECT_DATE < '2008/12/19'
and T1.DEL_FLG = '0')
where rn = 1
中国风 2008-12-19
  • 打赏
  • 举报
回复
select *
from
(select *
from T1MM11_GOODS_CODE
where ORDER_EFFECT_DATE <'2008/12/19'
order by ORDER_EFFECT_DATE desc)
where rownum=1
加载更多回复(1)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧