【发布时间】:2011-02-20 14:42:28
【问题描述】:
我们如何在 oracle 中对日期时间字段执行索引。我们应该能够搜索特定的年份
谢谢
【问题讨论】:
我们如何在 oracle 中对日期时间字段执行索引。我们应该能够搜索特定的年份
谢谢
【问题讨论】:
只需创建如上所示的索引。 请勿使用 TRUNC FUNCTION,因为它会忽略任何索引。比如我的datecreate字段有下一个格式03.12.2009 16:55:52所以我以前用过
trunc(datecreate, 'dd')=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy')
它工作得非常缓慢(大约 5 秒)!!!现在我使用下一个表达式:
datecreate>=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy') and sw.datecreate<to_date(to_char(sysdate+1,'dd.mm.yyyy'),'dd.mm.yyyy')
我的查询在0,01 sec中执行
【讨论】:
要在 Oracle 中创建索引,请使用:
CREATE INDEX your_index_name ON your_table_name(your_column_name)
有关 Oracle 索引创建的更多信息,请阅读this link。
更正和澄清
如果您使用函数来隔离日期的组件(即:EXTRACT 或 TRUNC),则列上的索引将无济于事。但是,如果您提供日期范围,索引会有所帮助:
WHERE your_date_column BETWEEN TO_DATE('2010-01-01', 'YYYY-MM-DD')
AND TO_DATE('2010-12-31', 'YYYY-MM-DD')
但是,您可以在 Oracle 中创建基于函数的索引:
CREATE INDEX your_index_name
ON your_table_name(EXTRACT(YEAR FROM your_column_name))
...DBA 怀着热情厌恶。
【讨论】:
您可以直接索引 DATE 列(在 Oracle 中存储日期和时间):
CREATE INDEX ix ON table (column)
如果您构建查询以执行 RANGE SCAN,Oracle 将能够直接使用此索引。例如,如果您想检索 2010 年的行:
SELECT ...
FROM table
WHERE column >= DATE '2010-01-01'
AND column < DATE '2011-01-01'
此索引还可用于回答特定月份、日期或任何其他范围的查询。
【讨论】:
添加一个不绑定到列的索引,而是从该列中提取年份的表达式:
create index sample_index on YourTable (extract(year from YourDateColumn)) tablesapce YourIndexSpace;
当您使用该表达式查询表时,Oracle 将使用索引。
【讨论】: