Elapse

一文为你详解Unique SQL原理和应用

耗尽温柔 提交于 2020-12-16 12:11:25
摘要 :以一定的算法结合解析树中的各结点,计算出来一个整数值,用来唯一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID相同的SQL语句属于同一个“Unique SQL”。 1、 什么是Unique SQL 用户执行SQL语句时,每一个SQL语句文本都会进入解析器(Parser),生成“解析树”(parse tree)。遍历解析树中各个结点,忽略其中的常数值,以一定的算法结合树中的各结点,计算出来一个整数值,用来唯一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID相同的SQL语句属于同一个“Unique SQL”。 例如,用户先后输入如下两条SQL语句: select * from t1 where id = 1; select * from t1 where id = 2; 这两条SQL语句除了过滤条件的常数值不同,其他地方都相同,由此生成的解析树的拓扑结构完全相同,故Unique SQL ID也相同。因此两条语句属于如下同一个Unique SQL: select * from t1 where id = ?; GaussDB内核会对所有上面形式的SQL语句汇总统计信息,通过视图呈现给用户。通过这种方式,可以排除一些无关的常量值的干扰,获得某一类SQL语句的统计数据,为性能分析和问题定位提供数值依据。

BIRT 中根据参数实现动态日期分组

邮差的信 提交于 2020-08-13 04:03:39
BIRT一般擅长处理规则一致的数据,若条件不一致的动态运算在报表中是很难实现的。常规办法是创建scripted data sources, 在该脚本源上自行处理业务逻辑把数据准备好,然后直接传给BIRT展现。但SQL或scripted data sources的方式,代码写起来非常麻烦,而且工作量很大。 比如要处理这么个场景:按照开始日期、结束日期统计一段时间内订单,但要根据起止日期的跨度长短实现按天、按周、按月、按年动态分组显示结果。查询流程如下图所示: 建议使用集算器,其丰富的集合运算可以方便地完成这类计算和逻辑判断,比Java写的代码要短,比存储过程写起来更简单,比如类似的计算在集算器里可以这样写: A B 1 =[] 2 =demo.query@x("select ORDERID,ORDERDATE,ORDERAMOUNT from ORDERS where ORDERDATE>=? and ORDERDATE<=?",startDate,endDate) 3 =interval(startDate,endDate) 4 if A3>365 >A1=startDate|A3.(elapse@y(startDate,~)) 5 else if A3>30 >A1=startDate|A3.(elapse@m(startDate,~)) 6 else if A3>15 >A1

系统梳理主流定时器算法实现的差异以及应用

只谈情不闲聊 提交于 2020-08-11 18:31:35
这一篇文章系统的梳理主流定时器算法实现的差异以及应用地方。 1. 定时器介绍 程序里的定时器主要实现的功能是在未来的某个时间点执行相应的逻辑。在定时器模型中,一般有如下几个定义。 interval:间隔时间,即定时器需要在interval时间后执行 StartTimer:添加一个定时器任务 StopTimer:结束一个定时器任务 PerTickBookkeeping: 检查定时器系统中,是否有定时器实例已经到期,相当于定义了最小时间粒度。 常见的实现方法有如下几种: 链表 排序链表 最小堆 时间轮 接下来我们一起看下这些方法的具体实现原理。 2. 定时器实现方法 2.1 链表实现 链表的实现方法比较粗糙。链表用于存储所有的定时器,每个定时器都含有interval 和 elapse 两个时间参数,elapse表示当前被tickTimer了多少次。当elapse 和interval相等时,表示定时器到期。 在此方案中,添加定时器就是在链表的末尾新增一个节点,时间复杂度是 O(1)。如果想要删除一个定时器的话,我们需要遍历链表找到对应的定时器,时间复杂度是O(n)。此方案下,每隔elapse时间,系统调用信号进行超时检查,即PerTickBookkeeping。每次PerTickBookkeeping需要对链表所有定时器进行 elapse++

postgresql lock 锁等待查看

