为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:Windwos Server2016
【CPU】:32核64GB
【问题描述】*:两张表联合查询,每张表在40W条数据左右。关联的字段建立了聚焦索引。不排序分页查询1到20条,显示100毫秒,使用排序分页后需要接近3秒钟,需要如何优化?SQL如下
使用了排序的SQL
总共1个语句正依次执行...
*
FROM
(
SELECT
"MJZBL"."GUID" AS "GUID" ,
"MJZBL"."MZH" AS "MZH" ,
"MJZBL"."HZXM" AS "HZXM" ,
"GHDJ"."HZSFZH" AS "ZJHM" ,
"GHDJ"."HZNL" AS "HZNL" ,
"MJZBL"."HZYL" AS "HZYL" ,
"MJZBL"."JZRQSJ" AS "JZRQSJ",
"MJZBL"."KSMC" AS "KSMC" ,
"MJZBL"."SSDM" AS "SSDM" ,
"MJZBL"."CZBZDM" AS "CZBZDM",
"MJZBL"."JZYSXM" AS "JZYSXM",
"MJZBL"."LGBR" AS "LGBR" ,
"MJZBL"."CZJH" AS "CZJH" ,
"MJZBL"."PTCJSJ" AS "PTCJSJ",
"MJZBL"."YLJGDM" AS "YLJGDM",
"MJZBL"."YLJGMC" AS "YLJGMC",
"MJZBL"."HZZS" AS "ZS" ,
"MJZBL"."HZXBS" AS "XBS" ,
"MJZBL"."HZJWS" AS "JWS" ,
ROW_NUMBER() OVER(ORDER BY "MJZBL"."JZRQSJ" DESC) AS RowIndex
FROM
HISCENTER."MZ_MJZBL" "MJZBL"
INNER JOIN HISCENTER."MZ_GHDJ" "GHDJ"
ON "MJZBL"."YLJGDM" = "GHDJ"."YLJGDM" AND "MJZBL"."MZH" = "GHDJ"."MZH"
WHERE
"MJZBL"."JZRQSJ" >= '2023-1-1' AND "MJZBL"."JZRQSJ" <= '2023-9-9'
)
T
WHERE
RowIndex BETWEEN 81 AND 100
执行成功, 执行耗时2秒 214毫秒. 执行号:5680
1条语句执行成功
未使用排序的SQL
总共1个语句正依次执行...
*
FROM
(
SELECT
"MJZBL"."GUID" AS "GUID" ,
"MJZBL"."MZH" AS "MZH" ,
"MJZBL"."HZXM" AS "HZXM" ,
"GHDJ"."HZSFZH" AS "ZJHM" ,
"GHDJ"."HZNL" AS "HZNL" ,
"MJZBL"."HZYL" AS "HZYL" ,
"MJZBL"."JZRQSJ" AS "JZRQSJ",
"MJZBL"."KSMC" AS "KSMC" ,
"MJZBL"."SSDM" AS "SSDM" ,
"MJZBL"."CZBZDM" AS "CZBZDM",
"MJZBL"."JZYSXM" AS "JZYSXM",
"MJZBL"."LGBR" AS "LGBR" ,
"MJZBL"."CZJH" AS "CZJH" ,
"MJZBL"."PTCJSJ" AS "PTCJSJ",
"MJZBL"."YLJGDM" AS "YLJGDM",
"MJZBL"."YLJGMC" AS "YLJGMC",
"MJZBL"."HZZS" AS "ZS" ,
"MJZBL"."HZXBS" AS "XBS" ,
"MJZBL"."HZJWS" AS "JWS" ,
ROWNUM AS RowIndex
FROM
HISCENTER."MZ_MJZBL" "MJZBL"
INNER JOIN HISCENTER."MZ_GHDJ" "GHDJ"
ON "MJZBL"."YLJGDM" = "GHDJ"."YLJGDM" AND "MJZBL"."MZH" = "GHDJ"."MZH"
WHERE
"MJZBL"."JZRQSJ" >= '2023-1-1' AND "MJZBL"."JZRQSJ" <= '2023-9-9'
)
T
WHERE
RowIndex BETWEEN 81 AND 100
执行成功, 执行耗时101毫秒. 执行号:5681
1条语句执行成功
查询计划如下
这个性能问题还是比较复杂,原因多样。大家都不熟悉的情况下。可以考虑付费的服务。
毕竟自己折腾也是要成本的。
可以把解决的过程给大伙看看。
做一个小实验,看看下面这个查询的耗时大概多少
SELECT A.RID
FROM (SELECT ROWID AS RID
,ROW_NUMBER() OVER(ORDER BY JZRQSJ DESC) AS RowIndex
FROM MJZBL
WHERE JZRQSJ >= '2023-1-1'
AND JZRQSJ <= '2023-9-9'
) A
WHERE RowIndex BETWEEN 81 AND 100
先在表MZ_MJZBL上面创建一个列JZRQSJ的倒序索引,另外两张表的连接列YLJGDM和MZH创建一个联合索引,创建索引后更新一下索引的统计信息,再看看执行效果