判断字段长度大于某长度_判断数据库性能只能通过count(*)?No,这些优化方案了解一下!...

大多数用户在体验数据库时,接触到的最早的sql语句就是count(*),因此用户判断数据库性能时通常也会通过count(*)进行比较。但在执行时通常会出现一个问题:对某个表做count(*)时需对全表数据进行扫描,当表中包含数据量较大的字段时,IO将会成为数据扫描的瓶颈。

958982662cb365d1f2ba086d0a6aee5a.png

数据扫描瓶颈有哪些优化方式?

6af30f5c8e40e06c6af86c0011c7de79.gif

针对上述问题,为解决全表扫描带来的IO开销的方案大致可分为三类:

第一类是减少扫描数据;

第二类是通过并行方式扫描数据;

第三类是通过预估值计算方式获取结果。

根据上述三种方案,我们给出以下四种优化方式:

01

减少扫描数据

(1)使用列存

顾名思义,列存是按列存储的。当使用count(*)查询时,只需要扫描一列数据做count统计,而并非全表,这样,IO开销几乎是行存的1/列数,即效率是行存的列数倍。在实际使用中,因为每列字段长度的原因,使用列存时count(*)效率往往要比这个值还要高得多。

(2)使用Index only scan

使用主键的Index only scan,count(*)仅需扫描主键的索引链表即可,不必扫描所有的数据块,因此可大大减少IO开销。

02

并行扫描数据

(1)MPP架构

使用MPP架构的好处是让数据分布到各个计算节点上。这样,在使用count(*)查询时,每个计算节点都会去统计该节点的数据量,最终汇聚返回总的数据量,这种方式可以更好地利用CPU和磁盘达到并行扫描的效果,节省扫描时间。

03

预估值计算

(1)Hyperloglog

HyperLogLog算法来源于论文《HyperLogLog the analysis of a near-optimal cardinality estimation algorithm》,可以使用固定大小的字节计算任意大小的distinct value。由于HLL是概率计算算法,它依赖于数据的均匀分布,在使用时往往需要我们首先利用HLL对每个元素进行哈希,以使数据分布更加均匀。

因此,任何可以哈希的数据类型都可以使用HLL算法做统计估算,HLL算法在数据库的估值统计计算方面起到了重要作用。

哪些产品能提供具体优化方案?

6af30f5c8e40e06c6af86c0011c7de79.gif

综合上述4种优化方式,人大金仓悉心打造的MPP数据库KADB具备以上所有特性方案,具体包括:

(1)列存

KADB支持可压缩列存储,压缩比可达1:10。建表语句如下:

create table t_count(id uuid, num int) with

(appendonly=true,orientation=column,compresstype=zlib,compresslevel=5);

(2)Index only scan

KADB支持index only scan,执行计划如下:

explain select count(*) from t_count ;

QUERY PLAN

------------------------------------------------------------------------------------------------------------------

Aggregate (cost=17403254.38..17403254.39 rows=1 width=8)

-> Gather Motion 8:1 (slice1; segments: 8) (cost=17403254.27..17403254.37 rows=1 width=8)

-> Aggregate (cost=17403254.27..17403254.28 rows=1 width=8)

-> Index Only Scan using idx_t_count_id on t_count (cost=0.19..17153253.65 rows=12500031 width=0)

(3)MPP架构

KADB是人大金仓基于Kingbase ES 单机数据库打造的MPP数据库,具有一切皆并行的特点

(4)Hyperloglog

KADB集成了HLL插件。具体操作如下:

创建计数表,并插入1亿条数据,id列重复值较少:

create table t_count(id uuid, num int);

--创建插入函数,id值为uuid,无重复值

create or replace function f_insert(i int) returns setof record as $$

select uuid_generate_v4(), generate_series(1,i);

$$ language sql;

--插入数据

insert into t_count select * from f_insert(100000000) as t(id uuid, num int);

创建HLL统计表,记录唯一值:

create table daily_id_hll

as select

gp_hyperloglog_accum(id)

from

t_count;

最终通过HLL算法预估出t_count的条数

select gp_hyperloglog_get_estimate(gp_hyperloglog_accum) from daily_id_hll;

gp_hyperloglog_get_estimate

-----------------------------

99651193.2825577

(1 row)

误差率在0.35%左右

select (100000000-99651193.2825577)/100000000;

?column?

------------------------

0.00348806717442300000

(1 row)

MPP数据库KADB优化效果如何?

6af30f5c8e40e06c6af86c0011c7de79.gif

在此,我们导入1亿条数据进行测试,数据总量大小为203GB,测试count(*)比对效率如下:

6bcb62c4bd9e7f6aab7f0994c3ddfbf1.png

038490b4e01ba70063bd37e08847e3ea.png

综上总述,KADB具备以上所有优化方式的解决方案能力,可根据不同需求优化count(*)查询。在用户实际应用场景中,

面对实时性要求较高但准确度要求不太高的数据可视化服务,我们通常提供Hyperloglog优化方案;

面对实时性要求不太高但准确度要求高的统计服务,我们通常提供列存优化方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下i2c接口的电容触摸屏驱动开发

原文地址: http://hi.baidu.com/god_sperm/blog/item/2aaac228e8a1ece8e7cd400a.html 电容触摸屏 2011-01-14 15:36 1.Kconfig文件    增加宏定义 2.Makefile文件 增加编译处理 3.添加程序源码 Touch screen remote control design document 2010…

10 款基于 jQuery 的切换效果插件推荐

