【问题标题】:Database (Oracle 11g) query optimization for joins连接的数据库 (Oracle 11g) 查询优化
【发布时间】:2013-08-30 23:03:45
【问题描述】:

所以我正在尝试优化一堆需要大量时间的查询。我想弄清楚的是如何在不同表的列上创建索引。 这是我的问题的简单版本。

我做了什么

谷歌搜索后,我查看了位图索引,但我不确定这是否是解决问题的正确方法

问题

  1. Student(sid,...) 和 Report(rid, year, isdeleted) 之间存在多对多关系

  2. StudentReport(id, sid, rid) 是连接表

查询

Select * 
from Report 
inner join StudentReport on Report.rid = StudentReport.rid
where Report.isdeleted = 0 and StudentReport.sid = x and Report.year = y

创建索引的最佳方法是什么?

【问题讨论】:

  • 永远不要在没有计划的情况下尝试优化查询。 EXPLAIN 的文档。将其粘贴到您的问题中。如果我不得不猜测,我猜您在 StudentReport 表中的 {sid, rid} 上没有唯一约束,并且您在 Report.Year 上没有索引。
  • 谢谢迈克。我现在无法访问数据库,但我稍后会粘贴查询计划。我在 StudentReport 上有一个独特的约束 {sid, rid}。我还尝试在 Student 上添加索引(已删除,年份)。上面的查询也正在为很多学生运行,所以它类似于 --> loop 1 to 1000 { execute query }
  • 假设 isdeleted 只有两个值,并且该列的大多数行都为 False,那么索引它可能对您没有太大帮助。在循环中执行查询很少是正确的做法。

标签: sql join oracle11g query-optimization


【解决方案1】:

请试试这个:

with TMP_REP AS (
Select * from Report where Report.isdeleted = 0 AND Report.year = y
)
,TMP_ST_REP AS(
Select * 
from StudentReport where StudentReport.sid = x
)
SELECT * FROM TMP_REP R, TMP_ST_REP S WHERE S.rid = R.rid

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2011-11-01
    相关资源
    最近更新 更多