背景

通用报表系统中,如果过滤条件是多选数据项,需要动态构造虚拟数据表,这里也会成为查询性能的痛点。

构造方式与执行计划

构造1000行数据的虚拟表。

SQL UNION

组合多个查询的结果,需要解析每个查询语句。

with cte (id, name) as
(select 1000, 'a9b7ba70783b617e9998dc4dd82eb3c5' from dual
union all
select 1001, 'b8c37e33defde51cf91e1e03e51657da' from dual
union all
select 1002, 'fba9d88164f3e2d9109ee770223212a0' from dual
union all
...
select 2000, '08f90c1a417155361a5c4b8d297e0d78' from dual)
select *
from cte; Append (cost=0.00..15.01 rows=1001 width=36) (actual time=0.005..0.294 rows=1001 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=36) (actual time=0.004..0.004 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=36) (actual time=0.001..0.001 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=36) (actual time=0.000..0.000 rows=1 loops=1)
...
-> Result (cost=0.00..0.01 rows=1 width=36) (actual time=0.000..0.000 rows=1 loops=1)
Planning Time: 440.377 ms
Execution Time: 2.045 ms

VALUES 列表

VALUES 提供了一种生成“常量表”的方法,它可以被使用在一个查询中而不需要实际在磁盘上创建一个表。

每一个被圆括号包围的表达式列表生成表中的一行。列表都必须具有相同数据的元素(即表中列的数目),并且在每个列表中对应的项必须具有可兼容的数据类型。

with cte (id, name) as
(values (1000, 'a9b7ba70783b617e9998dc4dd82eb3c5'),
(1001, 'b8c37e33defde51cf91e1e03e51657da'),
(1002, 'fba9d88164f3e2d9109ee770223212a0'),
(1003, 'aa68c75c4a77c87f97fb686b2f068676'),
....
(2000, '08f90c1a417155361a5c4b8d297e0d78'))
select *
from cte; Values Scan on "*VALUES*" (cost=0.00..12.51 rows=1001 width=36) (actual time=0.001..0.174 rows=1001 loops=1)
Planning Time: 0.339 ms
Execution Time: 0.202 ms

UNNEST(ANYARRAY,...)

UNNEST函数展开数个的数组。

with cte  (id, name ) as
(select *
from unnest('{1000,1001,1002,1003,...,2000}'::int[]
,'{a9b7ba70783b617e9998dc4dd82eb3c5,b8c37e33defde51cf91e1e03e51657da,fba9d88164f3e2d9109ee770223212a0,...,08f90c1a417155361a5c4b8d297e0d78}'::text[])
)
select * from cte ; Function Scan on unnest (cost=0.01..10.02 rows=1001 width=36) (actual time=0.076..0.137 rows=1001 loops=1)
Planning Time: 0.014 ms
Execution Time: 0.174 ms

总结

SQL拼接方式,造成语句复杂,解析时间过长,性能较差。

VALUES 列表,“常量表” 比查询结果集合并,拥有更简单执行计划和更强的性能。

UNNEST函数,数组类型变量比“常量表” 更简单,更少的解析时间,执行时间最少。

所以,动态查询语句需要构造“常量表” ,建议使用UNNEST函数方式。

KingabseES 构造常量数据表的方式 union, values, array的更多相关文章

  1. OGG_GoldenGate数据表定义方式DEFGEN(案例)

    2014-03-09 Created By BaoXinjian

  2. 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)

    常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...

  3. mysql中数据表记录的增删查改(1)

    数据记录的增删改查 insert into `数据表名称` (`字段名称`, ...) values ('1', ...); delete from `数据表名称` where 子句; update ...

  4. 以对象的方式来访问xml数据表(三)

    怎样以对象的方式来访问xml数据表? 在讲如何具体实现(二)中所说的专门用于访问xml文件的动态链接库之前,我们先来看看这个动态链接库具体要实现什么功能. 动态链接库IXmlDB.dll的功能: 1. ...

  5. 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作

    一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...

  6. 以对象的方式来访问xml数据表(二)

    为什么要以对象的方式来访问xml数据表? 还记得,自己是在一次完成师兄布置的任务时接触到了xml,那时候需要用xml来作为数据文件,保存一个简单的图书管理系统的数据.于是就知道了,可以用xml文件来保 ...

  7. 以对象的方式来访问xml数据表(一)

    所有实例代码都是以C#演示—— 在将如何以对象的方式来访问xml数据表之前,我们先来谈谈如何用xml文件作为数据库吧! 平时在开发一些小的应用的时候,需要一个数据库,这个时候虽然可以用SQL serv ...

  8. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  9. 使用Entity Framework通过code first方式创建数据库和数据表

    开发环境 WIN10 Entity Framework6.0  MVC5.0  开发工具 VS2015  SqlServer2012 1.创建上下文Context继承DbContext,并创建其他的业 ...

  10. MSSQL - 用GUID值来完成数据表行标识

    地址:http://www.cnblogs.com/huangfr/archive/2012/03/28/2420780.html [Guid] [uniqueidentifier] NOT NULL ...

随机推荐

  1. 【OpenGL ES】绘制圆形

    1 前言 ​ [OpenGL ES]绘制三角形 中介绍了绘制三角形的方法,[OpenGL ES]绘制正方形中介绍了绘制正方形的方法,本文将介绍绘制圆形的方法. ​ OpenGL 以点.线段.三角形为图 ...

  2. 大数运算(BigInteger)与进制转换

    1 前言 Java 提供了 BigInteger(大整数)类和 BigDecimal(大浮点数)类用于大数运算,这两个类都继承自 Number 类(抽象类).由于 BigInteger 在大数运算中更 ...

  3. Js中Symbol对象

    Js中Symbol对象 ES6引入了一种新的基本数据类型Symbol,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方 ...

  4. SpringBoot使用git-commit-id-maven-plugin打包

    简介 git-commit-id-maven-plugin 是一个maven 插件,用来在打包的时候将git-commit 信息打进jar中. 这样做的好处是可以将发布的某版本和对应的代码关联起来,方 ...

  5. 使用html+css+js实现一个仿钉钉打卡按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. jsp中无法识别EL表达式问题

    今天在开发系统时需要在JSP中遍历List<javabean>,其中用到了EL表达式:${item.value} 页面死活不出数据,只显示表达式本身:${item.value}. 页面代码 ...

  7. Innodb存储引擎的文件

    目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...

  8. 揭秘一线大厂Redis面试高频考点(3万字长文、吐血整理)

    ## # 3万+长文揭秘一线大厂Redis面试高频考点,整理不易,求一键三连:点赞.分享.收藏 本文,已收录于,我的技术网站 aijiangsir.com,有大厂完整面经,工作技术,架构师成长之路,等 ...

  9. 【Android逆向】反调试绕过

    1. 拿到52pojie的反调试挑战apk 链接: https://www.52pojie.cn/thread-742686-1-1.html 的附件中 2. 项目进行安装,点开app,同时挑战成功, ...

  10. 小程序threejs参考

    之前做了一个小程序眼镜试戴的功能,涉及了人脸识别和3D模型渲染等.暂时记录一些参考的东西,有时间再整理. threejs官方文档(一定要看看) https://threejs.org/docs/ind ...