你说的曾经没有我的故事 提交于 2020-04-26 17:46:27
postgresql lock 锁等待查看 当SQL请求锁等待超过deadlock_timeout指定的时间时,报类似如下日志: LOG: process xxx1 acquired RowExclusiveLock on relation xxx2 of database xxx3 after xxx4 ms at xxx STATEMENT: INSERT ........... 解释: xxx1进程请求位于数据库xxx3中的xxx2对象的RowExclusiveLock锁,已等待xxx4秒。 如何检查或监控锁等待呢? PostgreSQL提供了两个视图 pg_locks展示锁信息,每一个被锁或者等待锁的对象一条记录。 pg_stat_activity,每个会话一条记录,显示会话状态信息。 我们通过这两个视图可以查看锁,锁等待情况。同时可以了解发生锁冲突的情况。 注意:pg_stat_activity.query反映的是当前正在执行或请求的SQL,而同一个事务中以前已经执行的SQL不能在pg_stat_activity中显示出来。所以如果你发现两个会话发生了冲突,但是他们的pg_stat_activity.query没有冲突的话,那就有可能是他们之间的某个事务之前的SQL获取的锁与另一个事务当前请求的QUERY发生了锁冲突。 通常锁的排查方法如下 开启审计日志log

使用Data Lake Analytics + OSS分析CSV格式的TPC-H数据集

不想你离开。 提交于 2019-12-04 08:38:36
0. Data Lake Analytics(DLA)简介 关于Data Lake的概念,更多阅读可以参考: https://en.wikipedia.org/wiki/Data_lake 以及AWS和Azure关于Data Lake的解读: https://amazonaws-china.com/big-data/datalakes-and-analytics/what-is-a-data-lake/ https://azure.microsoft.com/en-us/solutions/data-lake/ 终于,阿里云现在也有了自己的数据湖分析产品: https://www.aliyun.com/product/datalakeanalytics 可以点击申请使用(目前公测阶段还属于邀测模式,我们会尽快审批申请),体验本教程的TPC-H CSV数据格式的数据分析之旅。 产品文档: https://help.aliyun.com/product/70174.html 1. 开通Data Lake Analytics与OSS服务 如果您已经开通,可以跳过该步骤。如果没有开通,可以参考: https://help.aliyun.com/document_detail/70386.html 进行产品开通服务申请。 2. 下载TPC-H测试数据集 可以从这下载TPC-H

死磕 java同步系列之ReentrantLock VS synchronized——结果可能跟你想的不一样

放肆的年华 提交于 2019-11-26 20:28:57
问题 (1)ReentrantLock有哪些优点? (2)ReentrantLock有哪些缺点? (3)ReentrantLock是否可以完全替代synchronized? 简介 synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。 ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。 既然有了synchronized的关键字来保证同步了,为什么还要实现一个ReentrantLock类呢?它们之间有什么异同呢? ReentrantLock VS synchronized 直接上表格:(手机横屏查看更方便) 功能 ReentrantLock synchronized 可重入 支持 支持 非公平 支持(默认) 支持 加锁/解锁方式 需要手动加锁、解锁,一般使用try..finally..保证锁能够释放 手动加锁,无需刻意解锁 按key锁 不支持,比如按用户id加锁 支持,synchronized加锁时需要传入一个对象 公平锁 支持,new ReentrantLock(true) 不支持 中断 支持,lockInterruptibly() 不支持 尝试加锁 支持,tryLock() 不支持 超时锁 支持,tryLock(timeout,

死磕 java线程系列之ForkJoinPool深入解析

有些话、适合烂在心里 提交于 2019-11-26 16:14:46
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 注:本文基于ForkJoinPool分治线程池类。 简介 随着在硬件上多核处理器的发展和广泛使用,并发编程成为程序员必须掌握的一门技术,在面试中也经常考查面试者并发相关的知识。 今天,我们就来看一道面试题: 如何充分利用多核CPU,计算很大数组中所有整数的和? 剖析 单线程相加? 我们最容易想到就是单线程相加,一个for循环搞定。 线程池相加? 如果进一步优化,我们会自然而然地想到使用线程池来分段相加,最后再把每个段的结果相加。 其它? Yes,就是我们今天的主角——ForkJoinPool,但是它要怎么实现呢?似乎没怎么用过哈^^ 三种实现 OK,剖析完了,我们直接来看三种实现,不墨迹,直接上菜。 /** * 计算1亿个整数的和 */ public class ForkJoinPoolTest01 { public static void main(String[] args) throws ExecutionException, InterruptedException { // 构造数据 int length = 100000000; long[] arr = new long[length]; for (int i = 0; i < length; i++) { arr[i] =