Local index or Global index?

某物流客户系统查询快递单的SQL,IO消耗为TOP 1:

SQL如下:

select id,op_code, to_char(create_time, :"SYS_B_1") as create_time,...

from T_EXP_OP_RECORD_CONTAINER  

where status <> :"SYS_B_4" and  ID = :1 and rownum = :"SYS_B_5";

其中T_EXP_OP_RECORD_CONTAINER 表是一个在Create_time字段按天进行一级分区、在op_code字段按地区二级分区的分区表,ID字段保存的是快递单号信息,字段上存在索引。

SQL中出现了"SYS_B_n" 字样的绑定变量,这是因为数据库参数的cursor_sharging被设置为FORCE(强烈建议保持默认值EXACT),SQL中使用的常量值被强制转换成了绑定变量。rownum=后面的常量被强制转换成了绑定变量,这个值根据常识可以判断为1,因为只有1才有意义。

快递单号基本上是唯一的,这样的SQL,正常执行时间应该在1毫秒左右,而下图使用awrsqrpt收集的SQL实际执行情况是:每次执行耗时1.236秒。

SQL执行计划如下:

看到上面的执行计划后,就会明白平均执行时间是1秒多正常了:这个查询要到6030个local index里面检索数据,平均每个local index至少要扫描3个buffers 才能判断记录是否存在,因为有rownum=1 谓词条件,最好的情况是扫描local index的第一个分支就找到了结果,不再继续扫描下去;最差的情况是扫描到 local index 的最后一个分支才找到结果,或是没有找到结果。

一般情况下,local index索引的使用,需要配合分区字段一起做谓词条件,才能只扫描少数的索引分支。而这个SQL由于业务原因,不能增加分区字段作为谓词条件。这种情况就需要将local index改成Global index,才会使SQL性能达到最佳。

但是,因为该表非常庞大(表和索引占用的空间达到T级),需要定期删除(转移)历史分区,只保留最近一年的数据,如果创建的是global index,删除历史分区后,需要对global index进行重建,维护时间窗口很难完成(有多个类似表)。这是个两难的问题。

    

针对快递业务的特点,老虎刘给出的建议是:

  • 仍使用local index,重建表,减少分区数量:按天分区改为按月分区,不要子分区;
  • 因为很少有用户会查询1个月以上的快递单,该表只保留最近2个月分区数据,其他数据转移到历史分区,正常情况只需要最多扫描2个分区,而不是原来的6030个分区。
  • 通过plsql实现查询:当前分区没有查询到结果,再去查询历史分区。这样也能保证超过2个月的快递单也能正常查询。

 

总结:

分区表,到底选择global index还是local index,需要根据具体的业务和运维的实际需求而定。不需要删除历史分区数据的分区表,可以创建global index(如基础数据表);需要定期删除历史分区的分区表,最好是创建local index,如果遇到分区字段无法成为查询条件时,建议尽量减少分区数,避免过多的local index 扫描,影响SQL性能。

