Buckets

Oracle执行计划(Explain Plan)

二次信任 提交于 2020-05-05 21:45:38
如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列 执行计划的常用列字段解释: 基数(Rows):Oracle估计的当前操作的返回结果集行数 字节(Bytes):执行该步骤后返回的字节数 耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入) 时间(Time):Oracle估计的当前操作所需的时间 ②:打开执行计划: 在SQL窗口执行完一条select语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划 注:在PLSQL中使用SQL命令查看执行计划的话,某些SQL*PLUS命令PLSQL无法支持,比如SET AUTOTRACE ON 三:看懂Oracle执行计划 ①:执行顺序:

HashMap

牧云@^-^@ 提交于 2020-05-05 16:06:28
参考: 1 2 Set 家族 推荐: java 8 API Set:集合,里面不能有重复元素 Set 在 Java 中是一个接口,可以看到它是 java.util 包中的一个集合框架类,具体的实现类有很多: 其中比较常用的有三种: HashSet : 采用 Hashmap 的 key 来储存元素,主要特点是无序的,基本操作都是 O(1) 的时间复杂度,很快。 LinkedHashSet : 这个是一个 HashSet + LinkedList 的结构,特点就是既拥有了 O(1) 的时间复杂度,又能够保留插入的顺序。 TreeSet【还未看】 : 采用红黑树结构,特点是可以有序,可以用自然排序或者自定义比较器来排序;缺点就是查询速度没有 HashSet 快。 Map 家族 Map 是一个键值对 (Key - Value pairs),其中 key 是不可以重复 那么与 Set 相对应的,Map 也有这三个实现类: HashMap : 与 HashSet 对应,也是无序的,O(1)。 LinkedHashMap : 这是一个「HashMap + 双向链表」的结构,落脚点是 HashMap,所以既拥有 HashMap 的所有特性还能有顺序。 TreeMap : 是有序的,本质是用二叉搜索树来实现的。 HashMap 实现原理 对于 HashMap 中的每个 key,首先通过 hash

ceph学习笔记

喜你入骨 提交于 2020-05-04 21:57:26
1. ceph对象存储简介 1.1 核心概念 用户 对象存储的使用者,存储桶的拥有者 存储桶 作为存放对象的容器 对象 用户实际上传的文件 1.用户 RGW兼容AWS S3和OpenStack Swift。RGW user对应S3 user,RGW user对应Swift Account,RGW subuser对应Swift user。 用户数据信息包含: 用户认证信息:S3(access key, secret key), Swift(secret key) 访问控制权限信息:包含操作访问权限(read、write、delete等)和访问控制列表ACL 用户配额信息:防止某些用户占用过多存储空间,根据用户付费情况配置存储空间。 2.存储桶(bucket) 存储桶是对象的容器,是为了方便管理和操作具有相同属性的一类对象而引入的一级管理单元。 存储桶信息包含: 基础信息:(保存在对应RADOS对象的数据部分)RGW关注的信息,包含bucket配额信息(最大对象数目或最大对象大小总和),bucket placement rule,bucket中的索引对象数目等等。 扩展信息:(保存在对应RADOS对象的扩展属性)对RGW透明的一些信息,如用户自定义的元数据信息 对于bucket placement rule, 3.对象 RGW中的应用对象对应RADOS对象

tcp_tw_reuse、tcp_tw_recycle注意事项

[亡魂溺海] 提交于 2020-05-03 19:46:20
linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭 net.ipv4.tcp_fin_timeout = 60 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间 注意: - 不像Windows 可以修改注册表修改2MSL 的值,linux 需要修改内核宏定义重新编译,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态超时时间. - tcp_tw_reuse 和 SO_REUSEADDR 是两个完全不同的东西 SO_REUSEADDR 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; SO_RESUSEPORT linux 3.7才支持,用于绑定相同ip:port,像nginx 那样 fork方式也能实现 1. tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开) 2. tw_reuse 只对客户端起作用,开启后客户端在1s内回收 3. tw_recycle

C#异步编程(五)异步的同步构造

岁酱吖の 提交于 2020-05-02 04:33:54
异步的同步构造   任何使用了 内核模式的线程同步构造 ,我都不是特别喜欢。因为所有这些基元都会阻塞一个线程的运行。创建线程的代价很大。创建了不用,这于情于理说不通。   创建了reader-writer锁的情况,如果写锁被长时间占有,那么其他的读请求线程都会被阻塞,随着越来越多客户端请求到达,服务器创建了更多的线程,而他们被创建出来的目的就是让他们在锁上停止运行。更糟糕的是,一旦writer锁释放,所有读线程都同时解除阻塞并开始执行。现在,又变成大量的线程试图在相对数量很少的cpu上运行。所以,windows开始在线程之间不同的进行上下文切换,而真正的工作时间却很少。 锁很流行,但长时间拥有会带来巨大的伸缩性问题。如果代码能通过异步的同步构造指出他想要一个锁,那么会非常有用。在这种情况下,如果线程得不到锁,可直接返回并执行其他工作,而不必在那里傻傻地阻塞。 SemaphoreSlim通过waitAsync实现了这个思路 public Task<bool> WaitAsync(int millisecondsTimeout, CancellationToken cancellationToken); 使用await asynclock.WaitAsync()就可以实现刚才说的情境。 但如果是reader-writer呢?.net

Core源码(一) ConcurrentDictionary

