`
顽石OK07
  • 浏览: 83948 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

使用Index提示 强制使用索引

阅读更多

虽然索引并不总会快于全表扫描,但是很多时候我们希望Oracle使用索引来执行某些SQL,这时候我们可以通过index hints来强制SQL使用index.

Index Hints的格式如下:

/*+ INDEX ( table [index [index]...] ) */

我们简单看一下这个提示的用法(范例为Oracle10g数据库):

SQL> create table t as select username,passWord from dba_users;
Table created.
SQL> create index i_t on t(username);
Index created.
SQL> set autotrace trace eXPlain
SQL> select /*+ index(t i_t) */ * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
 Id   Operation                    Name  Rows   Bytes  Cost (%CPU) Time     
------------------------------------------------------------------------------------
   0  SELECT STATEMENT                       1     34      2   (0) 00:00:01 
   1   TABLE Access BY INDEX ROWID T         1     34      2   (0) 00:00:01 
*  2    INDEX RANGE SCAN           I_T       1             1   (0) 00:00:01 
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement 

 

这里的查询使用了索引.

 

需要注意的是使用CTAS方式创建数据表,新建表会继承原表的约束属性:

SQL> desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(30)
 PASSWORD                                           VARCHAR2(30) 

 

如果不使用Hints,此处Oracle不会使用索引:

 

SQL> select * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
 Id   Operation          Name  Rows   Bytes  Cost (%CPU) Time     
--------------------------------------------------------------------------
   0  SELECT STATEMENT             1     34      2   (0) 00:00:01 
*  1   TABLE ACCESS FULL T         1     34      2   (0) 00:00:01 
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement 

 

索引和全表扫描的选择和取舍并非简单,本文不作进一步探讨.

 

 

分享到:
评论

相关推荐

    ORACLE优化

    ### 使用INDEX提示强制使用索引 `INDEX`提示允许用户强制指定某个特定索引用于表的访问,这对于解决优化器误判或在特定场景下优化查询性能非常有用。然而,过度依赖`INDEX`提示可能会掩盖潜在的查询优化问题,应当...

    Oracle强制索引

    ### Oracle强制索引详解 在Oracle数据库管理过程中,优化查询性能是提高系统效率的关键环节之一。其中,**强制索引**是一种重要的优化手段,它允许数据库管理员或开发人员指定特定的执行计划,确保查询能够利用预设...

    Oracle使用强制索引的方法与注意事项

    在Oracle数据库中,强制索引是一种技术,允许数据库管理员或开发人员在特定查询中指定必须使用的索引,即使Oracle优化器认为全表扫描更有效。强制索引有时可以帮助提升查询性能,尤其是在对业务理解深入且确信索引能...

    Oracle+SQL优化之使用索引提示一例

    #### 强制索引提示的应用 即使在上述优化后,`Person`表在外层查询中仍然采用全表扫描,未充分利用索引,导致更新操作效率低下。为了解决这一问题,引入了索引提示`/*+ INDEX (tablename indexname) */`,强制SQL...

    MYSQL中常用的强制性操作(例如强制索引)

    1. **强制索引(FORCE INDEX)**: 当你希望数据库强制使用某个特定的索引而不是默认选择时,可以使用`FORCE INDEX`。例如: ```sql SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … ``` 这条SQL语句将只使用...

    Oracle Index 索引介绍

    在SQL语句中使用`/*+ INDEX */`提示强制优化器使用特定的索引。 4. **索引的负面影响** - 索引占用额外的存储空间。 - 插入、更新和删除操作会因维护索引而变慢。 - 太多的索引可能导致性能下降,需要定期评估...

    浅述SQL Server的聚焦强制索引查询条件和Columnstore Index

    2. **强制索引**:通过`WITH(INDEX(index_name))`可以强制查询使用指定的非聚集索引。 3. **内联查询条件**:在涉及多个表的连接查询中,可以使用`WITH(INDEX(index_name))`为每个表指定索引,以优化连接操作。 4. *...

    MySQL 进阶-索引使用规则

    - 使用 `FORCE INDEX`, `USE INDEX`, 或 `IGNORE INDEX` 提示来强制或排除特定索引的使用。 通过深入了解这些索引使用规则,并结合实际场景应用,可以显著提升MySQL数据库的查询性能。记住,正确地创建和管理索引...

    视图上使用索引的一个注意点

    如果我们知道基本表上的索引可以帮助优化查询,可以通过添加提示来强制数据库使用特定的索引。例如: ```sql SELECT /*+ INDEX(v_table idx_a) */ * FROM v_table WHERE a = b; ``` 这里使用了Oracle特有的...

    mysql查询优化之索引优化

    - **使用索引提示**:在某些复杂查询中,可以使用SQL的FORCE INDEX或USE INDEX提示强制MySQL使用特定的索引。 - **避免全表扫描**:通过优化查询语句,减少不必要的全表扫描,例如,避免在WHERE子句中使用NOT IN、!...

    给BW的数据存储对象建立索引

    在这个例子中,我们使用了“INDEX”提示来指定使用“/BIC/AZ2001ON300~1”索引来扫描“/BIC/AZ2001ON300”表。通过使用索引,可以大幅度地提高查询效率。 在 SAP BW 中,还有其他几种方式来提高查询效率。例如,...

    Sybase 数据库查询索引优化

    6. **使用索引提示**:在查询语句中添加索引提示,可以强制查询优化器使用特定的索引,但应谨慎使用,避免过度干预优化器的决策。 7. **监控和分析**:通过数据库的性能监控工具,如Sybase的Profiler或SQL Profiler...

    屏蔽数据库表索引的例子

    这种方法适用于需要频繁切换索引使用状态的情况。 **示例代码**: ```sql -- 假设在SQL Server中 ALTER INDEX ALL ON dbo.tg_cdr01 DISABLE; ``` 以上命令将会禁用 `dbo.tg_cdr01` 表上的所有索引,直到再次启用...

    SQLSERVER中忽略索引提示

    然而,有时候强制使用特定索引的索引提示(Index Hint)可能会导致反效果,使查询变得效率低下。这通常是由于索引提示限制了SQL Server查询优化器的选择范围,使得它无法自动选择最优的执行计划。 例如,如描述中所...

    mysql索引分析和优化

    - **利用索引提示**:在复杂的查询中,可以使用`FORCE INDEX`、`USE INDEX`等提示强制数据库使用特定的索引,以优化查询计划。 #### 结论 理解MySQL索引的原理及其不同类型,结合具体的应用场景,合理设计和优化...

    SQL Server数据库索引设计的研究.pdf

    - **使用索引提示**:在必要时,可以使用查询提示强制使用特定的索引,但应谨慎使用,避免过度干预优化器的工作。 4. **性能优化** - **索引视图(Indexed Views)**:对常被查询的复杂查询结果创建索引,提高...

    数据库索引 设计和优化

    3. 使用索引提示:在查询中使用HINTs,强制数据库使用或忽略特定的索引。 六、反模式与注意事项 1. 避免过度索引:每个索引都需要维护,过多的索引可能导致写操作性能下降。 2. 考虑数据分布:对于更新频繁且数据...

    MySQL进阶学习需要掌握的具体内容解析,MySQL数据库如何使用和优化索引.docx

    - 在SQL语句中使用`FORCE INDEX`和`USE INDEX`提示强制使用特定索引。 **3. 存储引擎特性** - 熟悉不同存储引擎(如InnoDB和MyISAM)的特性,合理选择以适应不同的应用场景。 **4. 慢查询日志** - 启用慢查询...

Global site tag (gtag.js) - Google Analytics