PS C:\Users\16064> npm install -g create-react-app npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead. npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead. npm ERR! code ECONNREFUSED npm ERR! syscall connect npm ERR! errno ECONNREFUSED npm ERR! FetchError: request to https://registry.npm.taobao.or/create-react-app failed, reason: connect ECONNREFUSED 127.0.0.2:443 npm ERR! at ClientRequest.<anonymous> (D:\node.js\node_modules\npm\node_modules\minipass-fetch\lib\index.js:130:14) npm ERR! at ClientRequest.emit (node:events:527:28) npm ERR! at TLSSocket.socketErrorListener (node:_http_client:454:9) npm ERR! at TLSSocket.emit (node:events:539:35) npm ERR! at emitErrorNT (node:internal/streams/destroy:157:8) npm ERR! at emitErrorCloseNT (node:internal/streams/destroy:122:3) npm ERR! at processTicksAndRejections (node:internal/process/task_queues:83:21) npm ERR! FetchError: request to https://registry.npm.taobao.or/create-react-app failed, reason: connect ECONNREFUSED 127.0.0.2:443 npm ERR! at ClientRequest.<anonymous> (D:\node.js\node_modules\npm\node_modules\minipass-fetch\lib\index.js:130:14) npm ERR! at ClientRequest.emit (node:events:527:28) npm ERR! at TLSSocket.socketErrorListener (node:_http_client:454:9) npm ERR! at TLSSocket.emit (node:events:539:35) npm ERR! at emitErrorNT (node:internal/streams/destroy:157:8) npm ERR! at emitErrorCloseNT (node:internal/streams/destroy:122:3) npm ERR! at processTicksAndRejections (node:internal/process/task_queues:83:21) { npm ERR! code: 'ECONNREFUSED', npm ERR! errno: 'ECONNREFUSED', npm ERR! syscall: 'connect', npm ERR! address: '127.0.0.2', npm ERR! port: 443, npm ERR! type: 'system', npm ERR! requiredBy: '.' npm ERR! } npm ERR! npm ERR! If you are behind a proxy, please make sure that the npm ERR! 'proxy' config is set properly. See: 'npm help config'
03-28
### 关于npm install create-react-app 出现ECONNREFUSED错误的解决方案 在尝试通过 `npm install -g create-react-app` 命令安装 React 脚手架工具时,如果遇到 ECONNREFUSED 错误,通常表明网络连接存在问题或者配置不正确。以下是针对该问题的具体分析和解决方法。 #### 1. **检查当前 NPM 配置** NPM 默认使用的注册表可能由于网络原因无法访问,因此需要确认当前的 NPM 注册表地址是否正常工作。可以运行以下命令查看当前设置: ```bash npm config get registry ``` 如果返回的是默认地址(https://registry.npmjs.org/),而本地网络环境对该地址不可达,则可能导致此问题[^2]。 #### 2. **切换到国内镜像源** 为了提高下载速度并减少因网络不稳定引发的问题,建议临时更换为国内镜像源,例如淘宝 NPM 镜像。操作如下: ```bash npm config set registry https://registry.npm.taobao.org/ ``` 完成上述更改后再重新执行安装命令即可解决问题[^4]。 #### 3. **清理缓存数据** 有时旧版依赖包残留也可能引起冲突或异常行为,故推荐先清除全局范围内的缓存文件再继续下一步骤: ```bash npm cache clean --force ``` #### 4. **卸载已存在的 Create-React-App 并重试** 如果有先前未成功移除干净的老版本程序存在的话,可能会干扰新实例化过程中的某些环节运作情况;所以最好先把它们彻底删掉然后再做一次全新部署试试看效果如何? ```bash sudo npm uninstall -g create-react-app sudo cnpm install -g create-react-app ``` #### 5. **降级 Node.js 和 NPM 版本** 部分情况下高版本软件之间可能存在兼容性隐患,特别是当提示类似 “You are running `create-react-app` X.X.X...” 这样的警告信息时候更应该考虑适当下调目标平台的技术栈标准来匹配官方支持的最佳实践指南所指定的要求范围内进行调整适配处理才行哦!比如这里提到过的一个例子就是把最新稳定发行系列回退至 v6.x.y 的分支上作为替代方案之一来进行测试验证其可行性与否吧?具体做法如下所示代码片段里头已经给出相应示范啦😊。 ```bash npm install npm@6.14.11 -g ``` --- ### 总结 综上所述,对于 `npm install create-react-app` 中发生的 ECONNREFUSED 类型错误现象而言,主要可以从四个方面着手排查修复路径:一是核实现有仓库链接状态是否畅通无阻塞障碍物阻挡视线之外还能顺利抵达目的地呢?二是适时引入本土化的资源供应渠道以缓解跨国界传输延迟带来的不便之处啊~三是定期维护整理内部存储空间释放更多可用容量从而提升整体性能表现水平达到预期目的要求之上加一点额外奖励分数也不错哟😄四是必要时刻果断采取行动将基础架构组件规格参数设定回归合理区间之内确保整个生态系统能够长期健康可持续发展下去永远保持活力四射的状态迎接未来无限可能性挑战💪! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值