糊涂了,帮忙看看怎么优化?谢谢。

[复制链接]
查看11 | 回复9 | 2008-2-13 12:43:03 | 显示全部楼层 |阅读模式
/***相手科目の設定***/

UPDATE
UT_JOURNAL t

SET
(t.OTHER_DEPT_CD, t.OTHER_AC_CD, t.OTHER_SUB_AC_CD)

=

(

SELECT
x.DEPT_CD, x.AC_CD, x.SUB_AC_CD

FROM
UT_JOURNAL x

WHERE
0=0

AND
x.COMPANY_CD
= 'TEST'

AND
x.JNL_GRP_NO
= '0000000225'

AND
x.APP_MONTH
= t.APP_MONTH

AND
x.AC_IF_TYPE
= t.AC_IF_TYPE

AND
x.SLIP_CNT_ID
= t.SLIP_CNT_ID

AND
x.DC_TYPE
= '1'

AND
x.JNL_NO
= t.JNL_NO

AND
x.JNL_NO_SEQ

=

(

SELECT
MAX(y.JNL_NO_SEQ)

FROM
UT_JOURNAL y

WHERE
0=0

AND
y.COMPANY_CD
= 'TEST'

AND
y.JNL_GRP_NO
= '0000000225'

AND
y.APP_MONTH
= t.APP_MONTH

AND
y.AC_IF_TYPE
= t.AC_IF_TYPE

AND
y.SLIP_CNT_ID
= t.SLIP_CNT_ID

AND
y.DC_TYPE
= '1'

AND
y.JNL_NO
= t.JNL_NO

AND
y.JNL_NO_SEQ
/
2790行が更新されました。

実行計画
----------------------------------------------------------
Plan hash value: 2512181038
----------------------------------------------------------------------------------------------
| Id| Operation
| Name
| Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT
|
| 1 | 100 | 4 (0)| 00:00:01 |
| 1 |UPDATE
| UT_JOURNAL| | |
|
|
| 2 | TABLE ACCESS BY INDEX ROWID| UT_JOURNAL| 1 | 100 | 4 (0)| 00:00:01 |
|*3 |INDEX RANGE SCAN
| UT_JOURNAL_PK | 1 | | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| UT_JOURNAL| 1 |59 | 3 (0)| 00:00:01 |
|*5 |INDEX UNIQUE SCAN | UT_JOURNAL_PK | 1 | | 2 (0)| 00:00:01 |
| 6 | SORT AGGREGATE |
| 1 |43 |
|
|
|*7 |INDEX RANGE SCAN| UT_JOURNAL_PK | 1 |43 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("T"."COMPANY_CD"='TEST' AND "T"."JNL_GRP_NO"='0000000225' AND

"T"."DC_TYPE"='0')
filter("T"."DC_TYPE"='0')
5 - access("X"."COMPANY_CD"='TEST' AND "X"."JNL_GRP_NO"='0000000225' AND

"X"."APP_MONTH"=:B1 AND "X"."AC_IF_TYPE"=:B2 AND "X"."SLIP_CNT_ID"=:B3 AND

"X"."JNL_NO"=:B4 AND "X"."JNL_NO_SEQ"= (SELECT MAX("Y"."JNL_NO_SEQ") FROM

"UT_JOURNAL" "Y" WHERE "Y"."JNL_NO_SEQ"
SQL>
SQL>
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
你的这个语句的目的是什么?
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层

试试如下的语句, 不知道是否等效!
UPDATE UT_JOURNAL t
SET (t.OTHER_DEPT_CD, t.OTHER_AC_CD, t.OTHER_SUB_AC_CD) = (select tmp.DEPT_CD,

tmp.AC_CD,

tmp.SUB_AC_CD

from (SELECT x.DEPT_CD,

x.AC_CD,

x.SUB_AC_CD,

x.APP_MONTH,

x.AC_IF_TYPE,

x.SLIP_CNT_ID,

x.JNL_NO,

row_number() over(partition by x.APP_MONTH, x.AC_IF_TYPE, x.SLIP_CNT_ID, x.JNL_NO order by x.JNL_NO_SEQ desc) max_val

FROM UT_JOURNAL x

WHERE 0 = 0

AND x.COMPANY_CD = 'TEST'

AND x.JNL_GRP_NO = '0000000225'

AND x.DC_TYPE = '1') tmp

where tmp.max_val = 1

AND tmp.APP_MONTH = t.APP_MONTH

AND tmp.AC_IF_TYPE = t.AC_IF_TYPE

AND tmp.SLIP_CNT_ID = t.SLIP_CNT_ID

AND tmp.JNL_NO = t.JNL_NO)
WHERE 0 = 0
AND t.COMPANY_CD = 'TEST'
AND t.JNL_GRP_NO = '0000000225'
AND t.DC_TYPE = '0';

回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
----------------------------------------------------------------------------------------------
| Id| Operation
| Name
| Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT
|
| 1 | 100 | 4 (0)| 00:00:01 |
| 1 |UPDATE
| UT_JOURNAL| | |
|
|
| 2 | TABLE ACCESS BY INDEX ROWID| UT_JOURNAL| 1 | 100 | 4 (0)| 00:00:01 |
|*3 |INDEX RANGE SCAN
| UT_JOURNAL_PK | 1 | | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| UT_JOURNAL| 1 |59 | 3 (0)| 00:00:01 |
|*5 |INDEX UNIQUE SCAN | UT_JOURNAL_PK | 1 | | 2 (0)| 00:00:01 |
| 6 | SORT AGGREGATE |
| 1 |43 |
|
|
|*7 |INDEX RANGE SCAN| UT_JOURNAL_PK | 1 |43 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

这个是执行计划,不大会看。
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
改写一下原语句!
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
哪一列是唯一键啊?
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
CONSTRAINT UT_JOURNAL_PK PRIMARY KEY (COMPANY_CD, JNL_GRP_NO, APP_MONTH, AC_IF_TYPE, SLIP_CNT_ID, JNL_NO, JNL_NO_SEQ, DC_TYPE)
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 bell6248 于 2008-3-28 16:43 发表
改写一下原语句!

现在问题好像在max的地方,有什么办法替代max么?
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
我把表结构,部分数据,传上来了。
实际的业务数据暂时有16万条。
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行