【重新发现PostgreSQL之美】- 44 摩斯电码

简介: 大家好,这里是重新发现PostgreSQL之美 - 44 摩斯电码

背景


场景:
某些字段的值经过计算后再过滤的场景, 例如:
json
里面的内容包含经纬度, 我们需要对经纬度进行地理信息空间查询过滤.
a,b,c,d
分别代表语、数、英、科的分数, 查询总分等于或范围时, 需要计算后再搜索.

挑战:
大多数数据库无法使用表达式索引, 只能全表扫描, 逐条计算. 效率低下.

PG解决方案:
支持表达式索引(也可以叫函数索引), 性能指数级提升.
支持表达式统计信息柱状图, 用于优化器计算

例子:

create table a (id int, info jsonb);    

   

create index idx_a on a using gist (ST_SetSRID(ST_MakePoint((info ->> 'lon')::numeric, (info ->> 'lat')::numeric),4326));    

   

explain select * from a order by ST_SetSRID(ST_MakePoint((info ->> 'lon')::numeric, (info ->> 'lat')::numeric),4326) <->    

ST_SetSRID(ST_MakePoint(120,70),4326) limit 10;    

   

Limit (cost=0.14..0.69 rows=10 width=44)  

  -> Index Scan using idx_a on a (cost=0.14..69.40 rows=1270 width=44)  

        Order By: (st_setsrid(st_makepoint((((info ->> 'lon'::text))::numeric)::double precision, (((info ->> 'lat'::text))::numeric)::double precision), 4326) <-> '0101000020E61000000000000000005E400000000000805140'::geometry)    

create table t (id int, a float4, b float4, c float4, d float4);    

   

create index idx_t on t ((a+b+c+d));    

   

explain select * from t where a+b+c+d=400;    

   

Index Scan using idx_t on t  (cost=0.15..7.99 rows=8 width=20)    

  Index Cond: ((((a + b) + c) + d) = '400'::double precision)    

postgres=# select * from pg_stats where tablename='idx_t';

-[ RECORD 1 ]----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  

schemaname             | public  

tablename              | idx_t  

attname                | expr  

inherited              | f  

null_frac              | 0

avg_width              | 4  

n_distinct             | -0.9994  

most_common_vals       | {151.73206,180.91998,197.2688,200.11456,204.47366,223.13992}  

most_common_freqs      | {0.0002,0.0002,0.0002,0.0002,0.0002,0.0002}

histogram_bounds       | {25.474722,71.74933,85.48342,93.977295,99.26418,104.8926,110.16269,114.38039,118.075554,121.30721,124.80748,127.81897,130.67479,133.32335,136.02103,138.41626,140.85258,143.05424,145.51877,147.9408,149.95238,151.72961,153.72885,155.82372,157.6345,159.48929,161.0307,162.76514,164.57907,166.19772,167.8121,169.29343,171.28735,173.25894,174.89429,176.23984,177.65022,179.2883,180.66162,182.22772,183.88147,185.28021,186.64587,188.12837,189.66924,191.4691,192.80214,194.05939,195.64655,197.10524,198.36841,199.72656,201.35751,203.02931,204.50558,205.91415,207.49933,209.28078,210.977,212.39197,214.18248,215.5002,217.03229,218.55179,220.12622,221.61935,223.03786,224.73047,226.53156,228.12646,229.62404,231.14334,232.95035,234.51816,236.07428,237.84808,239.52545,241.77795,243.91528,246.18135,248.33812,250.06604,252.14948,254.52863,257.24,260.0845,262.6031,265.53894,268.5458,271.4497,275.00317,278.2635,281.67947,286.42548,290.9062,295.2775,301.70978,307.6002,317.32483,328.39,375.6833}  

correlation            | -0.026684083  

most_common_elems      |  

most_common_elem_freqs |  

elem_count_histogram   |  

 

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
关系型数据库 MySQL Linux
MariaDB强制修改root密码
前几天装了个MariaDB数据库来代替mysql,结果密码太复杂 给忘了。进过百度搜索了几个办法后, 总结以下办法 1.修改配置文件 示例 在MariaDB安装目录下的找到配置文件my.
2338 0
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
18138 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
Java
jdk 8 使用okhttp3 实现 http2
使用jdk8 使用okhttp3 实现http2请求
4365 0
jdk 8 使用okhttp3 实现 http2
|
敏捷开发 前端开发 JavaScript
多维视角分工工具全解析:任务颗粒度、责任维度与协作逻辑一站梳理
在项目协作中,任务失控往往源于“角色失明”——责任不清、分工模糊、推诿频发。本文提出“多维视角分工体系”,从角色、职责、阶段、技能等多维度结构化拆解任务,建立责任明确、过程可视、可追溯的协同机制,解决跨职能合作中的混乱与低效问题。通过工具支持与文化落地,打造清晰、有序、高协同的项目协作网络。
|
SQL Oracle 数据库
这款免费数据库工具,可能是YashanDB图形化管理的最佳选择
DBeaver for YashanDB 是一款专为国产自研数据库 YashanDB 定制的图形化管理工具,基于全球流行的开源数据库工具 DBeaver 二次开发而成。它深度适配 YashanDB 的各种架构,支持 HEAP/LSC 多形态表管理和 Oracle 生态兼容,提供高效的对象管理、智能 SQL 开发和工业级 PL/SQL 调试功能。通过可视化操作,开发者可轻松完成物化视图配置、存储过程管理等复杂任务,大幅提升效率。该工具完全免费,支持多平台,为企业级数据库管理提供了成熟解决方案。
|
小程序 开发者
微信小程序项目实例——2048小游戏
微信小程序项目实例——2048小游戏
|
域名解析 搜索推荐 Apache
服务器301重定向详细教程
301重定向是一种HTTP状态码,用于指示网页已永久移至新位置,对SEO和用户体验至关重要。本文详解了301重定向的作用,包括提升搜索引擎排名和自动引导用户访问新URL。同时介绍了多种设置方法,如通过网站控制面板、Apache的mod_rewrite模块、IIS的URL重写模块等,并提醒注意新URL的准备、链接更新及流量监控。合理设置301重定向有助于网站平稳过渡和长期发展。
2094 7
|
机器学习/深度学习 XML 搜索推荐
图像自动化保存工具:Python脚本开发指南
图像自动化保存工具:Python脚本开发指南
|
Web App开发 小程序 安全
支付宝小程序性能概述
支付宝小程序性能概述
503 11
|
Android开发
Android音量细分
【6月更文挑战第3天】
661 0