【问题标题】:Oracle tuning for query with query annidateOracle 使用查询 annidate 调整查询
【发布时间】:2017-03-02 04:13:00
【问题描述】:

我正在尝试改进查询。我打开了一个票证数据集。每张票都有不同的行,每一行表示票的更新。有一个字段 (dt_update) 每行都不同。

我在 st_remedy_full_light 中有这个索引。
IDX_ASSIGNMENT(分配)
IDX_REMEDY_INC_ID (REMEDY_INC_ID)
IDX_REMDULL_LIGHT_DTUPD (DT_UPDATE)

现在,查询在 8 秒内执行。对我来说很高。

WITH last_ticket AS
  ( SELECT *
   FROM st_remedy_full_light a
   WHERE a.dt_update IN
     ( SELECT MAX(dt_update)
       FROM st_remedy_full_light
       WHERE remedy_inc_id = a.remedy_inc_id
     )
  )
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 

这是计划 我怎样才能改进这个查询?

附:这只是一个大查询的一部分

附加信息: - st_remedy_full_light 表包含 529.507 行

【问题讨论】:

  • 可以是多个 'st_remedy_full_light',每个 'remedy_inc_id' 具有相同的 'dt_update'?
  • 如果您不想/不能将子查询更改为 Tony安德鲁斯建议。 IE。包含多列的单个索引,而不是每列的索引 - Oracle 将只能使用其中一个单列索引进行查询,即使您在您的询问。这样的索引可能也会对 Tony Andrew 的建议查询有所帮助。
  • @EvgeniyK。不仅remediate_inc_id 有更多的dt_update,而另一个没有。
  • @Boneist 我没想过要使用多个索引。使用 (remedy_inc_id, dt_update, assignment) 可以更好地工作。但奇怪的是,它仅使用索引来获取 select 中的字段,而不是用于子查询中的 where 条件

标签: oracle performance database-performance


【解决方案1】:

你可以试试:

WITH last_ticket AS
  ( SELECT remedy_inc_id, ASSIGNMENT,
           rank() over (partition by remedy_inc_id order by dt_update desc) rn
   FROM st_remedy_full_light a
  )
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 
where rn = 1;

【讨论】:

  • 嗨托尼,感谢您的回复...不幸的是我使用了这个解决方案,但奇怪的是比我的解决方案慢。
  • 您能否分享更多详细信息,说明为什么此查询与原始查询相比运行速度更快。
  • @NzGuy 我会期望可能运行得更快,因为它不必将last_ticket 散列到自身。
  • @vecio88 使用此查询时计划是什么样的?
  • 由于查询没有 where 子句也没有连接,因此预计不会使用索引。完全扫描是必需的。如果您在(remedy_inc_id, ASSIGNMENT, dt_update) 上添加了索引,那么 Oracle 可以完全扫描它而不是表,如果索引比表小得多,这会更快。
【解决方案2】:

最好的替代查询,也更容易执行,是这样的:

select remedy_inc_id
     , max(assignment) keep (dense_rank last order by dt_update)
  from st_remedy_full_light
 group by remedy_inc_id

这将只使用一个全表扫描和一个(散列/排序)分组依据,没有自连接。

不要担心索引访问,因为您可能会发现全表扫描在这里最合适。除非表真的很宽,并且所有使用的列上的复合索引(remedy_inc_id、dt_update、assignment)都会比表快得多。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多