Use Local Or Global Index?

本文对比了本地索引和全局索引的特点,并通过实例展示了两者在分区表中的表现差异,帮助开发者理解何时选择何种索引类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常我们需要将大表根据分区键进行分区,当建立索引的时候,我们到底使用local 还是global 索引呢

先看看两种索引的特点:

本地索引特点:
1. 本地索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,一句话,本地索引的分区机制和表的分区机制一样。
2. 如果本地索引的索引列以分区键开头,则称为前缀局部索引。
3. 如果本地索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引。
4. 前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。
5. 本地索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用本地索引去给表做唯一性约束,则约束中必须要包括分区键列。
6. 本地分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向 n个表分区,同时,一个表分区,也可能指向 n个索引分区,对分区表中的某个分区做 truncate或者 move, shrink等,可能会影响到 n个全局索引分区,正因为这点,本地分区索引具有更高的可用性。
7. 位图索引只能为本地分区索引。
8. 本地索引多应用于数据仓库环境中。
全局索引特点:
1.全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。
2.全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。
3.全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要 rebulid若干个分区甚至是整个索引。
4.全局索引多应用于 oltp系统中。
5.全局分区索引只按范围或者散列 hash分区, hash分区是 10g以后才支持。
6.oracle9i以后对分区表做move 或者truncate 的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。
7.表用 a列作分区,索引用 b做局部分区索引,若 where条件中用 b来查询,那么 oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用 b做全局分区索引。
通常开发人员喜欢建立local索引,因为在删除分区的时候不需要重建索引。但是有时候本地索引将会带来很大的性能影响:
-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          |Name                  | Starts | E-Rows | A-Rows |Buffers |Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
|   0 |SELECT STATEMENT                   |                       |      1 |        |   1493 |   2984 |      |       |
|   1 |  PARTITION RANGEALL               |                       |      1 |   1493 |   1493 |   2984 |    1 |  1493 |
|   2 |  TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB       |   1493 |   1493 |   1493 |   2984 |    1 |  1493 |
|*  3 |   INDEX RANGE SCAN                | LC_NON_PREFIXED_TYP_I |   1492 |   1493 |   1493 |   1492 |    1 |  1493 |
-----------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identifiedby operation id):
---------------------------------------------------
3 - access(MHO_TYP_ID=0)
 
Statistics
----------------------------------------------------------
0     recursive calls
0     db block gets
2984  consistent gets
0     physical reads
0     redosize
28937 bytes sent via SQL*Netto client
372   bytes received via SQL*Netfrom client
4     SQL*Net roundtripsto/fromclient
0     sorts (memory)
0     sorts (disk)
1493 rows processed


LC_NON_PREFIXED_TYP_I执行了1942次,这种情况如果我们加上适当的条件,尽量减少分区的扫描:
SQL>select * from partitioned_tab
     wheremho_typ_id = 0
     and mho_date = to_date('01122012','ddmmyyyy');
 
MHO_ID MHO_DATE          M MHO_TYP_ID
---------- ----------------- - ----------
1 20121201 00:00:00 Z          0
 
-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          |Name                  | Starts | E-Rows | A-Rows | Buffers | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------
|   0 |SELECT STATEMENT                   |                       |      1 |        |      1 |       2 |       |       |
|   1 |  PARTITION RANGE SINGLE            |                       |      1 |      1 |      1 |       2 |     2 |     2 |
|*  2 |  TABLE ACCESS BY LOCAL INDEX ROWID| PARTITIONED_TAB       |      1 |      1 |      1 |       2 |     2 |     2 |
|*  3 |   INDEX RANGE SCAN                | LC_NON_PREFIXED_TYP_I |      1 |      1 |      1 |       1 |     2 |     2 |
-------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identifiedby operation id):
---------------------------------------------------
2 - filter(MHO_DATE=TO_DATE(' 2012-12-01 00:00:00','syyyy-mm-dd hh24:mi:ss'))
3 - access(MHO_TYP_ID=0)


这次LC_NON_PREFIXED_TYP_I只执行了一次

那我们换成global index呢?

SQL>select * from partitioned_tab where mho_typ_id = 0;
 
------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          |Name            | Starts | E-Rows | A-Rows |Buffers | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 |SELECT STATEMENT                   |                 |      1 |        |   1493 |   1496 |       |       |
|   1 | TABLE ACCESS BY GLOBAL INDEX ROWID| PARTITIONED_TAB |      1 |   1493 |   1493 |   1496 | ROWID | ROWID |
|*  2 |  INDEX RANGE SCAN                 | GL_TYP_I        |      1 |   1493 |   1493 |      4 |       |       |
------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identifiedby operation id):
---------------------------------------------------
2 - access(MHO_TYP_ID=0)
 
Statistics
----------------------------------------------------------
1     recursive calls
0     db block gets
1496  consistent gets
1493  physical reads
0     redosize
28937 bytes sent via SQL*Netto client
372   bytes received via SQL*Netfrom client
4     SQL*Net roundtripsto/fromclient
0     sorts (memory)
0     sorts (disk)
1493 rows processed


索引只执行了一次,consistent gets为1496 是用local的一半。
索引建立global或local index 我们需要根据分区数量、分区稳定性、sql语句综合考虑。

