- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为DEXTRACTO
的表,我需要根据列F_EXTRACTO
(巫婆是DATE
格式)查询一段时间BETWEEN DATE1 AND DATE2
条件(DATE1
和 DATE2
可以更改)。以下是该表的一些数据:
SQL> SELECT MIN(F_EXTRACTO), MAX(F_EXTRACTO), COUNT(1)
2 FROM DEXTRACTO
3 /
MIN(F_EXTRACTO) MAX(F_EXTRACTO) COUNT(1)
--------------- --------------- ----------
03/01/2005 06/01/2017 13772806
SQL> SELECT COUNT(1) FROM DEXTRACTO WHERE F_EXTRACTO IS NULL
2 /
COUNT(1)
----------
0
SQL>
我想使用索引,但我不知道哪种方法更好。我应该在 F_EXTRACTO
列上使用它吗?或者我应该在 TRUNC(F_EXTRACTO)
上使用索引吗?我知道将索引与函数一起使用不是一个好主意,但是测试这两种方法我得到了这个......
SQL> create index INDEX_DATE on DEXTRACTO (F_EXTRACTO)
2 /
Index created
SQL> create index INDEX_TRUNC on DEXTRACTO (TRUNC(F_EXTRACTO))
2 /
Index created
SQL>
F_EXTRACTO
上的测试索引:
SQL> explain plan for
2
2 SELECT /*+ index (dextracto INDEX_DATE) */ *
3 FROM dextracto
4 WHERE f_extracto
5 BETWEEN to_date('01/01/2005','dd/mm/yyyy') AND SYSDATE
6 /
Explained
SQL> select plan_table_output from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12M| 1088M| 250K|
| 1 | FILTER | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| DEXTRACTO | 12M| 1088M| 250K|
| 3 | INDEX RANGE SCAN | INDEX_DATE | 12M| | 36972 |
---------------------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
13 rows selected
SQL>
TRUNC(F_EXTRACTO)
上的测试索引:
SQL> explain plan for
2
2 SELECT /*+ index (dextracto INDEX_TRUNC) */ *
3 FROM dextracto
4 WHERE TRUNC(f_extracto)
5 BETWEEN to_date('01/01/2005','dd/mm/yyyy') AND SYSDATE
6 /
Explained
SQL> select plan_table_output from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 32437 | 2787K| 1130 |
| 1 | FILTER | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| DEXTRACTO | 32437 | 2787K| 1130 |
| 3 | INDEX RANGE SCAN | INDEX_TRUNC | 58387 | | 169 |
----------------------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
13 rows selected
SQL>
所以......如果我使用索引F_EXTRACTO
,成本是250000,但如果我使用索引TRUNC(F_EXTRACTO)
,成本是1130。有人可以告诉我为什么吗这两种方法之间存在如此大的差异吗?如果您需要一些其他信息,请告诉我。
最佳答案
估计行数(12M 与 58387)之间的巨大差异很可能归因于过时的统计信息。我建议在添加索引后收集统计信息(例如,使用 DBMS_STATS.gather_table_stats )。
此外,EXPLAIN PLAN
并不保证该计划就是实际使用的计划。我宁愿运行查询,然后使用 dbms_xplan.display_cursor 检查实际执行计划。查看 v$sql
/v$sqlarea
View 以获取执行详细信息也是有意义的。
关于sql - Oracle SQL 索引 DATE 与索引 TRUNC(DATE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552334/
使用方法 TRUNC SQL Server 2012 中的函数,因为我收到错误: 'TRUNC' is not a recognized built-in function name.' 当我执行语句
看下面的代码,为什么Trunc函数的结果不一样? procedure TForm1.Button1Click(Sender: TObject); var D: Double; E: Exten
我想在javascript中 chop 一个数字,即去掉小数部分: chop (2.6)==2 trunc (-2.6) == -2 经过大量基准测试后,我的答案是: function trunc
下面的代码在 Chrome 中运行良好,但在 IE 浏览器中我看到以下控制台错误: object does not support property or method 'trunc' 代码: var
java.lang.Math 类有 ceil()、floor()、round() 方法,但没有 trunc() 方法。 同时,我在实践中看到 .intValue() 方法(实际上执行 (int) 转换
tl;dr: double b=a-(size_t)(a) 比 double b=a-trunc(a) 快 我正在为图像实现旋转功能,我注意到 trunc 功能似乎非常慢。 图像的循环代码,像素的实际
oracle trunc()函数是最常用的函数之一,下面就为您介绍oracle trunc()函数的用法,供您参考,希望可以让您对oracle trunc()函数有更深的认识。 1.TRUNC(f
从 1.3.172 版本开始,有一个 TRUNC 函数,它模仿了 Oracle 的 TRUNC(TIMESTAMP)。实现过程中存在一个小问题。查询: select TRUNC(TIMESTAMP '
我有两个不同大小的变量“a”和“b”,见下文。我有几个问题: (1) 如何将“a”的值复制到“b”? (即扩展操作) (2) 如何将“b”的值复制到“a”? (即截断操作) 谢谢。 a = BitVe
select trunc('11.01') from dual 输出:11 jasper 报告中的 BigDecimal 数据类型是什么。是否有任何解决方法可以将其作为字符串。 最佳答案 Oracle
我需要限定来自 Oracle 数据库的查询以获取基于特定日期范围的报告 第一个查询 5pm-7am(昨天下午 5 点到今天早上 7 点之间) 第二个查询 早上 7 点到下午 5 点((昨天下午 5 点
我尝试在 Blender 2.49b Python 中使用 math.trunc 但我收到此错误 AttributeError: 'module' object has no attribute 't
我正在尝试使用以下方法截断 PostgreSQL 中的数字: SELECT trunc(31.71429,15); 我有这个输出: 31.714290000000000 但是在 Oracle 中我有这
我有旧的pascal代码 var i : longint; m : double; begin ..... i := trunc(m); 我必须将它转换为 C++ 代码。 这里很明显的
本文给大家分享的oracle trunc 函数处理日期格式的相关知识,非常具有参考价值,具体请看下文说明吧。 复制代码代码如下: select to_char(sys
我来自 SQL Server 世界,有人要求我弄清楚一段(古老的)Oracle 脚本是怎么回事。 CAVEAT: I don't have access to the Oracle server, I
在通过 Java 库翻译 Google Translate API 中的短语时,我突然得到了同样奇怪的标记。英语 → 瑞典语的示例包括: Vector graphics → vektor~~POS=T
为什么 从双中选择 trunc(to_date('23/06/2017','DD/MM/YYYY'), 'DAY'); 返回 2017年6月19日 不是预期的 2017年6月23日? 我们使用的是 O
我有一个包含每小时数据和值(value)的简单表格。我想计算每个月每日最大值的平均值。 该查询起初看起来很简单: WITH daily_max AS ( SELECT TRUNC(the_date
trunc()有什么区别和 as.integer() ? 为什么是 as.integer快点?谁能解释一下幕后发生了什么? 为什么trunc()返回类double而不是 integer ? x 43
我是一名优秀的程序员,十分优秀!