背景

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

构造方式与执行计划

构造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. The Network Adapter could not establish the connection errorCode 17002, state 08006

    问题说明 今天在centos7虚拟机中运行java程序,程序启动需要连接主机的oracle,报错: The Network Adapter could not establish the connec ...

  2. spring boot和redis实现自定义前后分离token认证

    说明:文章部分代码引用自github 本项目地址:https://gitee.com/indexman/redis-token-demo 1.token认证流程 此处以前端页面请求后端用户列表接口为例 ...

  3. Python之正则表达式匹配电话号码和邮箱

    代码 #! python3 # phoneAndEmail.py - Finds phone numbers and email addresses on Clipboard import pyper ...

  4. 【树莓派】拷贝系统到新SD卡(系统备份/部署到另一台树莓派上)适用ubuntu 20.04.3

    本教程适用ubuntu 20.04.3 其他版本也大同小异.这种方法能更快的将系统部署下去,如果重新安装一遍加上各种配置相信你会比较疯狂即使做了自动化脚本! 一.树莓派sd卡拷贝 把旧SD卡插入树莓派 ...

  5. 并发与并行的区别---python

    并发与并行的区别 Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别 并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机 如果是串行,一个 ...

  6. 【LeetCode二叉树#20】二叉搜索树转换为累加树,巩固二叉树的遍历(特殊的中序遍历)

    将二叉搜索树转换为累加树 力扣题目链接(opens new window) 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 no ...

  7. 【LeetCode二叉树#13】遍历二叉搜索树

    二叉搜索树中的搜索 力扣题目地址(opens new window) 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在 ...

  8. 【Azure 应用服务】Function App / App Service 连接 Blob 报错

    问题描述 因 Blob 启用了防火墙功能,但是当把App Service 或 Function App的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答 Azure St ...

  9. Windows配置R语言、RStudio开发环境

      本文介绍R语言及其集成开发环境RStudio的下载.安装方法.   R语言是一个属于GNU操作系统的开源软件,在数据统计与分析.可视化等方面具有优秀的表现:而RStudio则是R语言的集成开发环境 ...

  10. matlab修改读取mat文件后的变量名

    代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...