当前位置: 首页 > 面试题库 >

ORACLE-如何创建在NLS_COMP =语言且NLS_Sort = Binary_CI时将使用的索引

东方华晖
2023-03-14
问题内容

默认情况下,Oracle使用创建的索引。

当我更改为NLS_COMP =语言并且NLS_Sort = Binary_CI时,我得到了全表扫描。

我读过某处使用(nlssort(name,’NLS_SORT = BINARY_CI’))创建索引的地方; 会工作。

正如我下面的尝试所示,没有那么多。即使我强行执行,性能似乎也不是我所期望的。这是一个微不足道的示例,我想为具有数百万行的表解决此问题,因此全表扫描将很糟糕。

所以问题是如何建立索引以便使用索引。

谢谢

-设置X

create table x ( name varchar2(30)) ;
insert into x select table_name from all_tables;
create index x_ix on x (name);
create index x_ic on x (nlssort(name, 'NLS_SORT=BINARY_CI'));
/   
  • 默认设置
ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=BINARY; 
/
set autotrace on 
/
select * from X where NAME like 'x%';

--0 rows selected
--
---------------------------------------------------------------------------
--| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
--|   0 | SELECT STATEMENT |      |     1 |    17 |     1   (0)| 00:00:01 |
--|*  1 |  INDEX RANGE SCAN| X_IX |     1 |    17 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------
/
set autotrace off
/

-语言

ALTER SESSION SET NLS_COMP=LINGUISTIC; 
ALTER SESSION SET NLS_SORT=BINARY_CI; 
/
set autotrace on
/
select * from X where NAME like 'x%';
--13 rows selected
--
----------------------------------------------------------------------------
--| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
--|   0 | SELECT STATEMENT  |      |     1 |    17 |     3   (0)| 00:00:01 |
--|*  1 |  TABLE ACCESS FULL| X    |     1 |    17 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

select /*+ INDEX( X  X_IX           ) */ * from X where   NAME like 'x%';
--13 rows selected
--
---------------------------------------------------------------------------
--| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
--|   0 | SELECT STATEMENT |      |     1 |    17 |     9   (0)| 00:00:01 |
--|*  1 |  INDEX FULL SCAN | X_IX |     1 |    17 |     9   (0)| 00:00:01 |
---------------------------------------------------------------------------

select /*+ INDEX( X  X_IC           ) */ * from X where   NAME like 'x%'; 
--13 rows selected
--
--------------------------------------------------------------------------------------
--| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
--|   0 | SELECT STATEMENT            |      |     1 |    17 |   448   (1)| 00:00:06 |
--|*  1 |  TABLE ACCESS BY INDEX ROWID| X    |     1 |    17 |   448   (1)| 00:00:06 |
--|   2 |   INDEX FULL SCAN           | X_IC |  1629 |       |     8   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
/

set autotrace off
/

问题答案:

由于的Oracle 11g -像CAN使用语言索引。该文档已修改为:

The SQL functions MAX( ) and MIN( ) cannot use linguistic indexes when NLS_COMP is set to LINGUISTIC

注意,他们删除了“以及LIKE运算符”部分。



 类似资料:
  • 本文向大家介绍Oracle 如何创建和使用全文索引,包括了Oracle 如何创建和使用全文索引的使用技巧和注意事项,需要的朋友参考一下 不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现。   有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对

  • 问题内容: 有一个普通的Java API的JavaDoc,有英文版和中文版,但似乎每个版本都需要单独的源代码。还有其他更方便的方法吗? 问题答案: 不,基本上没有办法。 想到的唯一变通方法适用于生成的HTML页面:您可以将JavaDocs包围在使用CSS在语言之间切换的块元素中。考虑: 随后编辑JavaDocs的CSS,以便用户可以切换语言,例如:

  • 问题内容: 直到11g版本(包括11g),Oracle中似乎都没有AUTO_INCREMENT的概念。 如何在Oracle 11g中创建行为类似于自动增量的列? 问题答案: 表定义: 触发定义: 更新: IDENTITY 列现在在Oracle 12c上可用: 或指定起始值和增量值,也防止任何插入到标识列(GENERATED ALWAYS)中(同样,仅适用于Oracle 12c +) 另外,Orac

  • 我试图创建一个简单的表,但它给了我一个错误: 剧本: 我想不出这个问题,有人能帮忙吗?

  • 我的数据库是XE18。我的用户有create user,我可以使用以下命令在SQL Plus中创建用户: 然后,我创建了一个包,其中包含一个函数,该函数应该是动态创建用户,下面几行是: 我得到这个错误: 关系到错误- ORA-65096: nome de atconição ou de usuário comum inválido ORA-06512: em"TOKEN.PRC_CRIA_USUA