【问题标题】:How to avoid full table scan query between dates如何避免日期之间的全表扫描查询
【发布时间】:2014-02-25 07:18:31
【问题描述】:

我正在编写一个存储过程以将汇总值从 task_history 表插入 task_activity_report 表。

表格

Task_history
----------------------------------------
Task_id                    Varchar2(32) PK
Event_dt                   Date
Event                      Varchar2(10)
......
......
......

SQL 查询:

SELECT task_id 
FROM   task_history 
WHERE  event = 'CLOSED' 
       AND event_dt BETWEEN 10 - nov - 13 AND 20 - nov - 13; 

Between dates是做全表扫描,如何避免日期之间全表扫描查询?? 从 task_history 中选择 task_id,其中 event_dt 在 10-NOV-13 和 20-NOV-13 之间;

我的表有超过 1500 万条记录

感谢您的帮助和时间。非常适合。

CVSR 萨尔玛

【问题讨论】:

  • 它基本上是 SQL 查询。我正在编写 Oracle 存储过程。
  • 在 EVENT 上创建非聚集索引包括 taskid,在 event_dt 上创建非聚集索引。也只需使用正确的日期时间参数,不要在 even_dt 中使用任何强制转换/转换
  • 可能的每月分区,有时会有所帮助
  • 请发布表中相关列的 DDL、索引、查询的解释计划、列的基数、您希望查询返回的行数以及实际查询,因为这个不正确并且会出错。如果没有这些信息,您获得的任何帮助必然会变得模糊。
  • 你可以edit你的问题包含额外的信息@sarma。但是,我说要得到一个好的答案,还需要很多额外的东西。

标签: sql performance oracle


【解决方案1】:

在“event_dt”列上创建索引。

更新

我不知道您的查询计划和直方图,但“事件”字段上的索引可能也会有用。

【讨论】:

  • 我已经在所有 varchar 字段上创建了索引。
  • 如果 event_dt 是 varchar 那么这本身就是一个大问题
  • 您是否在 event-dt 字段上创建了索引?您是否在 ebent 字段上创建了索引?您使用哪种类型的 SQL Server?你能告诉我们你的查询计划吗?如果您在 WHERE 子句中的字段上有索引,您将获得 INDEX SEEK 或 INDEX SCAN 而不是 TABLE SCAN。
  • 嗯,这张桌子就像一本大书,你想在其中找到一些信息。并且索引它就像书上的索引(对不起,我的英语)。如果您通过 event-dt 和 event 字段搜索信息,则此字段上的索引将为您提供帮助。在这种情况下,任何其他索引都无关紧要。此外,任何额外的索引都会使插入、删除和更新变得更慢。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多