【发布时间】:2013-08-30 23:03:45
【问题描述】:
所以我正在尝试优化一堆需要大量时间的查询。我想弄清楚的是如何在不同表的列上创建索引。 这是我的问题的简单版本。
我做了什么
谷歌搜索后,我查看了位图索引,但我不确定这是否是解决问题的正确方法
问题
Student(sid,...) 和 Report(rid, year, isdeleted) 之间存在多对多关系
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