本文整理了 10 款非常好用的jQuery切换效果插件,包括平滑切换和重叠动画等,这些插件可以实现不同元素之间的动态切换。 1. InnerFade 这是一个基于jQuery的小插件,可以实现页面内的元素淡入淡出效果。 源码/演示 2. HighlightFade 该插件可以…

r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张

以下内容来自教程 R语言中多张图画到同一个页面上常用的函数为par()和layout() par()函数详解 layout()函数的简单使用 但是这两个函数不适用于ggplot2;ggplot2作图如果希望把多张图放到同一个页面上基本的解决办法是使用(The basic solution is to use the gridExtra R packa…

电容屏原理

电容屏 电容技术的触摸屏是一块四层复合玻璃屏,如下图所示。玻璃屏的内表面和夹层各涂有一层ITO导电层,最外层是只有0.0015毫米厚的矽土玻璃保护层。内层ITO作为屏蔽层,以保证良好的工作环境,夹层ITO涂层作为检测定位的工作层&am…

js矢量图类库:Raphaël—JavaScript Library

官方网址:http://raphaeljs.com/ Raphal is a small JavaScript library that should simplify your work with vector graphics on the web. If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it si…

sklearn 绘制roc曲线_如何用Tensorflow和scikit-learn绘制ROC曲线?

我试图从tensorflow提供的CIFAR-10示例的修改版本绘制ROC曲线。它现在为2类,而不是10如何用Tensorflow和scikit-learn绘制ROC曲线?的网络的输出被称为logits并采取以下形式:[[-2.57313061 2.57966399] [0.04221377 -0.04033273] [-1.42880082…

Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动

本篇记录在友善之臂 mini2440 平台上挂载I2C接口触摸屏的驱动开发过程。内核版本linux-2.6.32.2, 平台是ARM9 S3C2440I2C接口的触摸屏如上篇 Linux的I2C驱动体系结构讲述http://www.lupaworld.com/273398/viewspace-204237.html要挂载新的I2C设备,需要实现3部分&…

十六进制字符串转整形

System.Convert.ToInt32( "字符串 ",16); 转载于:https://www.cnblogs.com/dashi/archive/2011/12/22/4034737.html

gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;

//Innodb批量页面刷盘情况下的"两次写"//之前的文章中,我们介绍过innodb的两次写特性,这里给出链接:InnoDB的两次写特性今天我们完善一下这部分的内容。我们知道innodb数据页的默认大小是16kb,磁盘和内存通过数据页进行…

linux内核I2C子系统学习(一)

这部分准备分几个部分进行分析总结 因为I2C的通信肯定至少要有2个芯片完成,所以它的驱动是由2大部分组成:主芯片的i2c的驱动从芯片的i2c的驱动 注:万一选的都不支持咋办???(惨了,只能…

【转】excel表格导出集锦repeater实用,和普通用法

【http://www.cnblogs.com/s-y-l/archive/2011/12/23/2299008.html】下面导出excel主要解决repeater产生乱码的问题publicvoid CreateExcel(DataSet ds,string typeid,string FileName) { HttpResponse resp; resp Page.Response; …

什么是流量攻击? 流量攻击怎么处理?

由于DDoS攻击往往采取合法的数据请求技术,再加上傀儡机器,造成DDoS攻击成为最难防御的网络攻击之一。据美国最新的安全损失调查报告,DDoS攻击所造成的经济损失已经跃居第一。 传统的网络设备和周边安全技术,例如防火墙和IDSs(Intr…

django批量修改table_django-formset实现数据表的批量操作

什么是formset我们知道forms组件是用来做表单验证,更准确一点说,forms组件是用来做数据库表中一行记录的验证。有forms组件不同,formset是同科同时验证表中的多行记录,即formset是做表单批量验证的组件。批量添加首先要实例化form…

linux内核I2C子系统学习(二)

下面具体分析如何写第一部分:主控芯片的i2c驱动分为2个步骤:写总线驱动:选了个主控芯片,比如:S3C8900(自己瞎编的芯片)在driver/i2c/busses/i2c-s3c2410.c中没有找到这个芯片的I2C支持(总线驱动…

20111228_给窗体设置默认输入法

//给窗体设置默认输入法 //新建一个窗体类ImeForm,设置Form1:ImeForm public class ImeForm:System.Windows.Forms.Form { [DllImport("imm32.dll")] public static extern IntPtr ImmGetContext(IntPtr hWnd); [DllImport("imm32.dll")] publ…

efishell无法开机shell_开机出现efi shell卡住不动了解决方法全集

[文章导读] 最近有很多网友问我,为什么我的电脑开机后出现efi shell提示进不了系统,开机出现efi shell提示时,一般是由于第一启动项设置的是efi shell启动的,有的网友告诉我,我第一启动项明明设置的是硬盘启动&#xf…

linux内核I2C子系统学习(三)

写设备驱动:四部曲:构建i2c_driver注册i2c_driver构建i2c_client ( 第一种方法:注册字符设备驱动、第二种方法:通过板文件的i2c_board_info填充,然后注册) 注销i2c_driver 具体如下:…

Delphi环境中编写调用DLL的方法和技巧

Delphi环境中编写调用DLL的方法和技巧第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。(举个例子&#xff0…

信道容量受哪三个要素_影响信道容量的主要因素有哪些

匿名用户 1级 2015-03-23 回答 化。编码器输出的数字序列与到译码器输入的数字序列之间的关系,通常用多端口网络的转移概率作为编码信道的数学模型进行描述。 三、信道的数学模型 (一)调制信道模型 调制信道模型描述的是调制信道的输出信号和输入信号之间的数学关系。调制信道…

实例解析linux内核I2C体系结构(1)

作者:刘洪涛,华清远见嵌入式学院讲师。 一、概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。 第一种方…