为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000c
【操作系统】:
【CPU】:
【问题描述】*:activiti 5 流程引擎中带有 is null 的语句非常慢, 语句如下
select *
from ACT_RU_VARIABLE
where EXECUTION_ID_ = '35245043'
and TASK_ID_ is null
ACT_RU_VARIABLE 的数据量 只有 不到 30万条
select count(*) from ACT_RU_VARIABLE;
-- 248608
表结构如下
CREATE TABLE "ACT_RU_VARIABLE"
(
"ID_" NVARCHAR(64) NOT NULL,
"REV_" NUMBER(38,0),
"TYPE_" NVARCHAR(255) NOT NULL,
"NAME_" NVARCHAR(255) NOT NULL,
"EXECUTION_ID_" NVARCHAR(64),
"PROC_INST_ID_" NVARCHAR(64),
"TASK_ID_" NVARCHAR(64),
"BYTEARRAY_ID_" NVARCHAR(64),
"DOUBLE_" NUMBER(38,10),
"LONG_" NUMBER(19,0),
"TEXT_" NVARCHAR(2000),
"TEXT2_" NVARCHAR(2000));
CREATE OR REPLACE INDEX "ACT_IDX_VARIABLE_TASK_ID" ON "ACT_RU_VARIABLE"("TASK_ID_" ASC);
CREATE OR REPLACE INDEX "ACT_IDX_VAR_EXE" ON "ACT_RU_VARIABLE"("EXECUTION_ID_" ASC);
CREATE OR REPLACE INDEX "ACT_IDX_VAR_BYTEARRAY" ON "ACT_RU_VARIABLE"("BYTEARRAY_ID_" ASC);
CREATE OR REPLACE INDEX "ACT_IDX_VAR_NAME" ON "ACT_RU_VARIABLE"("NAME_" ASC);
CREATE OR REPLACE INDEX "ACT_IDX_VAR_PROCINST" ON "ACT_RU_VARIABLE"("PROC_INST_ID_" ASC);
执行计划如下
1 #NSET2: [11, 155, 534]
2 #PRJT2: [11, 155, 534]; exp_num(13), is_atom(FALSE)
3 #SLCT2: [11, 155, 534]; ACT_RU_VARIABLE.EXECUTION_ID_ = '35245043'
4 #BLKUP2: [11, 6215, 534]; ACT_IDX_VARIABLE_TASK_ID(ACT_RU_VARIABLE)
5 #SSEK2: [11, 6215, 534]; scan_type(ASC), ACT_IDX_VARIABLE_TASK_ID(ACT_RU_VARIABLE), scan_range[NULL,NULL]
看执行计划是 使用了 task_id 索引, 而没有使用 execution_id 的索引,
是否有办法让这种带有 is_null 条件的按照使用其他条件的索引?
我理解这里应该使用 execution_id 的索引, 而不应该使用 task_id 的索引
已解决:
可能是统计信息错误,原执行计划错误, 更新统计信息
STAT 100 ON ACT_RU_VARIABLE(EXECUTION_ID_);
SP_CLEAR_PLAN_CACHE();
create or replace index ACT_IDX_EXE_TASK ON ACT_RU_VARIABLE (EXECUTION_ID_ ASC ,TASK_ID_ ASC) ;
stat 100 on index ACT_IDX_EXE_TASK ;
创建一个复合索引.试试.