情到浓时终转凉″ 提交于 2020-05-02 04:17:36
先贴源码地址 https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs .NET CORE很大一个好处就是代码的开源,你可以详细的查看你使用类的源代码,并学习微软的写法和实现思路。   这里我对.net core中ConcurrentDictionary源码进行了分析,里面采用了Volatile.Read和write(volatile作用:确保本条指令不会因编译器的优化而省略,且要求每次直接从内存地址读值,而不走寄存器),然后也使用了lock这种混合锁,而且还定义了更细颗粒度的锁。所以多线程使用ConcurrentDictionary集合还是比较好的选择。 本来想把本篇放到我的《 C#异步编程系列 》,不过后来感觉那个系列写的已经算是收尾了,而且以后还会有写更多core源码分析的文字,所以就单独新增一个系列把。 ConcurrentDictionary内部私有类 先上源码,再仔细聊 /// <summary> /// Tables that hold the internal state of the ConcurrentDictionary /// ///

ConcurrentDictionary

可紊 提交于 2020-05-01 07:22:40
ConcurrentDictionary ConcurrentDictionary一大特点是线程安全,在没有ConcurrentDictionary前 在多线程下用Dictionary,不管读写都要加个锁,不但麻烦,性能上也不是很好 微软得出的结果是默认的锁的数量是CPU核的个数,这个线程池默认的线程数量一样。随着Dictionary的扩容,锁的个数也可以跟着增加,这个可以在构造函数中自己指定。 private sealed class Tables { internal readonly Node[] _buckets; // bucket成了这样,也就是ConcurrentDictionary可以认为是一个bucket数组,每个Bucket里又由next来形成链表 internal readonly object[] _locks; // 这个就是锁的数组了 internal volatile int[] _countPerLock; // 这个是每个锁罩的元素个数 internal Tables(Node[] buckets, object[] locks, int[] countPerLock) { _buckets = buckets; _locks = locks; _countPerLock = countPerLock; } } /

ConcurrentDictionary并发字典知多少?

本小妞迷上赌 提交于 2020-05-01 07:14:04
背景 在上一篇文章 你真的了解字典吗? 一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?redirectedfrom=MSDN&view=netframework-4.7.2 查阅相关资料后,发现字典.net中Dictionary本身时不支持线程安全的,如果要想使用支持线程安全的字典,那么我们就要使用ConcurrentDictionary了. 在研究ConcurrentDictionary的源码后,我觉得在ConcurrentDictionary的线程安全的解决思路很有意思,其对线程安全的处理对对我们项目中的其他高并发场景也有一定的参考价值,在这里再次分享我的一些学习心得和体会,希望对大家有所帮助. Concurrent ConcurrentDictionary是Dictionary的线程安全版本,位于System.Collections.Concurrent的命名空间下,该命名空间下除了有ConcurrentDictionary,还有以下Class都是我们常用的那些类库的线程安全版本.

Ceph CRUSH算法

江枫思渺然 提交于 2020-04-27 12:23:25
1. 数据分布算法挑战 数据分布和负载均衡: a. 数据分布均衡,使数据能均匀的分布到各个节点上。 b. 负载均衡,使数据访问读写操作的负载在各个节点和磁盘的负载均衡。 灵活应对集群伸缩 a. 系统可以方便的增加或者删除节点设备,并且对节点失效进行处理。 b. 增加或者删除节点设备后,能自动实现数据的均衡,并且尽可能少的迁移数据。 支持大规模集群 a. 要求数据分布算法维护的元数据相对较小,并且计算量不能太大。随着集群规模的增 加,数据分布算法开销相对比较小。 2. Ceph CRUSH算法说明 CRUSH算法的全称为:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可扩展的、分布式的副本数据放置算法。 pg到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。 CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。 3. Ceph CRUSH算法原理 CRUSH算法因子: 层次化的Cluster Map 反映了存储系统层级的物理拓扑结构。定义了OSD集群具有层级关系的 静态拓扑结构。OSD层级使得

Leetcode题解——算法思想之排序

浪尽此生 提交于 2020-04-25 19:19:49
快速选择 堆 1. Kth Element 桶排序 1. 出现频率最多的 k 个元素 2. 按照字符出现次数对字符串排序 荷兰国旗问题 1. 按颜色进行排序 快速选择 用于求解 Kth Element 问题,也就是第 K 个元素的问题。 可以使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N 2 )。 堆 用于求解 TopK Elements 问题,也就是 K 个最小元素的问题。可以维护一个大小为 K 的最小堆,最小堆中的元素就是最小元素。最小堆需要使用大顶堆来实现,大顶堆表示堆顶元素是堆中最大元素。这是因为我们要得到 k 个最小的元素,因此当遍历到一个新的元素时,需要知道这个新元素是否比堆中最大的元素更小,更小的话就把堆中最大元素去除,并将新元素添加到堆中。所以我们需要很容易得到最大元素并移除最大元素,大顶堆就能很好满足这个要求。 堆也可以用于求解 Kth Element 问题,得到了大小为 k 的最小堆之后,因为使用了大顶堆来实现,因此堆顶元素就是第 k 大的元素。 快速选择也可以求解 TopK Elements 问题,因为找到 Kth Element 之后,再遍历一次数组,所有小于等于 Kth Element 的元素都是 TopK Elements。 可以看到,快速选择和堆排序都可以求解 Kth Element 和 TopK