N J*_*N J 0 sql oracle sql-tuning
我有数十亿的记录表,表结构如下:
ID NUMBER PRIMARY KEY,
MY_SEARCH_COLUMN NUMBER,
Run Code Online (Sandbox Code Playgroud)
MY_SEARCH_COLUMN 将具有最多15位数的数字值.
我想要的是,如果匹配任何特定记录,我将只得到匹配的值,
即:如果我输入WHERE MY_SEARCH_COLUMN = 123454321并且表有值,123454321则只返回此值.
但如果确切的值不匹配,我将不得不从表中获得接下来的10个值.
即:如果我输入WHERE MY_SEARCH_COLUMN = 123454321并且列没有值,123454321那么它应该从表中返回10个大于的值123454321
这两种情况都应该包含在单个SQL查询中,我必须记住查询的性能.我已经在MY_SEARCH_COLUMN列上创建了索引,因此欢迎其他建议来改进性能.
如果不使用proc或者某些动态SQL,这可能很棘手,但我们可以尝试ROW_NUMBER在这里使用:
WITH cte AS (
SELECT ID, MY_SEARCH_COLUMN,
ROW_NUMBER() OVER (ORDER BY MY_SEARCH_COLUMN) rn
FROM yourTable
WHERE MY_SEARCH_COLUMN >= 123454321
)
SELECT *
FROM cte
WHERE rn <= CASE WHEN EXISTS (SELECT 1 FROM yourTable WHERE MY_SEARCH_COLUMN = 123454321)
THEN 1
ELSE 10 END;
Run Code Online (Sandbox Code Playgroud)
上述查询的基本思想是我们为与目标匹配的所有记录或更大的记录分配行号.然后,在完全匹配的情况下,我们使用行号1进行查询,或者在不匹配的情况下使用最多10的所有行号进行查询.