如何避免频繁查询相同的字段而不求助于使用临时 table?
How can I avoid frequently querying the same fields without resorting to using a temp table?
所以我有以下查询(出于安全原因进行了混淆处理)但是 运行:
需要几个小时
SELECT t.apple as APPLE,
t.orange as ORANGE,
t.kiwi as KIWI
FROM table_in_linked_db@db_link t
WHERE (t.pear = 'FOO' OR t.grape = 'BAR')
AND t.apple NOT IN
(SELECT val
FROM table_in_my_db
WHERE type = 'APPLE')
OR t.orange NOT IN
(SELECT val
FROM table_in_my_db
WHERE type = 'ORANGE');
通常,在其他语言中,我会在开头创建一个临时文件 table,其中包含 table_in_my_db
中的值,以避免必须为 [=13] 中的每一行查询和遍历它=].但是根据我的阅读,创建和销毁 temp tables 在 Oracle SQL 中是不好的做法,因为只有数据是临时的。
有人知道我可以使用的替代方案吗?可能通过重写我现有的查询?
您可以尝试将以下索引添加到子查询中的 table:
CREATE INDEX idx1 ON table_in_my_db (type, val);
这应该让 Oracle 非常快速地评估两个子查询,从而提高整体查询的性能。
所以我有以下查询(出于安全原因进行了混淆处理)但是 运行:
需要几个小时SELECT t.apple as APPLE,
t.orange as ORANGE,
t.kiwi as KIWI
FROM table_in_linked_db@db_link t
WHERE (t.pear = 'FOO' OR t.grape = 'BAR')
AND t.apple NOT IN
(SELECT val
FROM table_in_my_db
WHERE type = 'APPLE')
OR t.orange NOT IN
(SELECT val
FROM table_in_my_db
WHERE type = 'ORANGE');
通常,在其他语言中,我会在开头创建一个临时文件 table,其中包含 table_in_my_db
中的值,以避免必须为 [=13] 中的每一行查询和遍历它=].但是根据我的阅读,创建和销毁 temp tables 在 Oracle SQL 中是不好的做法,因为只有数据是临时的。
有人知道我可以使用的替代方案吗?可能通过重写我现有的查询?
您可以尝试将以下索引添加到子查询中的 table:
CREATE INDEX idx1 ON table_in_my_db (type, val);
这应该让 Oracle 非常快速地评估两个子查询,从而提高整体查询的性能。