我已经在 Oracle 11g 文档和论坛中搜索了如何获取此视图和查询以使用基于函数的索引的示例,但到目前为止我还没有找到。我感谢任何帮助。
我使用的应用程序不支持直接查询的 TIMESTAMP 数据类型,但如果它在视图中转换为 DATE,则支持该数据类型。但是,我必须然后使用时间戳函数查询此强制转换列。这有点往返。第 3 方应用程序发送我在 SQL*Plus/SQL Developer 中使用的相同查询,并显示在下面。
我实际上并不需要 TIMESTAMP 数据类型的小数秒粒度,只是出于数据供应商的原因需要在该数据库中使用它。
我知道将函数应用于该列时不使用列索引。我无法完成的是构建一个适当的基于函数的索引,以避免对数百万行(取决于表的 200 万到 6 亿行)进行全表扫描。我宁愿不使用提示,但在这一点上,任何事情都比全表扫描要好,我愿意接受所有建议。
这是所需的视图:
SELECT
CAST(SAMPLE_TABLE.TIMESTAMP_COLUMN as DATE) as TIMESTAMP_COLUMN
FROM TEST_USER.SAMPLE_TABLE;
Run Code Online (Sandbox Code Playgroud)
这是一个带有解释计划前缀的示例查询:
explain plan for
select * FROM SAMPLE_VIEW WHERE TIMESTAMP_COLUMN = timestamp '2010-08-10 12:00:00';
select plan_table_output
from table(dbms_xplan.display('plan_table',null,'all'));
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 200K| 1562K| 169K (1)| 00:33:56 …Run Code Online (Sandbox Code Playgroud)