Hél*_*ves 6 sql oracle indexing inner-join
我有两个表的列SessionOrder.此列是整数数据类型,并具有以下索引:CREATE INDEX OSIDX_<internal name> ON <Entity>.
我正在执行以下查询:
SELECT i_0.rn, i_1.rn
FROM (
SELECT "RawEvent"."SessionOrder" as rn
FROM "RawEvent" i_0
WHERE something = 12
)
INNER JOIN (
SELECT "RawEvent"."SessionOrder" as rn
FROM "RawEvent" i_1
WHERE something = 14
) ON i_0.rn > i_1.rn
Run Code Online (Sandbox Code Playgroud)
这个查询的问题是ON i_0.rn > i_1.rn太慢而且超时.我替换它ON i_0.rn = i_1.rn,它非常快,但显然不会产生预期的结果.
有人知道一种方法来提高此查询的性能,避免超时吗?这个问题的另一个目标是理解它为什么会有糟糕的表现ON i_0.rn > i_1.rn.
PS:无法增加超时时间
请先检查您是否确实使用Oracle数据库。SQL 的语法建议使用其他 RDBMS 或某些预处理器。
为了了解此类查询的预期效果,您可以使用如下虚拟示例。
生成样本数据
create table myTab as
with mySeq as
(select rownum SessionOrder from dual connect by level <= 10000)
select 12 something, SessionOrder from mySeq union all
select 14 something, SessionOrder from mySeq
;
Run Code Online (Sandbox Code Playgroud)
这会生成两个子源,每个子源都有 10.000 个从 1 到 10.000 的序列。
测试查询
create table myRes as
select a.SessionOrder rn0, b.SessionOrder rn1
from myTab a join myTab b on a.SessionOrder > b.SessionOrder and
a.something = 12 and b.something = 14;
Run Code Online (Sandbox Code Playgroud)
在不到 30 秒的时间内生成 49.995.000 行。
如果您希望在更短的时间内获得如此大的结果,您将需要高级优化。如果不了解您的数据和要求,就不可能提供一般性建议。