sql 账号查询一个表查询权限_一个查询语句引发的问题以及巨型表相关操作探索与思考...
背景:
关于这个标题想了试了好几个总觉得欠那么点意思。大致情况是,在某服务支持中,1张大表4.5T左右,该表也是分区表。其中一个执行频繁的SQL写法有很大问题,导致巨表全量扫描,造成IO负载很大,业务收到严重影响。
由于线上阶段基本上没有改SQL的可能, 只能通过其他途径优化。现场想到一种可行的方案,周末实在手痒,决定测试测试该方案理论上的可行性。
基本情况:
数据库:Oracle 11G
表情况:4.5T左右,二级分区表,3.9万分区,分区如果有数据的话,数据量不大大概是2-3G左右。
分区字段:数据日期+XXX字段。
分区:range-range(应该是range-range这边有点模糊)
SQL情况
SQL比较长,也有好多张表关联,这边只重点说出现性能瓶颈的地方,
SQL:where trunc(分区字段)=trunc(XX, yyyy-mm-dd) and XX like :B ;
导致识别不了分区,只能全分区扫描。
本机测试
表:par_range_range
分区类型:range-range;
分区字段:data_dt (DATE类型); hash_flag (number类型)
SQL:模拟生产环境出现的问题
select count(1) from par_range_range t
where hash_flag <1.5 and hash_flag>=0.1
andtrunc(data_dt) = trunc(to_date('2020-11-01', 'yyyy-mm-dd'));
问题就是 trunc(data_dt) 无法识别那个分区只能走全分区扫描,有经验的人立马知道怎么搞,实际中把搞成 trunc(to_date('2020-11-01', 'yyyy-mm-dd'))<= data_dt < to_date('2020-11-02','yyyy-mm-dd')。现场调整后也是秒杀的,但是甲方需要不改SQL,就能优化。
实验课题:
通过建立索引优化该SQL,(该问题引发一系列思考)
探索巨表建立索引方案(其实这里更感兴趣)
通过建立合适索引把全表扫描转换成索引扫描
巨表怎么建立索引?保证不会占用太多系统资源,比如IO,内存,temp. 甚 至做到系统无感知。因为已经出现了扫描巨表数据时候IO超负载。
前两个可行基础上加快建索引速度
这怎么看都是一个不可能完成的任务。
这里说下最终方案:
建立需要分区索引,建索引时候也要讲究,最初建索引的语句要带上unusable 关键字,这样建索引时候就不会创建索引段,自然也不会扫描表数据。所以这边建立索引能很快完成。
随即按照分区,重建分区索引。因为这边只需要扫描单个表分区,就能很快完成对应分区索引的重建,毕竟扫描数据量小了很多。因此整体方案理论上可行。
数据量:445万,722M ,本机测试环境,数据量有限。这边测试原理
建立索引语句:
create index idx_prr_dt_flag on
par_range_range(trunc(data_dt),hash_flag) local unusable;
测试环境中很快完成。
建立后查询索引分区:
重建分区索引。
重建完成后,这边只查询到重建的索引分区的segement。说明符合预期,只有在rebulid时候才创建索引segement。
优化效果(重建完所有分区后):
优化前:全表扫描 4.3万逻辑读/次,
优化后:索引范围扫描,414万逻辑读/次 效率提升了近100倍
总结:
该方案精彩的地方在于把复杂的大表建立索引,成功转换成更加细微力度的建立分区索引,解决了大表建立索引过程中带来的IO,内存等系统资源占用率超大等问题。而重建分区索引,单个分区的数据量要小得多,当然重建也容易的多。最终把问题SQl成功优化。
结束语:
本文就是利用延迟加载,完成超大表建立索引,然后再实践中总结知识点。用论语中一句话结尾吧。论语:知之为知之,不知为不知。我在想是不是可以这样“探索”,知之,为,知之!,不知为,不知。可以这样解读:掌握一门知识,并且赋予实践。然后在实践中再总结知识。不了解或者不掌握一门知识,直接干,最终是不能总结出知识的。
sql 账号查询一个表查询权限_一个查询语句引发的问题以及巨型表相关操作探索与思考...相关推荐
- 创建数据账号只有个别表的权限_创建MySQL用户 赋予某指定库表的权限
摘自: http://renxiangzyq.iteye.com/blog/763837 update ERROR 1364 (HY000): Field 'ssl_cipher' doesn't h ...
- 创建数据账号只有个别表的权限_只有普通权限账号,如何把远程数据库中该用户的数据表导入到本地数据库?...
试试oracle提供的脚本. set pagesize 0 -- This script dumps a table to a comma delimited ASCII file and -- al ...
- 导学+初识MySQL+SQL语法规范+数据库相关操作+表相关操作+MySql存储引擎介绍+MySQL表的创建+测试数据类型
一.导学 1.什么是SQL? 结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据: 2.SQL语言组成部分 (1)DDL--数据定义语言,主要定义数据库.表.视图.索引和触发器等 (2) ...
- mysql数据表交叉引用_数据定义语句
数据定义语句 MySQL 8.0支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中.即使事 ...
- mysql获取下一条自增的id_mysql获取一个表中的下一个自增(id)值的方法
mysql获取一个表中的下一个自增(id)值的方法 MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get t ...
- MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表
MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表 有两张表,info1, info2 . info1: info2: 方式一:要用info2中的 ...
- mysql数据表关联操作步骤_MySQL数据库(三)—— 表相关操作(二)之约束条件、关联关系、复制表...
表相关操作(二)之约束条件.关联关系.复制表 一.约束条件 1.何为约束 除了数据类型以外额外添加的约束 2.约束条件的作用 为了保证数据的合法性,完整性 3.主要的约束条件 NOT NULL #标识 ...
- 库查询所有表的权限_JSW 基于WEB的MSSQL数据库查询平台
项目介绍 所有企业都面临的一个需求就是需要运维开发人员连接线上生产库进行数据查询或解决线上问题,但又担心开发人员查询线上敏感数据甚至拖库.一般做法都是: 通过数据库账号限制查询人员.限制查询的表和字段 ...
- sql 一个字段在另外一个表没出现_都9012年啦,不懂得这些SQL语句优化,你是要吃大亏的...
引言 数据库的性能优化技术一直是个老生常谈的问题,不管是MySQL.SQL Server还是Oracle. 对于我们IT开发人员和运维人员,掌握常用的SQL 优化语句是非常必要的,它可以使你的工作变得 ...
最新文章
- 使用C++实现Socket编程传输协议文件(包括大文件)
- Eclipse安装Svn无法连接问题
- Python面向对象基础:设置对象属性
- [概统]本科二年级 概率论与数理统计 第二讲 几何概型
- 中国鱼胶原蛋白行业应用前景与十四五投资建议报告2022年
- openssl 测试加密卡_OpenSSL自带的aes_128_ecb加密函数——密文长度测试
- LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)
- 哈佛成功金句 -25则
- 扫二维码缴违章停车罚款?骗你的!
- Chapter 5 : 索引和算法
- 三星S7edge番茄花园ROM
- Linux系统下QT九宫格拼图小游戏
- Python学习笔记—— 面向对象5.异常
- Java计算长方体、四棱锥的表面积和体积
- 公司职员薪水管理系统(List)
- 操作系统--windows系列之windows8
- 智课雅思词汇---二十五、-ate
- 反激式开关电源双环PID(电压环+电流环)控制之MATLAB仿真
- GoogleChrome与Firefox的那些事
- 乱七八糟之处理器天梯图