为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:LINUX
【CPU】:海光
【问题描述】*:SQL在oracle执行的很快,在达梦就查不出来
我们的UPLOAD_NATION_LOG表建表语句(数据量8亿条)
我们的DCSJ_RECIVE_SERVER_ADDRESS表建表语句(数据量50条)
CREATE TABLE "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"
(
"SERVER_URL" VARCHAR2(300) NOT NULL,
"LICENSE" VARCHAR2(200),
"RECIVE_VC_ID" VARCHAR2(400),
"DESCRIPTION" VARCHAR2(200),
"ENABLE" CHAR(1),
"DATA_TYPE" CHAR(1) DEFAULT '2' NOT NULL,
"INCLUDE_FEE_FIELD" CHAR(1) DEFAULT '0' NOT NULL,
"NATIONAL_ADDRESS" CHAR(1) DEFAULT '0' NOT NULL,
CONSTRAINT "PK_SERVER_URL" NOT CLUSTER PRIMARY KEY("SERVER_URL")) STORAGE(ON "etcdatatransform", CLUSTERBTR);
COMMENT ON TABLE "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS" IS '调查数据接收服务配置';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."SERVER_URL" IS '服务接口路径';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."LICENSE" IS '许可证书';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."RECIVE_VC_ID" IS '接收哪些路段数据(不配置默认为全部)';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."DESCRIPTION" IS '描述';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."ENABLE" IS '是否启用(1:启用,0:未启用)';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."DATA_TYPE" IS '数据类型:1即时数据,2正常数据';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."INCLUDE_FEE_FIELD" IS '是否包含交易金额字段:0不包含,1包含';
COMMENT ON COLUMN "ETCDATATRANSFORM"."DCSJ_RECIVE_SERVER_ADDRESS"."NATIONAL_ADDRESS" IS '是否部中心地址:0否,1是';
====================================================================================================================
我们的业务SQL:
select * from (select p.*, rownum r from UPLOAD_NATION_LOG p, DCSJ_RECIVE_SERVER_ADDRESS d where p.server_url = d.server_url and d.enable = '1' and d.NATIONAL_ADDRESS = '0' and status ='0' and save_time<=to_date('2026-08-24 09:30:00', 'yyyy-mm-dd hh24:mi:ss') ORDER BY p.save_time DESC) where rownum<=500;
====================================================================================================================
解释SQL
1 NSET2:[1, 1, 440]
2 PRJT2:[1, 1, 440];exp_num(9), is_atom(FALSE)
3 PRJT2:[1, 1, 440];exp_num(9), is_atom(FALSE)
4 SORT3:[1, 1, 440];key_num(1), partition_key_num(0), is_distinct(FALSE), top_flag(1), is_adaptive(0)
5 RN:[1, 1, 440]
6 SLCT2:[1, 1, 440];(P.STATUS = '0' AND P.SAVE_TIME <= var2)
7 HASH2 INNER JOIN:[1, 1, 440];LKEY_UNIQUE KEY_NUM(1); KEY(D.SERVER_URL=P.SERVER_URL) KEY_NULL_EQU(0)
8 NEST LOOP INDEX JOIN2:[1, 1, 440]
9 ACTRL:[1, 1, 440]
10 SLCT2:[1, 1, 144];(D.ENABLE = '1' AND D.NATIONAL_ADDRESS = '0')
11 CSCN2:[1, 50, 144];INDEX33555811(DCSJ_RECIVE_SERVER_ADDRESS as D); btr_scan(1)
12 BLKUP2:[1, 1, 109];IDX_URL_STATUS_SAVETIME(P)
13 SSEK2:[1, 1, 109];scan_type(ASC), IDX_URL_STATUS_SAVETIME(UPLOAD_NATION_LOG as P), scan_range((D.SERVER_URL,'0',null2),(D.SERVER_URL,'0',exp11)], is_global(0)
14 CSCN2:[137645, 831432546, 296];INDEX33555899(UPLOAD_NATION_LOG as P); btr_scan(1)
这个SQL在达梦2个小时都执行不出来是什么问题?
你这样查一下
select * /*+ TOP_ORDER_OPT_FLAG(1) */
from (select p.*,
rownum r
from UPLOAD_NATION_LOG p,
DCSJ_RECIVE_SERVER_ADDRESS d
where p.server_url = d.server_url
and d.enable = '1'
and d.NATIONAL_ADDRESS = '0'
and status = '0'
and save_time <= to_date('2026-08-24 09:30:00', 'yyyy-mm-dd hh24:mi:ss')
ORDER BY p.save_time DESC)
where rownum <= 500;
这个执行计划是达梦的还是oracle的,看最后一步执行计划缺个索引
14 CSCN2:[137645, 831432546, 296];INDEX33555899(UPLOAD_NATION_LOG as P); btr_scan(1)
添加上ORDER BY p.save_time DESC ,这个字段的降序desc索引
另外oracle是哪个版本,达梦和oracle优化器是不一样的,
7 HASH2 INNER JOIN:[1, 1, 440];LKEY_UNIQUE KEY_NUM(1); KEY(D.SERVER_URL=P.SERVER_URL) KEY_NULL_EQU(0)
8 NEST LOOP INDEX JOIN2:[1, 1, 440]
可以对比下达梦和oracle的执行计划,这2步走的是否一样,不一样的话添加/+ENABLE_HASH_JOIN(0)/在达梦执行看看,orcale优化器喜欢先走嵌套循环

您在select 后面加个 /*+ ADAPTIVE_NPLN_FLAG(0) */再执行看看