最近的几个技术问题总结和答疑(九)

简介:     最近的琐事比较多,而提问题的朋友还是不少,很多消息都没有来得及回复,各种事情一堆起来,不少问题想起来已经过了好几天了,所以还是来整理一篇技术问答为好。     首先是很多朋友问我关于半自动化搭建Data Guard的脚本,我写了几篇文章来介绍思路,自己也提了不少的改进,团队内部也沟通过了,一直迟迟没有发布出来是因为我觉得目前的实现方式可能对于我的工作能够极大提高,但是很多朋友使用的环境可能没有中控的概念,所以不是很通用,所以我想做一些改变,还有一个是里面的有些逻辑我想改改,至少简化一下。
    最近的琐事比较多,而提问题的朋友还是不少,很多消息都没有来得及回复,各种事情一堆起来,不少问题想起来已经过了好几天了,所以还是来整理一篇技术问答为好。
    首先是很多朋友问我关于半自动化搭建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.
select to_char(endpoint_value) value,endpoint_number,column_name from dba_tab_histograms where table_name = 'TEST_STATS' and column_name in ('ORDER_ID','USER_ID') ORDER BY endpoint_number;
VALUE                                    ENDPOINT_NUMBER COLUMN_NAME
---------------------------------------- --------------- --------------------
250207622735984000000000000000000000                   0 ORDER_ID
604364106098959000000000000000000000                   0 USER_ID
250207622735984000000000000000000000                   1 ORDER_ID
604364106160614000000000000000000000                   1 USER_ID
这个值是怎么算出来的。
首先对字段order_id的max值做一个dump
SQL> select to_char(substrb(dump(max("ORDER_ID"),16,0,32),1,120))  from "N1"."TEST_STATS" t ;
TO_CHAR(SUBSTRB(DUMP(MAX("ORDER_ID"),16,0,32),1,120))
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Typ=1 Len=19: 30,30,30,30,30,30,30,30,30,30,30,30,31,32,35,31,35,31,34
然后取前30位,转为十六进制,得到的是2502开始的一长串数字。
SQL> select to_number('303030303030303030303030313235','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') aa from dual;
                                                           AA
-------------------------------------------------------------
                         250207622735984164311304858405777973
而得到的这一长串数字的前15位是什么呢?                      
SQL>  select substr('250207622735984164311304858405777973',1,15) from dual;
SUBSTR('2502076227359841643113
------------------------------
250207622735984
我们这个时候来看看直方图数据字典的信息。可以看到value是250207622735984000000000000000000000,前面的15位就是我们计算得到的这个数字。
select to_char(endpoint_value) value,endpoint_number,column_name from dba_tab_histograms where table_name = 'TEST_STATS' and column_name in ('ORDER_ID') ORDER BY endpoint_number;
VALUE                                    ENDPOINT_NUMBER COLUMN_NAME
---------------------------------------- --------------- --------------------
250207622735984000000000000000000000                   0 ORDER_ID
250207622735984000000000000000000000                   1 ORDER_ID
而如果我们重新收集统计信息,指定bucket为20
exec dbms_stats.gather_table_stats(tabname => 'test_stats',ownname => 'N1',method_opt => 'FOR  COLUMNS SIZE 20  ORDER_ID');
然后再次查看,其实这个时候只生成了3个,因为我只插入了3行数据,样本太少,但是查看value值是一样的,这样也就很难有所差别,其实也算是丢失了一些精度导致。
SQL>  select to_char(endpoint_value) value,endpoint_number,column_name,ENDPOINT_ACTUAL_VALUE from dba_tab_histograms where table_name = 'TEST_STATS' and column_name in ('ORDER_ID') ORDER BY endpoint_number;

VALUE                                    ENDPOINT_NUMBER COLUMN_NAME          ENDPOINT_ACTUAL_VALUE
---------------------------------------- --------------- -------------------- ----------------------------------------
250207622735984000000000000000000000                   1 ORDER_ID             0000000000001241414
250207622735984000000000000000000000                   2 ORDER_ID             0000000000001251414
250207622735984000000000000000000000                   3 ORDER_ID             0000000000001251514



    

目录
相关文章
|
存储 人工智能 缓存
空间复杂度介绍
空间复杂度介绍
333 0
|
数据安全/隐私保护
全球免费编程教育网站:Code.org
你还在为小朋友的编程教育而发愁吗? 你还在为小朋友放假无聊而头疼吗? 他来了他来了,全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、学生从来自少数民族提供机会。 其愿景是:每所学校的每位学生都有机会学习计算机科学,就像学习生物、化学和代数。 提供了最广泛讲授的中小学计算机科学课程,也会每年组织编程一小时活动。 这已吸引了全世界约 10% 的学生来参与。 Code.org 得到了亚马逊、脸书、谷歌、印孚瑟斯基金会、微软等更多慷慨捐助者的支持。
2161 0
|
2月前
|
存储 弹性计算 Linux
阿里云服务器从零到精通的购买指南,云服务器购买流程及注意事项参考
对于许多初次接触阿里云服务器的用户而言,如何选择云服务器配置以及在选购过程中有哪些注意事项,是新手用户比较关心的问题。本文为大家展示阿里云服务器选购的完整指南,涵盖了通过云服务器ECS产品页下单的详细步骤,以及通过阿里云的活动选购价格比较实惠的云服务器。重点是介绍每一步的注意事项,以供初次选购阿里云服务器的个人开发者和企业用户参考,尽量一次选购好,避免出现买错从新买的情况出现。
|
传感器 机器学习/深度学习 数据采集
【航迹关联】基于NNDA、PDA、JPDA三种算法实现航迹关联附matlab代码
【航迹关联】基于NNDA、PDA、JPDA三种算法实现航迹关联附matlab代码
|
2月前
|
人工智能 运维 安全
运维老哥的救星?AI 驱动的自动化配置管理新趋势
运维老哥的救星?AI 驱动的自动化配置管理新趋势
167 11
|
5月前
|
存储 人工智能 搜索推荐
使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
本地视频合并工具在应对存储空间、网络环境、软件安装和隐私安全等痛点上具有显著优势。而 CodeBuddy 凭借其强大的编程能力,为高效开发功能丰富、个性化的本地视频合并工具提供了可靠途径,让视频合并变得更加简单、便捷、安全。 还没有入手的同学赶紧去试试吧
156 6
使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
|
存储 监控 NoSQL
redis主从模式,redis哨兵模式,redis集群模式
redis主从模式,redis哨兵模式,redis集群模式
327 1
redis主从模式,redis哨兵模式,redis集群模式
|
机器学习/深度学习 人工智能 算法
智能增强:人工智能在医疗诊断中的应用与挑战
本文深入探讨了人工智能技术在医疗诊断领域的应用及其带来的变革。文章首先概述了AI技术的基本原理和发展历程,随后详细分析了AI在提高诊断准确性、个性化治疗计划以及疾病预防方面的具体应用案例。同时,文章也指出了AI在医疗实践中面临的数据隐私、算法透明度和医疗伦理等挑战,并提出了相应的解决策略。最后,文章展望了AI技术在未来医疗诊断中的发展前景,强调了跨学科合作的重要性以及持续监管和技术创新的必要性。
|
存储 关系型数据库 MySQL
MySQL索引设计原则与优化策略
MySQL索引设计原则与优化策略
|
机器学习/深度学习 计算机视觉 网络架构
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
719 0
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)

热门文章

最新文章