gpt4 book ai didi

oracle - 如何使用子查询 Oracle 优化此 SELECT

转载 作者:行者123 更新时间:2023-12-02 05:29:42 25 4
gpt4 key购买 nike

这是我的查询,

   SELECT ID As Col1,
(
SELECT VID FROM TABLE2 t
WHERE (a.ID=t.ID or a.ID=t.ID2)
AND t.STARTDTE =
(
SELECT MAX(tt.STARTDTE)
FROM TABLE2 tt
WHERE (a.ID=tt.ID or a.ID=tt.ID2) AND tt.STARTDTE < SYSDATE
)
) As Col2
FROM TABLE1 a

表1有48850条记录,表2有15944098条记录。

我在 TABLE2 中的 ID、ID 和 STARTDTE、STARTDTE、ID、ID2 和 STARTDTE 上有单独的索引。

查询还是太慢了。如何改进?请帮忙。

最佳答案

我猜测内部查询中的 OR 正在扰乱优化器使用索引的能力。此外,我不会推荐一种可以扫描所有 TABLE2 给定大小的解决方案。

这就是为什么在这种情况下我会建议使用一个函数来有效地检索您要查找的信息(每次调用 2 次索引扫描):

CREATE OR REPLACE FUNCTION getvid(p_id table1.id%TYPE) 
RETURN table2.vid%TYPE IS
l_result table2.vid%TYPE;
BEGIN
SELECT vid
INTO l_result
FROM (SELECT vid, startdte
FROM (SELECT vid, startdte
FROM table2 t
WHERE t.id = p_id
AND t.startdte < SYSDATE
ORDER BY t.startdte DESC)
WHERE rownum = 1
UNION ALL
SELECT vid, startdte
FROM (SELECT vid, startdte
FROM table2 t
WHERE t.id2 = p_id
AND t.startdte < SYSDATE
ORDER BY t.startdte DESC)
WHERE rownum = 1
ORDER BY startdte DESC)
WHERE rownum = 1;
RETURN l_result;
END;

您的 SQL 将变为:

SELECT ID As Col1,
getvid(a.id) vid
FROM TABLE1 a

确保在 table2(id, startdte DESC)table2(id2, startdte DESC) 上都有索引。索引的顺序非常重要。

关于oracle - 如何使用子查询 Oracle 优化此 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12585016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com