SELECT A.ORG_RRN , A.DOC_ID FROM WIP_WO A INNER JOIN WIP_WO B ON B.ORG_RRN = A.ORG_RRN AND B.PARENT_ID = A.DOC_ID INNER JOIN MM_BOM D ON D.ORG_RRN = A.ORG_RRN AND D.NAME = A.RESERVED3 WHERE D.RESERVED8 IN ('LAM') 怎么优化
时间: 2024-02-27 07:51:20 浏览: 91
对于这个查询语句,可以考虑以下优化:
1. 确保表 WIP_WO 和 MM_BOM 上有适当的索引,以便加快连接操作和筛选操作的速度。具体可以根据查询语句中使用的列建立索引,例如在 WIP_WO 上可以建立 (ORG_RRN, DOC_ID, RESERVED3) 的复合索引,在 MM_BOM 上可以建立 (ORG_RRN, NAME, RESERVED8) 的复合索引。
2. 尝试使用 EXISTS 或者 IN 子查询来代替 INNER JOIN,这样可以避免产生笛卡尔积,提高查询效率。
3. 如果数据量较大,可以考虑分批次查询,使用 LIMIT 和 OFFSET 控制每次查询的数据量,避免一次查询过多数据造成性能问题。
下面是使用 EXISTS 来替换 INNER JOIN 的优化示例:
```
SELECT A.ORG_RRN, A.DOC_ID
FROM WIP_WO A
WHERE EXISTS (
SELECT 1
FROM WIP_WO B, MM_BOM D
WHERE B.ORG_RRN = A.ORG_RRN
AND B.PARENT_ID = A.DOC_ID
AND D.ORG_RRN = A.ORG_RRN
AND D.NAME = A.RESERVED3
AND D.RESERVED8 IN ('LAM')
);
```
这样可以避免 INNER JOIN 产生的笛卡尔积,提高查询效率。
相关问题
SELECT * FROM PMS_SHEET ps, PMS_EQUIPMENT pe WHERE ps.EQUIPMENT_TYPE = pe.EQUIPMENT_TYPE AND ps.IS_ACTIVE = 'Y' AND (ps.ORG_RRN = :orgRrn OR ps.ORG_RRN = 0) AND pe.IS_ACTIVE = 'Y' AND (pe.ORG_RRN = :orgRrn OR pe.ORG_RRN = 0) AND ps.CATEGORY = 'DC' AND (ps."TYPE" <> 'SC' OR (ps."TYPE" ='SC' AND EXISTS ( SELECT 1 FROM PMS_SCHEDULE psd WHERE psd.EQUIPMENT_ID = pe.EQUIPMENT_ID AND psd.SHEET_RRN = ps.OBJECT_RRN AND psd.SCHEDULE_TIME BETWEEN '2023/06/01 00:00:00' AND '2023/06/30 23:59:59' ) ) ) 这个sql执行的结果为什么会报错 ORA-01861: 文字与格式字符串不匹配
这个SQL语句中包含了两个日期常量:'2023/06/01 00:00:00'和'2023/06/30 23:59:59'。然而,Oracle数据库中默认的日期格式与这些常量的格式不匹配,因此会报错ORA-01861。
为了解决这个问题,可以将常量中的斜杠替换为短横线,或者使用TO_DATE函数将常量转换为日期类型。例如:
```
SELECT * FROM PMS_SHEET ps, PMS_EQUIPMENT pe
WHERE ps.EQUIPMENT_TYPE = pe.EQUIPMENT_TYPE
AND ps.IS_ACTIVE = 'Y'
AND (ps.ORG_RRN = :orgRrn OR ps.ORG_RRN = 0)
AND pe.IS_ACTIVE = 'Y'
AND (pe.ORG_RRN = :orgRrn OR pe.ORG_RRN = 0)
AND ps.CATEGORY = 'DC'
AND (ps."TYPE" <> 'SC'
OR (ps."TYPE" ='SC'
AND EXISTS (
SELECT 1 FROM PMS_SCHEDULE psd
WHERE psd.EQUIPMENT_ID = pe.EQUIPMENT_ID
AND psd.SHEET_RRN = ps.OBJECT_RRN
AND psd.SCHEDULE_TIME BETWEEN TO_DATE('2023-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('2023-06-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
)
)
);
```
或者:
```
SELECT * FROM PMS_SHEET ps, PMS_EQUIPMENT pe
WHERE ps.EQUIPMENT_TYPE = pe.EQUIPMENT_TYPE
AND ps.IS_ACTIVE = 'Y'
AND (ps.ORG_RRN = :orgRrn OR ps.ORG_RRN = 0)
AND pe.IS_ACTIVE = 'Y'
AND (pe.ORG_RRN = :orgRrn OR pe.ORG_RRN = 0)
AND ps.CATEGORY = 'DC'
AND (ps."TYPE" <> 'SC'
OR (ps."TYPE" ='SC'
AND EXISTS (
SELECT 1 FROM PMS_SCHEDULE psd
WHERE psd.EQUIPMENT_ID = pe.EQUIPMENT_ID
AND psd.SHEET_RRN = ps.OBJECT_RRN
AND psd.SCHEDULE_TIME BETWEEN '2023-06-01 00:00:00' AND '2023-06-30 23:59:59'
)
)
);
```
优化这段SQL: SELECT CONCAT(UM.USER_ID,UM.USER_NAME) Creat_USERNAME, CONCAT(UM.USER_ID,UM.USER_NAME) Update_USERNAME FROM P1RPT.CARRIER_MASTER CM, P1RPT.USER_MASTER UM WHERE 1=1 AND CM.CREATE_USER_RRN = UM.USER_RRN AND CM.UPDATE_USER_RRN = UM.USER_RRN
针对您给出的SQL语句,我可以做如下优化:
1. 使用 ANSI SQL 的 JOIN 语法,代替原有的 WHERE 条件
2. 使用别名简化表名,提高可读性
3. 使用 CONCAT_WS 函数,代替 CONCAT 函数,提高代码可读性
综上,优化后的SQL查询语句如下:
```
SELECT CONCAT_WS('', UM.USER_ID, UM.USER_NAME) AS Create_USERNAME,
CONCAT_WS('', UM.USER_ID, UM.USER_NAME) AS Update_USERNAME
FROM P1RPT.CARRIER_MASTER CM
JOIN P1RPT.USER_MASTER UM ON CM.CREATE_USER_RRN = UM.USER_RRN AND CM.UPDATE_USER_RRN = UM.USER_RRN
```
以上SQL语句中,使用 JOIN 语法代替 WHERE 条件,提高了查询效率;使用表别名简化了表名,提高了SQL代码的可读性;使用 CONCAT_WS 函数代替 CONCAT 函数,提高了代码可读性。
阅读全文