数据库使用:隐式转换-》索引失效-》严重性能问题
程序中使用隐式转换是一个很不好的编程习惯,不仅不能客观反应出数据库如何真正地处理数据,而且还会带来一些隐藏的性能问题,下面就是一个示例,说明varchar2与number之间隐式转换导致索引失效,最终导致可以使用索引的地方使用全表扫描,带来严重的性能问题…
下面做个小试验:
SQL> set autotrace on explain <---打开执行计划监控
SQL> create table t ( id varchar2(20));
Table created.
Elapsed: 00:00:00.04
SQL> begin <---向表中填入2000000条数据
2 for i in 1 .. 2000000 loop
3 insert into t values(i);
4 end loop
5 ;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:03:35.33
SQL> select count(*) from t;
COUNT(*)
----------
2000000
Elapsed: 00:00:00.08
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=811 Card=1)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'T' (TABLE) (Cost=811 Card=176780
7)
SQL> create index id_ind on t( id); <--在Id列上建一个索引
Index created.
Elapsed: 00:00:26.74
SQL> select * from t where id = '200'; <---用字符串查,可以使用到索引(请看执行计划)。
ID
--------------------
200
Elapsed: 00:00:00.01 <---根据索引,只用了00.01秒
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=12)
1 0 INDEX (RANGE SCAN) OF 'ID_IND' (INDEX) (Cost=3 Card=1 Byte
s=12)
从执行计划中可以看出,cost只要3
SQL> select * from t where id = 200; <----如果直接根据数字查,由于发生了隐式转换,执行计划为全表扫描。
ID
--------------------
200
Elapsed: 00:00:00.48 <---全表扫描,是索引扫描时间的48倍!!
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=881 Card=38 Bytes=
456)
1 0 TABLE ACCESS (FULL) OF 'T' (TABLE) (Cost=881 Card=38 Bytes
=456)
分享到:
相关推荐
导致索引失效的口诀 数据库索引是一种提高查询效率的重要手段,但是如果不正确使用索引,可能会导致索引失效,影响查询效率。以下是导致索引失效的七字口诀: 模型数空运最快嗷 1. 模:模糊查询的问题 使用like...
### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...
### MySQL索引失效的11种情况 #### 知识点概述 在MySQL数据库中,索引是非常重要的优化工具之一,它可以显著加快数据检索的速度。然而,在某些情况下,索引可能会失效,导致查询效率降低。了解这些情况对于优化...
Oracle数据库索引失效是一个常见的性能问题,它可能导致查询效率降低,影响系统的整体性能。索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据...
MySQL中的索引是提高查询效率的关键工具,但不恰当的SQL使用可能导致索引失效,从而影响性能。以下是一些常见的索引失效场景及其规避方法: 1. **OR条件的使用**: 当`WHERE`子句中包含`OR`操作时,如果两边的查询...
4. **IS NULL 和 IS NOT NULL**:在WHERE子句中直接使用`IS NULL`或`IS NOT NULL`也可能导致索引失效。可以使用`NVL`函数结合函数索引来避免这个问题。 示例: ```sql SELECT * FROM A WHERE NVL(B, C) = C ```...
sql学习 索引逻辑失效_尽量要避免列的类型转换.sql
这个varchar字段有一个复合索引。其中的总条数有58989,甚至不加单引号查出来的数据不是我们想要的数据。 使用的是mysql 5.6版本,innoDB引擎 实际情况如下 下面我们来看一下执行的结果 在上面的描述中我们还得...
以下是关于如何选择建立索引、可能导致索引失效的原因以及使用索引时应注意的事项的详细说明。 **适合建立索引的情况:** 1. **主键**:主键字段自动建立唯一索引,确保每行的唯一性。 2. **唯一性字段**:如银行...
本文将深入探讨如何有效地使用MySQL索引,以及何时可能会导致索引失效。 首先,我们要理解索引的基本原理。索引就像是书籍的目录,它允许数据库快速定位到所需的数据行,而无需逐行扫描整个表。在MySQL中,常见的...
MySQL 面试题知识点总结 MySQL 是一种关系型数据库管理系统,广泛应用于各种 Web ...如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换可能会导致索引失效。
下面将详细讨论索引的类型、存储方式以及可能导致索引失效的场景。 首先,我们来看一下索引的类型: 1. **主键索引(Primary Key Index)**:这是最特殊的索引类型,用于唯一标识表中的每一行记录,且不允许有NULL...
8. **版本相关问题**:MySQL 的旧版本中存在一些索引失效的情况,如 IS NULL、IS NOT NULL 和不等操作符。解决方法包括转换查询条件或创建特殊索引。 三、聚集索引的生成规则 聚集索引决定了数据行的实际物理存储...
### DB2常用命令详解 #### 一、导出与导入数据 **命令示例:** ```sql EXPORT TO D:\PRINTXML.IXF OF IXF ``` **解释:** 此命令用于将数据库中的数据导出到指定路径下的IXF格式文件中。IXF是一种XML格式的数据交换...
13. **使用nls_date_format**:统一日期格式,避免因日期格式不同而导致的索引失效。 14. **使用基于函数的索引**:对于包含函数的查询,创建基于该函数的索引可以加速查询。 15. **基于函数的索引要求等式匹配**...
在某些情况下,如删除或调整分区,可能会导致索引失效,需要进行重建。 以下是一个关于分区索引失效和重建的代码示例: 首先,我们创建一个测试表`t`并插入数据: ```sql CREATE TABLE t AS SELECT object_id, ...
- **使用函数**: 在WHERE子句中对列应用函数会导致索引失效。 - **类型不匹配**: 如果查询时的数据类型与索引定义的类型不一致,索引也会失效。 #### 四、索引导致的问题 - **索引带来的负面影响** - **写入...