<think>好的,我现在需要解决用户提到的两个问题:pip配置文件错误“file contains no section headers”和安装包时出现virtualenv.exe不在PATH中的警告。首先,我要回顾用户之前的对话,确保解决方案的连贯性。 用户之前遇到了pip.ini文件格式错误的问题,我之前给出的解决方案是检查配置文件的结构,确保有正确的节头,比如[global],并清理非法字符。现在用户可能已经尝试过这些步骤,但可能仍有问题,或者需要进一步的信息。 接下来,用户提到的第二个问题是virtualenv.exe不在PATH中的警告。这可能是因为virtualenv没有正确安装,或者安装路径没有被添加到系统环境变量PATH中。需要指导用户如何检查安装情况,并添加路径到PATH。 首先处理pip配置文件错误: 1. 用户遇到的错误是“file contains no section headers”,这通常是因为pip.ini文件中缺少节头,比如[global]。需要确认用户是否正确添加了节头,并且配置项在正确的节下。 2. 可能用户修改了pip.ini文件,但仍有格式问题,比如多余的空格、错误的缩进或特殊字符。需要建议用户检查文件结构,确保每行配置都在正确的节下。 3. 另外,可能需要指导用户如何找到pip的配置文件位置,因为不同操作系统下的路径不同,比如Windows、macOS和Linux的位置可能不同。用户之前的问题是在Windows上,所以可能需要具体说明Windows的路径。 然后是virtualenv.exe不在PATH中的问题: 1. 用户可能在创建虚拟环境时遇到问题,或者在使用virtualenv时系统找不到可执行文件。这可能是因为virtualenv没有正确安装,或者安装路径没有被添加到PATH中。 2. 需要检查virtualenv是否已安装,可以通过运行pip show virtualenv来确认。如果没有安装,需要指导用户安装。 3. 如果已安装,但路径不在PATH中,需要找到virtualenv.exe的路径,通常是Python的Scripts目录,比如C:\Python39\Scripts,然后将该路径添加到系统环境变量PATH中。 4. 用户可能在安装包时使用virtualenv,但环境变量未正确设置,导致系统找不到可执行文件,从而出现警告。需要指导用户如何修改环境变量,并重新启动命令行工具使更改生效。 需要确保步骤清晰,分点说明,便于用户逐步操作。同时,要引用之前提到的配置文件修复方法,确保用户已经正确修复了pip.ini的问题,再处理PATH的问题。可能还需要提醒用户,在修改环境变量后,需要关闭并重新打开命令行窗口,以使更改生效。 另外,用户可能对如何找到Scripts目录或修改环境变量不太熟悉,需要给出具体的命令或步骤,比如使用where virtualenv.exe来查找路径,或者在系统属性中编辑环境变量。对于Windows用户,可能需要详细说明如何通过GUI修改环境变量,以及如何验证路径是否添加成功。 最后,生成相关问题,帮助用户进一步排查可能的问题,比如如何验证PATH配置是否正确,如何重新安装virtualenv,或者如何处理多个Python版本导致的路径冲突等。</think>### 解决方案 针对您遇到的 `pip` 配置文件格式错误(`file contains no section headers`)和 `virtualenv.exe` 未在 `PATH` 中的警告问题,以下是分步解决方案: --- #### 一、修复 `pip.ini` 配置文件错误 此错误表明您的 `pip.ini` 文件缺少必要的节头(section headers),导致配置无法正确解析。 **1. 定位配置文件路径** - **Windows**:默认路径为 `C:\Users\<用户名>\pip\pip.ini` 或 `C:\ProgramData\pip\pip.ini`。 - **Linux/macOS**:路径为 `~/.pip/pip.conf` 或 `/etc/pip.conf`。 **2. 修正文件格式** 打开 `pip.ini` 文件,确保所有配置项位于合法的节头下(如 `[global]`)。 **错误示例**: ```ini timeout = 6000 # 缺少节头 ``` **正确示例**: ```ini [global] timeout = 6000 index-url = https://pypi.tuna.tsinghua.edu.cn/simple ``` **3. 验证配置文件** 运行以下命令检查配置是否生效: ```bash pip config list ``` 若输出包含 `timeout=6000` 和镜像源地址,则修复成功[^1]。 --- #### 二、解决 `virtualenv.exe` 未在 `PATH` 中的警告 此问题通常是因为 `virtualenv` 的安装路径未添加到系统环境变量 `PATH` 中。 **1. 确认 `virtualenv` 是否安装** 执行以下命令检查: ```bash pip show virtualenv ``` 若未安装,先安装它: ```bash pip install virtualenv ``` **2. 查找 `virtualenv.exe` 路径** - **Windows**:默认路径为 `C:\PythonXX\Scripts\virtualenv.exe`(`XX` 是 Python 版本号)。 通过以下命令定位: ```cmd where virtualenv ``` - **Linux/macOS**:路径通常为 `/usr/local/bin/virtualenv` 或 `~/.local/bin/virtualenv`。 **3. 添加路径到 `PATH` 环境变量** - **Windows**: 1. 右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 编辑“Path” → 添加 `C:\PythonXX\Scripts`。 2. 重启命令行窗口。 - **Linux/macOS**: 在 `~/.bashrc` 或 `~/.zshrc` 中添加: ```bash export PATH="$PATH:/path/to/virtualenv/directory" ``` 然后执行: ```bash source ~/.bashrc ``` **4. 验证 `PATH` 配置** 执行以下命令查看路径是否生效: ```bash echo %PATH% # Windows echo $PATH # Linux/macOS ``` --- #### 三、完整操作流程示例(Windows) 1. 修正 `pip.ini`: ```ini [global] timeout = 6000 index-url = https://pypi.tuna.tsinghua.edu.cn/simple ``` 2. 安装/升级 `virtualenv`: ```cmd pip install --upgrade virtualenv ``` 3. 添加 `Scripts` 目录到 `PATH`: ```cmd setx PATH "%PATH%;C:\Python39\Scripts" ``` 4. 重启命令行工具后验证: ```cmd virtualenv --version ``` --- ### 相关问题 1. 如何检查 Python 环境变量是否配置正确? 2. 如果安装了多个 Python 版本,如何避免路径冲突? 3. 使用虚拟环境时出现权限错误应如何解决?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值