`
骑猪逛街666
  • 浏览: 141705 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

多字段_任意组合条件查询(0建模)_-_毫秒级实时圈人_实践

阅读更多
阅读原文请点击:http://click.aliyun.com/m/22881/
摘要: 标签 PostgreSQL , 数组 , GIN索引 , 任意字段组合查询 , 圈人 , ToB分析型业务 , 建模 背景 你也许在一家ToB的数据分析公司,你可能设计了一张表(包括用户标识,及若干已经统计好的的属性值),你也许收集了一些用户的数据,你也许要为客户提供报表,你也许需要为客户提供任意属性值的组合查询,并快速的返回结果给用户。

标签

PostgreSQL , 数组 , GIN索引 , 任意字段组合查询 , 圈人 , ToB分析型业务 , 建模

背景

你也许在一家ToB的数据分析公司,你可能设计了一张表(包括用户标识,及若干已经统计好的的属性值),你也许收集了一些用户的数据,你也许要为客户提供报表,你也许需要为客户提供任意属性值的组合查询,并快速的返回结果给用户。

这些需求应该是非常常见的ToB的数据平台公司的形态,头痛的问题无法建模,因为B端的需求无法捉摸,任意组合查询、要求实时响应。

你的客户数据也许有几十亿上百亿,客户数据也许有几百个属性,用户可能需要的是任意属性组合的结果。

如果要快速响应,你的第一反应是不是对查询条件建立索引呢?

比如

where col1=? and col2=? and col3<>? or col4=?; 
这样的SQL,你准备怎么做到实时响应呢?(col1,col2)建立索引,col4建立索引,这样是吗?

但是用户下次的请求肯又换条件了

where col3=1 or col100=? 
是不是又要建col3, col100的索引呢?

你会发现根本没有办法优化,因为对应查询的索引组合可能是成千上万的。

PostgreSQL 对付任意字段检索的黑科技

我在之前写过一些关于任意字段查询的实践文章,广泛应用于广告营销平台的圈人,ToB的圈人,前端页面的任意组合筛选等场景。

方法1,GIN复合索引

对需要参与查询的字段,建立GIN的复合索引。

pic

CASE如下:

《任意组合字段等效查询, 探探PostgreSQL多列展开式B树 (GIN)》

这个场景针对任意字段匹配的场景,PostgreSQL对于多个查询条件,内部会使用索引+bitmapAnd或bitmapOr来筛选BLOCK,得到中间结果。

+---------------------------------------------+   
|100000000001000000010000000000000111100000000| bitmap 1   
|000001000001000100010000000001000010000000010| bitmap 2   
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&   
|000000000001000000010000000000000010000000000| Combined bitmap   
+-----------+-------+--------------+----------+   
            |       |              |   
            v       v              v   
Used to scan the heap only for matching pages:   
+---------------------------------------------+   
|___________X_______X______________X__________|   
+---------------------------------------------+   
这种方法为什么快呢?

原因是GIN索引实现了内部bitmapAnd or bitmapOr,实际上等效于对每个字段建立单独的B-Tree索引(PostgreSQL对多个B-Tree索引也支持bitmapAnd, bitmapOr的合并)。

bitmapand,or原理如下:

《PostgreSQL bitmapAnd, bitmapOr, bitmap index scan, bitmap heap scan》

GIN的复合索引这种方法可以满足以上需求,但是,当数据量非常庞大或者列非常多时,GIN索引会比较大。

方法1 优化技巧

建议可以拆成多张表(例如随机拆分,或者按强制条件拆分)。降低GIN索引的大小,同时还可以利用PostgreSQL 10的多表并行特性,提升查询性能。

PostgreSQL并行计算特性

PostgreSQL支持单表多核并行,也支持多表的并行查询

单表并行,指一条SQL,在处理单张表的数据时,可以使用多个CPU进行运算。

多表并行,指的是一条SQL涉及到多张表的处理(例如APPEND SCAN)时,可以并行的处理多个表的SCAN。

多表并行是在PG 10版本加入的,PostgreSQL 10 append scan 并行

《PostgreSQL 10.0 preview sharding增强 - 支持Append节点并行》
阅读原文请点击:http://click.aliyun.com/m/22881/
分享到:
评论

相关推荐

    if字段赋值_If..._arcgis字段_arcgis_土地利用_字段赋值_

    在处理地理数据时,有时我们需要对数据的属性字段进行赋值操作,特别是在涉及条件判断的情况下,`If...`语句就显得尤为重要。这个场景下,我们讨论的是如何在ArcGIS中使用`If`语句对土地利用代码进行赋值。 首先,...

    表单建模数据库设计文档-- ecology80

    ### 表单建模数据库设计文档 -- ecology80 #### 概述 本文档旨在详细介绍一个专门用于表单建模的数据库设计方案——ecology80。该设计方案围绕着表单构建过程中的各个环节展开,包括但不限于应用基本信息管理、模块...

    FRDA_人脸建模_If-None-Match_3d_3D人脸建模_

    在3D建模领域,它可能利用深度传感器或多视角摄像头获取人脸的多角度图像,然后通过算法将这些图像融合成一个完整的3D模型。 “If-None-Match”是HTTP协议中的一个头字段,用于缓存控制。在Web开发中,它常用于验证...

    FRDA_人脸建模_If-None-Match_3d_3D人脸建模_源码.zip

    标题中的"FRDA_人脸建模_If-None-Match_3d_3D人脸建模_源码.zip"表明这是一个关于3D人脸识别技术的源代码压缩包,其中"FRDA"可能是“Face Recognition and Detection Algorithm”的缩写,暗示了算法在人脸识别与检测...

    jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b

    这个名为 "jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b" 的压缩包包含了 Javaassist 库的一个特定版本,即 3.23.0 GA 版本的修订版 gf85a72b。在 Java 开发中,Javaassist 提供了一种简单的方法来创建和...

    泛微移动建模常见问题-表单页面,由一个字段的变化改变另一个字段的只读、编辑、必填状态

    移动建模常见问题-表单页面,由一个字段的变化改变另一个字段的只读、编辑、必填状态

    mybatis多条件查询处理方案(查询条件为数据库字段非传递参数).pdf

    在MyBatis中,多条件查询是常见的需求,特别是在数据检索和过滤时。通常,我们会根据传递的参数来决定查询的条件。然而,有时我们可能需要根据数据库字段本身的状态来进行查询,而不是依赖于传递的参数。针对这种...

    人工智能-项目实践-C#-基于内存结构的多条件组合查询器(C#).zip

    用途 内存表格数据查询 游戏触发器条件查询 成就表: 定义成就类型, 事件类型, 玩家等级等静态表格数据 通过本...多字段任意组合查询 支持构建字段搜索索引, 提高不等匹配(!=, &lt;,&gt;...)查询性能, 从O(N*M)降低到O(1)

    oracle实现多字段匹配一个关键字查询

    在Oracle数据库中,有时我们需要对多个字段进行联合搜索,即多字段匹配一个关键字查询。本文将详细介绍两种在Oracle中实现这种查询的方法。 ### 一、使用管道符号(||)连接字段 这种方法通过使用Oracle中的字符串...

    BAPI-ACC-DOCUMENT-POST 结构字段扩展

    这里以`ITEMNO_ACC`为例,实际上可以根据具体的业务需求添加更多的字段。 ##### 步骤2:实现BADI增强 接下来,需要实现BADI增强(Business Add-In)以支持字段扩展。具体来说,需要实现`ACC_DOCUMENT` BADI中的`...

    oracle实现多字段匹配一个关键字查询(本人亲测,没毛病)

    ### Oracle实现多字段匹配一个关键字查询 在Oracle数据库中,有时我们需要从多个字段中搜索包含特定关键字的数据。这种需求在很多场景下都非常常见,比如在CRM系统中搜索客户信息、在文档管理系统中查找文档等。...

    ES之_source字段详解

    ### ES之_source字段详解 #### 一、简介 在Elasticsearch(以下简称ES)中,_source字段扮演着至关重要的角色。它包含了索引时传递的原始JSON文档体。了解和掌握_source字段的工作原理对于优化查询性能、提高数据...

    mysql任意数据库中在系统所有表中所有字段查询符合任意字符的存储过程

    标题中的“mysql任意数据库中在系统所有表中所有字段查询符合任意字符的存储过程”涉及到的是MySQL数据库管理和SQL查询技术,特别是如何通过存储过程来实现跨数据库、跨表的复杂查询。存储过程是预编译的SQL语句集合...

    VBA_ACCESS_窗体的任意条件查询 .rar

    通过理解和实践上述步骤,你可以创建一个灵活的Access应用,允许用户根据自己的需求进行任意条件查询,极大地提升了数据库应用的用户体验和效率。同时,这也展示了VBA在Access中的强大功能,以及如何通过VBA将Access...

    PowerQuery_2.11.3625.144_64-bit_zh-CN.rar

    你可以将多个表格作为数据源,选择合并条件,如共享列或其他共性,Power Query会自动进行匹配和合并,生成一个新的统一数据集,极大地提高了工作效率。 **二、数据获取** Power Query支持从多种数据源获取数据,...

    泛微OA新增功能表单建模详解.docx

    ### 泛微OA新增功能表单建模详解 #### 背景 随着企业信息化建设的不断深入,OA系统的灵活性和可扩展性成为了衡量其性能的重要指标之一。表单建模功能作为泛微OA的一项重要更新,旨在通过简单配置即可实现数据模块...

    Camstar_MES_解决方案_工厂建模modeling中文手册

    ### Camstar MES 工厂建模详解 #### 一、概述 Camstar MES(Manufacturing Execution System,制造执行系统)是一套专为制造业提供全面生产管理和优化解决方案的软件平台。其核心之一是“工厂建模”功能,该功能...

    2023年中国研究生数学建模竞赛E题-出血性脑卒中临床智能诊疗建模

    【作品名称】:2023年中国研究生数学建模竞赛E题-出血性脑卒中临床智能诊疗建模 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 ...

    如何利用BAPI_SALESORDER_CHANGE修改vbak增强字段

    在SAP系统中,BAPI(Business Application Programming Interface)是一种标准接口,允许外部应用程序与SAP系统进行交互,包括创建、更改和查询业务数据。在本案例中,我们需要利用BAPI_SALESORDER_CHANGE来修改销售...

Global site tag (gtag.js) - Google Analytics