【发布时间】:2017-07-28 10:58:34
【问题描述】:
使用 SQL Developer 更改 Oracle 存储过程。
输入:逗号分隔的 ID。 (例如:'P23,P37,P39,P45') 编辑:请注意输入是一个字符串,不是一个字符串数组。此外,字符串可能不仅仅是 4 个 ID。最高可达 200 左右。
想从没有那些输入 ID 的表中找出。
以下太慢了。大约 300 行数据(在表中)但大约需要 20 秒。所以我想重写。请给我一些关于如何做的提示。
ID_Array 是 'P23,P37,P39,P45'。
SELECT * FROM StudentInfo
WHERE StudentClass = 'Primary5A'
AND StudentID NOT IN
(
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
)
AND Height <= 150;
你们中的一些人可能已经知道了。以下
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
会将 ID_Array 变成一个有四行的表(类似表的结构?):
+-----+
| P23 |
| P37 |
| P39 |
| P45 |
+-----+
【问题讨论】:
-
硬编码需要多长时间:
AND StudentID NOT IN ('P23','P37','P39','P45') AND Height <= 150?两者的执行计划是什么?您的统计数据是最新的吗? -
当您操作的是字符串而不是表格时,拆分逗号分隔字符串的各种方法之间几乎没有区别。我认为 Alex 建议的还有其他问题。
-
我对字符串进行了硬编码。执行计划:基数:184,成本:191,使用 real 数据。它对 StudentInfo 进行了全表扫描。使用下面的答案,两个执行计划都非常低(例如成本:5)。
标签: oracle database-performance notin