SELECT a AS a,
b AS b,
c AS c,
d AS d,
e AS e,
f AS f,
g AS g,
h AS h
FROM (
SELECT P.*,
ROW_NUMBER() OVER (PARTITION BY p.a, RANK_NM
ORDER BY P.ID DESC) RW_NUM
FROM (
SELECT T.a,
T.b,
T.c,
T.d,
T.e,
T.f,
T.g,
T.h,
T.ID
DENSE_RANK() over (PARTITION BY T.a
ORDER BY T.b, T.c, T.d
, T.e, T.f, T.g, T.h
DESC) RANK_NM
FROM TEST_TABLE T ) p) Y
WHERE RW_NUM = 1
我从生产团队调整了这个查询,我没有生产和其他东西的访问权限,我必须向生产人员提供执行查询,他们期待奇迹。问题是TEST_TABLE包含9800万条记录,这个查询用于信息并创建一个巨大的缓存。有没有什么方法可以用更好的方式编写查询,只需查看查询。我知道很多东西需要和调整所需的信息,但这就是我得到的。 :)数据库是oracle 10 g。
答案 0 :(得分:0)
正如Podiluska所说,优化查询而无法查看查询计划或添加索引有点精神错误。
但是,似乎确实存在一些冗余的“order by”操作:内部查询具有:
ORDER BY T.b, T.c, T.d
, T.e, T.f, T.g, T.h
DESC)
以外的查询有:
ORDER BY P.ID DESC
查询优化器可能会忽略内部顺序,但如果您可以通过语句删除该顺序,则可能会得到一些改进,尤其是在没有匹配的索引的情况下。
答案 1 :(得分:0)
除非你隐藏了其他字段,否则这个查询真正做的是
SELECT DISTINCT a, b, c, d, e, f, g, h FROM TEST_TABLE
如果有更多的领域,内部分析功能是多余的,正如内维尔指出的那样。你可以像这样重写它:
SELECT
a, b, c, d, e, f, g, h, extra1, extra2
FROM
(
SELECT
a, b, c, d, e, f, g, h, extra1, extra2,
ROW_NUMBER() OVER(PARTITION BY a, b, c, d, e, f, g, h ORDER BY ID DESC) RW_NUM
FROM TEST_TABLE
)
WHERE RW_NUM = 1