gpt4 book ai didi

sql - ORACLE - 如何创建将在 NLS_COMP=Linguistic 和 NLS_Sort=Binary_CI 时使用的索引

转载 作者:行者123 更新时间:2023-12-03 18:36:40 26 4
gpt4 key购买 nike

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

当我更改为 NLS_COMP=Linguistic 和 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 开始 - LIKE CAN 使用语言索引。
文档修改为:

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

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

关于sql - ORACLE - 如何创建将在 NLS_COMP=Linguistic 和 NLS_Sort=Binary_CI 时使用的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com