最近的几个技术问题总结和答疑(九)(r10笔记第16天)
最近的琐事比较多,而提问题的朋友还是不少,很多消息都没有来得及回复,各种事情一堆起来,不少问题想起来已经过了好几天了,所以还是来整理一篇技术问答为好。
首先是很多朋友问我关于半自动化搭建Data Guard的脚本,我写了几篇文章来介绍思路,自己也提了不少的改进,团队内部也沟通过了,一直迟迟没有发布出来是因为我觉得目前的实现方式可能对于我的工作能够极大提高,但是很多朋友使用的环境可能没有中控的概念,所以不是很通用,所以我想做一些改变,还有一个是里面的有些逻辑我想改改,至少简化一下。但是一直是思想的前行者,行动的矮子,这件事情拖了不少日子。真是惭愧,我力争下周末前分享出来,然后附上简单的使用说明。
最近开始实践时间管理,所以对于微信上的事情花的精力就少了很多,这样可以让我更加专注,可能隔一段时间我会看看聊天记录。不知不觉,又堆积了快一百条未读消息,目前我使用的时间管理工具是日事清,至少这个工具能够手机端,电脑端都可以同步,这个完全符合我的习惯,使用起来还不错,其实越是指定详细的计划,越是发现自己很多东西都需要学习,都需要改进。看来分得了轻重缓急,而且能够实践到位是一件很不容易的事情。我发现很多时候都会有急于求成的心态,所以任务栏上的有些东西突然加上去了,而有些计划内的东西就耽搁了,长此以往会逐步有拖延的现象,这个一定要引以为戒。
然后来解答几个技术问题。
今天在微信群中看到叶老师提问关于得到DB time的曲线图,其实要得到这样的图形,有两种思路,一种就是得到实时的数据,这个就需要指定频度来抓取状态数据,比如抓取实时DB time,根据这些状态点信息得到一个完整的曲线图,这个在Zabbix监控体系中是没有问题的,而且基于Oracle的监控可以使用Orabbix,要查看按天,按周,按月的曲线图,这个在Zatree里面是完全支持的,目前我们也这么用;而另外一种思路就是基于快照,这个得到的数据频度可能是半小时或者一小时,状态略粗一些,我下午整理了一个shell脚本,感兴趣百度网盘可以查看 https://pan.baidu.com/s/1nvCnl1J
而自我上次发了一篇关于执行计划直方图的文章一来,还是有几个朋友对这方面很关注,提了不少的建议。有些朋友问那个15个字符是什么意思,没看明白,我做个小测试来说明。
创建一个测试表。
> create table test_stats (order_id varchar2(64),user_id varchar2(64),channel_id number);
Table created.
> insert into test_stats values('0000000000001241414','test',1);
1 row created.
> insert into test_stats values('0000000000001251414','test2',2);
1 row created.
> insert into test_stats values('0000000000001251514','test3',2);
1 row created.
> commit;
Commit complete.
如果想看更多细节,可以开启10046事件。
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'
收集统计信息
exec dbms_stats.gather_table_stats(tabname => 'test_stats',ownname => 'N1',method_opt => 'FOR ALL COLUMNS SIZE AUTO');
ALTER SESSION SET EVENTS '10046 trace name context off'
收集统计信息使用了auto选项呢,可以看到,都没有生成直方图信息。
SELECT COLUMN_NAME, NUM_DISTINCT, NUM_BUCKETS, HISTOGRAM
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'TEST_STATS' AND COLUMN_NAME IN ('ORDER_ID','USER_ID') ;
COLUMN_NAME NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------------------- ------------ ----------- ------------------------------
ORDER_ID 3 1 NONE
USER_ID 3 1 NONE
但是实际上查看数据字典可以看到还是依旧存在两个默认的bucket.
这个值是怎么算出来的。 首先对字段order_id的max值做一个dump,然后取前30位,转为十六进制,得到的是2502开始的一长串数字。
而得到的这一长串数字的前15位是什么呢?
我们这个时候来看看直方图数据字典的信息。可以看到value是250207622735984000000000000000000000,前面的15位就是我们计算得到的这个数字。
而如果我们重新收集统计信息,指定bucket为20 exec dbms_stats.gather_table_stats(tabname => 'test_stats',ownname => 'N1',method_opt => 'FOR COLUMNS SIZE 20 ORDER_ID'); 然后再次查看,其实这个时候只生成了3个,因为我只插入了3行数据,样本太少,但是查看value值是一样的,这样也就很难有所差别,其实也算是丢失了一些精度导致。
- Elastic 技术栈之 Filebeat
- Elastic 技术栈之 Logstash 基础
- 备库CPU使用异常优化(r6笔记第73天)
- 数据清理的遗留问题处理(二)(r6笔记第91天)
- Kaggle Titanic 生存预测比赛超完整笔记(上)
- 多系统交互中DBA需要实现的技术细节(r6笔记第90天)
- Kaggle Titanic 生存预测比赛超完整笔记(中)
- SDP(11):MongoDB-Engine功能实现
- SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
- Kaggle Titanic 生存预测比赛超完整笔记(下)
- SDP(9):MongoDB-Scala - data access and modeling
- 数据清理的遗留问题处理(r6笔记第87天)
- 一次DB time抖动发现的expdp的bug(r6笔记第86天)
- Python中map函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于rest风格对Neo4j进行调用访问之———httpClient
- spring boot + mybatis 访问 neo4j
- window下通过ELK框架进行大型日志线下的可视化分析
- 一句话解释ThreadLocal类
- ElasticsSearch 之 倒排索引
- tomcat返回cookie有双引号问题
- 利用辗转相除法求最大公约数以及最小公倍数-Java
- 网络爬虫的风险
- git 使用小结大全
- Elasticsearch:search template
- 模仿echo命令学习BIO——Java实现
- 模仿echo命令学习NIO——Java实现
- Java 7 种阻塞队列详解
- protocol buffers 序列化数据
- dubbo的Failed to save registry store file问题