当前位置: 首页 > news >正文

涉及海量数据的查询SQL建议使用“数据库函数”封装并调用

一、问题描述

        生产环境中,核心业务表数据量随业务增长迅速膨胀,原统计查询SQL因执行计划劣化、索引失效而突然变慢。若按传统流程修复,需要优化SQL、测试、重新打包、发版,并且SQL优化往往需要多轮迭代、持续打磨;若每次调整都要重走发版流程,时间和风险成本将被无限放大。最终无法快速解决问题,易引发用户投诉。

二、“数据库函数封装”方案(代码仅需改一行)

       面对上述问题场景,我们可以将整条海量数据查询SQL封装为数据库函数。应用层仅需调用统一的函数接口,查询逻辑下沉至数据库内部;后续无论加Hint、改索引、调整执行计划,均可通过CREATE OR REPLACE FUNCTION秒级生效,无需再次测试、打包、发版,实现真正的零停机热更与持续迭代优化。

改造前,应用层SQL常规写法

<select id="querySysUserList" parameterType="cn.gdxiash.calculationdemo.entity.SysUser"resultType="cn.gdxiash.calculationdemo.entity.SysUser">SELECT * FROM SYS_USER <where><if test="name!=null and name!=''">NAME LIKE '%' || #{name} || '%'</if><if test="age!=null and age>=0">AGE = #{age}</if></where>
</select>

改造后,应用层SQL写法

<select id="querySysUserList" parameterType="cn.gdxiash.calculationdemo.entity.SysUser"resultType="cn.gdxiash.calculationdemo.entity.SysUser">SELECT * FROM TABLE(F_GET_SYS_USER_LIST(#{name},#{age}))
</select>
三、简单样例实现
1、创建SYS_USER表
CREATE TABLE "SHANGHAI"."SYS_USER"
(
"ID" VARCHAR2(36) NOT NULL,
"NAME" VARCHAR2(50),
"AGE" NUMBER(3,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
2、创建自定义类型
-- 创建自定义类型
CREATE OR REPLACE TYPE T_SYS_USER AS OBJECT(
ID VARCHAR2(36),
NAME VARCHAR2(50),
AGE NUMBER(3,0));
-- 创建自定义类型集合
CREATE OR REPLACE TYPE T_SYS_USER_LIST AS TABLE OF T_SYS_USER;
3、将业务SQL封装成函数(可随时通过REPLACE进行修改)
-- 创建查询函数
CREATE OR REPLACE FUNCTION F_GET_SYS_USER_LIST(P_NAME IN VARCHAR2 DEFAULT NULL,  -- 允许不传P_AGE  IN NUMBER   DEFAULT NULL   -- 允许不传
) RETURN T_SYS_USER_LIST
ISV_LIST T_SYS_USER_LIST := T_SYS_USER_LIST();
BEGINSELECT T_SYS_USER(ID, NAME, AGE)BULK COLLECT INTO V_LISTFROM SYS_USERWHERE (P_NAME IS NULL OR NAME LIKE '%' || P_NAME || '%')AND (P_AGE  IS NULL OR AGE  = P_AGE);RETURN V_LIST;
END;
4、将代码的查询语句进行改造

原SQL

<select id="querySysUserList" parameterType="cn.gdxiash.calculationdemo.entity.SysUser"resultType="cn.gdxiash.calculationdemo.entity.SysUser">SELECT * FROM SYS_USER <where><if test="name!=null and name!=''">NAME LIKE '%' || #{name} || '%'</if><if test="age!=null and age>=0">AGE = #{age}</if></where>
</select>

将原SQL修改为查询数据库函数

<select id="querySysUserList" parameterType="cn.gdxiash.calculationdemo.entity.SysUser"resultType="cn.gdxiash.calculationdemo.entity.SysUser">SELECT * FROM TABLE(F_GET_SYS_USER_LIST(#{name},#{age}))
</select>
http://www.lryc.cn/news/592326.html

相关文章:

  • TCP通讯开发注意事项及常见问题解析
  • 如何检查GitHub上可能潜在的信息泄漏
  • web开发-HTML
  • leetcode2_135.分发糖果
  • leetcode15.三数之和题解:逻辑清晰带你分析
  • 华为欧拉系统(openEuler)安装 Docker 容器完整教程
  • Gemini Function Calling 和 Qwen3 Embedding和ReRanker模型
  • 服务器清理空间--主要是conda环境清理和删除
  • 弧焊机器人智能节气装置
  • Huber Loss(胡贝损失)详解:稳健回归的秘密武器 + Python实现
  • 【Git专栏】git如何切换到某个commit(超详细)
  • 铁路基础设施无人机巡检技术及管理平台
  • 【IOS webview】IOS13不支持svelte 样式嵌套
  • 计算机网络知名端口分配全表(0-1023)
  • 前端之CSS
  • Http请求中的特殊字符
  • 太阳辐射监测站:洞察太阳能量的科技之眼
  • RabbitMQ—TTL、死信队列、延迟队列
  • k8s:手动创建PV,解决postgis数据库本地永久存储
  • Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
  • 基于K8s ingress灰度发布配置
  • Docker报错:No address associated with hostname
  • 使用python读取json数据,简单的处理成元组数组
  • 内网部署yum源
  • 美团闪购最新版 mtgsig1.2
  • 从服务实例的元数据中获取配置值 vs 从本地配置文件中获取配置值
  • 4G模块 A7680发送中文短信到手机
  • IT66122替代IT66121-富利威
  • 「源力觉醒 创作者计划」_巅峰对话:文心 4.5 vs. DeepSeek / Qwen 3.0 深度解析(实战优化版)
  • 文件管理-文件控制块和索引节点