INNER JOIN表现为'<'或'>'条件

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:无法增加超时时间

Mar*_*ber 4

请先检查您是否确实使用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 行。

如果您希望在更短的时间内获得如此大的结果,您将需要高级优化。如果不了解您的数据和要求,就不可能提供一般性建议。