【ORACLE】在结果集字段中只有一列要使用组函数MAX,使用GROUP BY效率并不是最高的。
2010-12-04 18:59
281 查看
原SQL如下,效率低的让人不能忍受,然后就在想有没有其它变通的方式:
SELECT MAX(C.INVDATE), D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID FROM ECC_OMS.V_TJ_STOCK C, ECC_OMS.DATE_WEEK_YEAR D WHERE C.INVDATE = D.SDATE GROUP BY D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS 13641 651105 21486465
HASH GROUP BY 13641 651105 21486465
HASH JOIN 6580 1026081 33860673
TABLE ACCESS FULL ECC_OMS DATE_WEEK_YEAR 5 2397 35955
TABLE ACCESS FULL ECC_OMS V_TJ_STOCK 6563 1026081 18469458
想了一会,试着用ORDER BY DESC和ROWNUM=1变通一下:
SELECT C.INVDATE, D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID FROM ECC_OMS.V_TJ_STOCK C, ECC_OMS.DATE_WEEK_YEAR D WHERE C.INVDATE = D.SDATE AND ROWNUM = 1 ORDER BY C.INVDATE DESC
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS 3 1 33
COUNT STOPKEY
NESTED LOOPS 3 1 33
TABLE ACCESS BY INDEX ROWID ECC_OMS V_TJ_STOCK 2 1026081 18469458
INDEX FULL SCAN DESCENDING ECC_OMS V_TJ_STOCK_IDX01 2 1
TABLE ACCESS BY INDEX ROWID ECC_OMS DATE_WEEK_YEAR 1 1 15
INDEX UNIQUE SCAN ECC_OMS DATE_WEEK_YEAR 1 1
请各位大侠指教。
SELECT MAX(C.INVDATE), D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID FROM ECC_OMS.V_TJ_STOCK C, ECC_OMS.DATE_WEEK_YEAR D WHERE C.INVDATE = D.SDATE GROUP BY D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS 13641 651105 21486465
HASH GROUP BY 13641 651105 21486465
HASH JOIN 6580 1026081 33860673
TABLE ACCESS FULL ECC_OMS DATE_WEEK_YEAR 5 2397 35955
TABLE ACCESS FULL ECC_OMS V_TJ_STOCK 6563 1026081 18469458
想了一会,试着用ORDER BY DESC和ROWNUM=1变通一下:
SELECT C.INVDATE, D.HAIER_YEAR, D.HAIER_SWEEK_TO_YEAR, C.GOODS_ID FROM ECC_OMS.V_TJ_STOCK C, ECC_OMS.DATE_WEEK_YEAR D WHERE C.INVDATE = D.SDATE AND ROWNUM = 1 ORDER BY C.INVDATE DESC
执行计划如下:
SELECT STATEMENT, GOAL = ALL_ROWS 3 1 33
COUNT STOPKEY
NESTED LOOPS 3 1 33
TABLE ACCESS BY INDEX ROWID ECC_OMS V_TJ_STOCK 2 1026081 18469458
INDEX FULL SCAN DESCENDING ECC_OMS V_TJ_STOCK_IDX01 2 1
TABLE ACCESS BY INDEX ROWID ECC_OMS DATE_WEEK_YEAR 1 1 15
INDEX UNIQUE SCAN ECC_OMS DATE_WEEK_YEAR 1 1
请各位大侠指教。
相关文章推荐
- oracle 与ms sql对日期字段使用group by
- oracle优化,hint的使用! (系统自动优化有时不是最好的,我们可以手动添加hint来提高查询效率
- oracle拼接字段和group by的使用
- 使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式: 1.select * from tb wh
- GROUP BY的另种使用方法:将结果集一列的内容作为一个单元格显示
- Delphi2010中ADOQuery使用Oracle的Blob字段出现错误解决方法
- Oracle PLSQL之HAVING后面的条件可由聚合函数构成,也可由GROUP BY后的字段构成
- oracle 两种方法不同的效率!务必少使用 not in
- gridview 实现排序 (在不是使用sqlDataSource控件,而在后台编码绑定gridview时,指定那个字段排序时使用。本例用了单层结构,可修改后应用于多层)
- Oracle 中多个字段显示成一列
- Oracle中使用fetch bulk collect into批量效率的读取
- Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
- oracle 使用order by 对汉字进行多字段排序
- 关于Oracle的exp和dblink转移数据效率比较以及DBLINK查询大字段方法
- 在Oracle+NHibernate环境下使用Guid字段
- ORACLE中BFILE字段的使用研究
- ORACLE用GROUP BY 来分组日期字段 按月分组
- 使用rownum对oracle结果集快速分页的sql
- 关于Oracle报错ORA-00979不是GROUP BY表达式
- hive:(group by, having;order by)的使用;group by+多个字段,以及wiki说的group by两种使用限制验证