我需要一些帮助来提升这个SQL语句.执行时间约为125毫秒.
在我的程序运行期间,这个sql(更好:用于不同表的结构相同的sqls)
将被称为300.000次.
表中的平均行数约为10.000.000行,每天将添加新行(更新/插入)和时间戳.这个特定出口计划的有趣数据在过去的1-3天内.也许这对创建索引很有帮助.我需要的数据是给定id的当前有效行和获取更新的forerunner datarow(如果存在).
我们使用Oracle 11g数据库和Dot.Net Framework 3.5
提升的SQL语句:
select ID_SOMETHING, -- Number(12) ID_CONTRIBUTOR, -- Char(4 Byte) DATE_VALID_FROM, -- DATE DATE_VALID_TO -- DATE from TBL_SOMETHING XID where ID_SOMETHING = :ID_SOMETHING and ID_CONTRIBUTOR = :ID_CONTRIBUTOR and DATE_VALID_FROM <= :EXPORT_DATE and DATE_VALID_TO >= :EXPORT_DATE order by DATE_VALID_FROM asc;
在这里,我上传了此查询的当前解释计划.
我不是数据库专家,所以我不知道哪种索引类型最适合这个要求.我已经看到可以应用许多不同的可能索引类型.也许Oracle Optimizer Hints也很有帮助.
有没有人有一个好主意调整这个SQL或可以指向我正确的方向?
解释计划看起来尽可能好,但这并不一定意味着什么.Quassnoi提出的指数正是我所建议的.
无论如何,在你的程序中做300000个类似的查询让我问:这有必要吗?也许你可以用更少的查询达到相同的目标,每个查询都做得更多.
如果您无法避免执行这么多查询,那么至少应该使用预准备语句.如果你使用LINQ,那就是你编译的语句.这样,您就可以避免解析开销,这可能是整体支出的很大一部分,特别是对于这种简单的查询.