为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8 64位 1-3-100-2023.12.26-213242-20081-ENT
【操作系统】:win10
【CPU】:
CPU名称 英特尔 Core i5-10400 CPU @ 2.90GHz 六核
厂商 GenuineIntel
核心数 6
默认频率 2901 MHz
外频 100 MHz
当前频率 800 MHz
二级缓存 1536 KB
三级缓存 12288 KB
CPU电压 0.900 V
CPU序列号 BFEBFBFF000A0653
数据宽度 64
指令集 MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,EM64T
扩展版本 Ext.Family 0 Ext.Model 10
在优化sql语句查询时,根据《达梦系统管理员手册》查询优化——>22.9 查询计划重用中的描述,对查询计划重用的参数USE_PLN_POOL设置为了1查询结果集重用参数RS_CAN_CACHE是0(我好像没更改,默认值就是0)
SELECT /*+ RESULT_CACHE ,ORDER(dl, xl, pm,fd),USE_HASH(dl,xl), USE_HASH(xl,pm),USE_NL_WITH_INDEX(pm,code)*/ dl.Code AS JiJDLBH, dl.Name AS JiJDL, xl.Code AS JiJXLBH, xl.Name AS JiJXL,
pm.Code AS JiJPMBH, pm.Name AS JiJPM, pm.IsSubsidyMtype, fd.Code AS JiJFDBH, fd.Name AS JiJFD, fd.Year,
fd.Batch, fd.State, fd.AreaCode, fd.GuoJBT, fd.GuoJBT_TeSX, fd.ShengJBT, fd.ShengJBT_TeSX, fd.ShiJBT, fd.XianJBT,
fd.ShiJBT_TeSX, fd.XianJBT_TeSX, fd.Id AS FDID, fd.MKind, fd.IsCollectInfo, fd.Para, pm.IschkExhaustSmoke, fd.Unit,
fd.isSubsidyPending, pm.MCerttype AS pmcerttype,fd.MCerttype AS fdcerttype, fd.Remark, ISNULL(fd.IsSupEqu, 0) AS IsSupEqu,
ISNULL(fd.SupEquName, '') AS SupEquName, ISNULL(fd.SupEquGuoJBT, 0) AS SupEquGuoJBT,
ISNULL(fd.SupEquShengBT, 0) AS SupEquShengBT, ISNULL(fd.SupEquUnit, '') AS SupEquUnit,fd.IsShengAdmissibility as IsMachineTypeAdmissibility
FROM TD_MACHINE_TYPE_PUSH AS dl INNER JOIN
TD_MACHINE_TYPE_PUSH AS xl ON dl.Code = LEFT(xl.Code, 2) AND LEN(xl.Code) = 4 AND dl.AreaCode = xl.AreaCode AND
dl.Year = xl.Year AND dl.Batch = xl.Batch
INNER JOIN TD_MACHINE_TYPE_PUSH AS pm ON xl.Code = LEFT(pm.Code, 4) AND LEN(pm.Code) = 6 AND
xl.AreaCode = pm.AreaCode AND xl.Year = pm.Year AND xl.Batch = pm.Batch
LEFT OUTER JOIN
TD_MACHINE_TYPE_PUSH AS fd ON pm.Code = LEFT(fd.Code, 6) AND LEN(fd.Code) = 8 AND pm.AreaCode = fd.AreaCode AND pm.Year = fd.Year AND pm.Batch = fd.Batch
WHERE isnull(fd.IsCollectInfo,0)=0;
SP_SQL_STAT_INIT ('SELECT /*+ RESULT_CACHE ,ORDER(dl, xl, pm,fd),USE_HASH(dl,xl), USE_HASH(xl,pm),USE_NL_WITH_INDEX(pm,code)*/ dl.Code AS JiJDLBH, dl.Name AS JiJDL, xl.Code AS JiJXLBH, xl.Name AS JiJXL,
pm.Code AS JiJPMBH, pm.Name AS JiJPM, pm.IsSubsidyMtype, fd.Code AS JiJFDBH, fd.Name AS JiJFD, fd.Year,
fd.Batch, fd.State, fd.AreaCode, fd.GuoJBT, fd.GuoJBT_TeSX, fd.ShengJBT, fd.ShengJBT_TeSX, fd.ShiJBT, fd.XianJBT,
fd.ShiJBT_TeSX, fd.XianJBT_TeSX, fd.Id AS FDID, fd.MKind, fd.IsCollectInfo, fd.Para, pm.IschkExhaustSmoke, fd.Unit,
fd.isSubsidyPending, pm.MCerttype AS pmcerttype,fd.MCerttype AS fdcerttype, fd.Remark, ISNULL(fd.IsSupEqu, 0) AS IsSupEqu,
ISNULL(fd.SupEquName, '') AS SupEquName, ISNULL(fd.SupEquGuoJBT, 0) AS SupEquGuoJBT,
ISNULL(fd.SupEquShengBT, 0) AS SupEquShengBT, ISNULL(fd.SupEquUnit, '') AS SupEquUnit,fd.IsShengAdmissibility as IsMachineTypeAdmissibility
FROM TD_MACHINE_TYPE_PUSH AS dl INNER JOIN
TD_MACHINE_TYPE_PUSH AS xl ON dl.Code = LEFT(xl.Code, 2) AND LEN(xl.Code) = 4 AND dl.AreaCode = xl.AreaCode AND
dl.Year = xl.Year AND dl.Batch = xl.Batch
INNER JOIN TD_MACHINE_TYPE_PUSH AS pm ON xl.Code = LEFT(pm.Code, 4) AND LEN(pm.Code) = 6 AND
xl.AreaCode = pm.AreaCode AND xl.Year = pm.Year AND xl.Batch = pm.Batch
LEFT OUTER JOIN
TD_MACHINE_TYPE_PUSH AS fd ON pm.Code = LEFT(fd.Code, 6) AND LEN(fd.Code) = 8 AND pm.AreaCode = fd.AreaCode AND pm.Year = fd.Year AND pm.Batch = fd.Batch
WHERE isnull(fd.IsCollectInfo,0)=0');
执行成功, 执行耗时1秒 128毫秒. 执行号:2709
影响了18条记录
1条语句执行成功
这个查询里貌似 fd 表才是结果集的主表吧?dl、xl和pm貌似都是为了取CODE/NAME用的。。。实在没看明白
你得空时可以给 TD_MACHINE_TYPE_PUSH 加个索引
CREATE INDEX IDX_TD_MACHINE_TYPE_PUSH_TST ON TD_MACHINE_TYPE_PUSH(CODE,BATCH,AREACODE,YEAR);
然后查一下下面这个SQL的执行计划,看看索引是否能用上。
不过实在是没看懂你之前SQL的逻辑,所以下面这个SQL查询结果可能与你预期目标不一致。
SELECT dl.Code AS JiJDLBH, dl.Name AS JiJDL
, xl.Code AS JiJXLBH, xl.Name AS JiJXL
, pm.Code AS JiJPMBH, pm.Name AS JiJPM
, pm.IsSubsidyMtype, fd.Code AS JiJFDBH
, fd.Name AS JiJFD, fd.Year
, fd.Batch, fd.State, fd.AreaCode, fd.GuoJBT, fd.GuoJBT_TeSX, fd.ShengJBT, fd.ShengJBT_TeSX, fd.ShiJBT, fd.XianJBT
, fd.ShiJBT_TeSX, fd.XianJBT_TeSX, fd.Id AS FDID, fd.MKind, fd.IsCollectInfo, fd.Para, pm.IschkExhaustSmoke, fd.Unit
, fd.isSubsidyPending, pm.MCerttype AS pmcerttype,fd.MCerttype AS fdcerttype, fd.Remark, ISNULL(fd.IsSupEqu, 0) AS IsSupEqu
, ISNULL(fd.SupEquName, '') AS SupEquName, ISNULL(fd.SupEquGuoJBT, 0) AS SupEquGuoJBT
, ISNULL(fd.SupEquShengBT, 0) AS SupEquShengBT, ISNULL(fd.SupEquUnit, '') AS SupEquUnit,fd.IsShengAdmissibility as IsMachineTypeAdmissibility
FROM TD_MACHINE_TYPE_PUSH AS fd
LEFT JOIN TD_MACHINE_TYPE_PUSH AS pm
ON pm.Code = SUBSTR(fd.Code,1,6)
AND LEN(pm.Code) = 6
AND pm.AreaCode = fd.AreaCode
AND pm.Year = fd.Year
AND pm.Batch = fd.Batch
LEFT JOIN TD_MACHINE_TYPE_PUSH AS xl
ON xl.Code = SUBSTR(fd.Code,1,4)
AND LEN(xl.Code) = 4
AND xl.AreaCode = fd.AreaCode
AND xl.Year = fd.Year
AND xl.Batch = fd.Batch
LEFT JOIN TD_MACHINE_TYPE_PUSH AS dl
ON dl.Code = SUBSTR(fd.Code,1,2)
AND LEN(dl.Code) = 2
AND dl.AreaCode = fd.AreaCode
AND dl.Year = fd.Year
AND dl.Batch = fd.Batch
;
物化视图查询也还行,比这原本的快多了,嘎嘎!!!
谢谢社区的各位老师!!!
您这语句恐怕快不了,过滤条件,连接条件上全部都有函数,有索引都走不了,可以把语句的执行计划也贴出来看看