SQL优化【基础09】 - 查询转换(query transformation)

多维聚合前的数据变形:清洗、映射、派生与重组四大支柱 多维聚合是BI分析和数据仓库的核心能力,但其真正瓶颈往往不在GROUP BY本身,而在于聚合前的数据形态适配。当原始数据与业务维度存在天然错位——如地区编码不一致、产品分类动态调整、订单日期需派生财年季度——就必须通过系统性数据变形来弥合语义鸿沟。这一过程涵盖清洗(统一支付方式枚举)、映射(带版本控制的地理归属)、派生(可测试的fiscal_quarter逻辑)和重组(宽表转长表以支撑环比计算)四大技术支柱。它直接决定报表准确性、口径一致性与需求响应速度,广泛应用于销售归因、财务关账、运营复盘等关键场景。本 阅读详情
--version:11.2
前言:为什么要查询转换呢?
简单的说就是ORACLE在等逻辑的基础上增加可能存在的执行计划,有更多的选择,从中选出最优的计划;

常见的3种转换
1.视图合并
2.子查询展开
3.谓词推入


create view v_t1t2 as 
select  t1.object_id,t2.status
from t1,t2
where t1.object_id=t2.object_id;

SQL> create view v_t1t2 as 
  2  select  t1.object_id,t2.status
  3  from t1,t2
  4  where t1.object_id=t2.object_id;

View created.

SQL> create table t1 as select * from dba_objects;

Table created.

SQL> create table t2 as select * from dba_objects where rownum<1001;

Table created.

SQL> create table t3 as select * from dba_objects where rownum<11;

Table created.

一. 视图合并

--如下执行SQL,视图v_t1t2没有出现在name列
select  t3.object_id,vv.status
from t3,v_t1t2  vv
where t3.object_id=vv.object_id;

SQL_ID  9w0yg7pp6kph3, child number 0
-------------------------------------
 select  t3.object_id,vv.status from t3,v_t1t2  vv where
t3.object_id=vv.object_id

Plan hash value: 2467348796

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      9 |00:00:02.03 |    1060 |       |       |          |
|*  1 |  HASH JOIN          |      |      1 |      1 |      9 |00:00:02.03 |    1060 |  1306K|  1306K| 1128K (0)|
|*  2 |   HASH JOIN         |      |      1 |     10 |     10 |00:00:02.01 |    1043 |  1517K|  1517K| 1123K (0)|
|   3 |    TABLE ACCESS FULL| T3   |      1 |     10 |     10 |00:00:00.01 |       3 |       |       |          |
|   4 |    TABLE ACCESS FULL| T1   |      1 |  62548 |  72668 |00:00:00.55 |    1040 |       |       |          |
|   5 |   TABLE ACCESS FULL | T2   |      1 |   1000 |   1000 |00:00:00.01 |      17 |       |       |          |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   2 - access("T3"."OBJECT_ID"="T1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)
   
--加入no_merge的hint可以name列看到v_t1t2的视图名称   
 select  /*+ no_merge(vv) */t3.object_id,vv.status from t3,v_t1t2  vv where
t3.object_id=vv.object_id;   

SQL_ID  4bkn59yaq6chu, child number 0
-------------------------------------
      select  /*+ no_merge(vv) */t3.object_id,vv.status from t3,v_t1t2
vv where t3.object_id=vv.object_id

Plan hash value: 1147613535

-------------------------------------------------------------------------------
| Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |        |       |       |   300 (100)|          |
|*  1 |  HASH JOIN           |        |    10 |   310 |   300   (1)| 00:00:04 |
|   2 |   TABLE ACCESS FULL  | T3     |    10 |   130 |     3   (0)| 00:00:01 |
|   3 |   VIEW               | V_T1T2 |   999 | 17982 |   297   (1)| 00:00:04 |
|*  4 |    HASH JOIN         |        |   999 | 30969 |   297   (1)| 00:00:04 |
|   5 |     TABLE ACCESS FULL| T2     |  1000 | 18000 |     6   (0)| 00:00:01 |
|   6 |     TABLE ACCESS FULL| T1     | 62548 |   794K|   290   (1)| 00:00:04 |
-------------------------------------------------------------------------------


二.子查询展开

--如下SQL的子查询中的T3与外边的T1形成HASH JOIN RIGHT SEMI(HASH半连接)
select  t1.status,t2.object_name
from t1,t2
where t1.object_id=t2.object_id
and t1.object_id in (select object_id from t3 );

select  t1.status,t2.object_name from t1,t2 where
t1.object_id=t2.object_id and t1.object_id in (select object_id from t3
)

Plan hash value: 2897334926

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |       |       |   301 (100)|          |
|*  1 |  HASH JOIN            |      |     1 |   110 |   301   (1)| 00:00:04 |
|*  2 |   HASH JOIN RIGHT SEMI|      |    10 |   310 |   294   (1)| 00:00:04 |
|   3 |    TABLE ACCESS FULL  | T3   |    10 |   130 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL  | T1   | 62548 |  1099K|   290   (1)| 00:00:04 |
|   5 |   TABLE ACCESS FULL   | T2   |  1000 | 79000 |     6   (0)| 00:00:01 |
------------------------------------------------------------------------------


--加入no_unnest的hint可以看到不展开将会以filter的连接方式来执行子查询SQL
select  t1.status,t2.object_name
from t1,t2
where t1.object_id=t2.object_id
and t1.object_id in (select /*+ no_unnest */object_id from t3 );

select  t1.status,t2.object_name from t1,t2 where
t1.object_id=t2.object_id and t1.object_id in (select /*+ no_unnest
*/object_id from t3 )

Plan hash value: 2685818224

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |       |       |  1796 (100)|          |
|*  1 |  FILTER             |      |       |       |            |          |
|*  2 |   HASH JOIN         |      |   999 | 96903 |   297   (1)| 00:00:04 |
|   3 |    TABLE ACCESS FULL| T2   |  1000 | 79000 |     6   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| T1   | 62548 |  1099K|   290   (1)| 00:00:04 |
|*  5 |   TABLE ACCESS FULL | T3   |     1 |    13 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

三.谓词推入


SQL> create index idx_t1_id on t1(object_id);

Index created.

SQL> create index idx_t2_id on t2(object_id);

Index created.

SQL> create index idx_t3_id on t3(object_id);

Index created.


select /*+  push_pred(vv) no_merge(vv)  */ t3.status,vv.object_id from
t3,v_t1t2 vv where t3.object_id=vv.object_id(+) and t3.object_id=99

Plan hash value: 3425305862

------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |       |       |     3 (100)|          |
|   1 |  NESTED LOOPS OUTER          |           |     1 |    31 |     3   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T3        |     1 |    18 |     1   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IDX_T3_ID |     1 |       |     1   (0)| 00:00:01 |
|   4 |   VIEW PUSHED PREDICATE      | V_T1T2    |     1 |    13 |     2   (0)| 00:00:01 |     --谓词推入关键字
|*  5 |    FILTER                    |           |       |       |            |          |
|   6 |     MERGE JOIN CARTESIAN     |           |     1 |    26 |     2   (0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN        | IDX_T1_ID |     1 |    13 |     1   (0)| 00:00:01 |
|   8 |      BUFFER SORT             |           |     1 |    13 |     1   (0)| 00:00:01 |
|*  9 |       INDEX RANGE SCAN       | IDX_T2_ID |     1 |    13 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------



四.查询转换与应用
--那么查询转换与优化有什么关系?为什么要去了解?
看个例子,我们将上面的其中一条关于谓词推入的SQL改写下:
--不让它进行谓词推入
select /*+  no_push_pred(vv) merge(vv)  */ t3.status,vv.object_id from
t3,v_t1t2 vv where t3.object_id=vv.object_id(+) and t3.object_id=99

select /*+  no_push_pred(vv) merge(vv)  */ t3.status,vv.object_id from
t3,v_t1t2 vv where t3.object_id=vv.object_id(+) and t3.object_id=99

Plan hash value: 2569520452

------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |       |       |     4 (100)|          |
|*  1 |  HASH JOIN OUTER             |           |     1 |    31 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T3        |     1 |    18 |     1   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IDX_T3_ID |     1 |       |     1   (0)| 00:00:01 |
|   4 |   VIEW                       | V_T1T2    |     1 |    13 |     2   (0)| 00:00:01 |
|   5 |    MERGE JOIN CARTESIAN      |           |     1 |    26 |     2   (0)| 00:00:01 |
|*  6 |     INDEX RANGE SCAN         | IDX_T1_ID |     1 |    13 |     1   (0)| 00:00:01 |
|   7 |     BUFFER SORT              |           |     1 |    13 |     1   (0)| 00:00:01 |
|*  8 |      INDEX RANGE SCAN        | IDX_T2_ID |     1 |    13 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

--然后去除HINT默认让它运行
select  t3.status,vv.object_id from
t3,v_t1t2 vv where t3.object_id=vv.object_id(+) and t3.object_id=99;

SQL_ID  f3x5z80ammrb2, child number 0
-------------------------------------
select  t3.status,vv.object_id from t3,v_t1t2 vv where
t3.object_id=vv.object_id(+) and t3.object_id=99

Plan hash value: 3425305862

------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |       |       |     3 (100)|          |
|   1 |  NESTED LOOPS OUTER          |           |     1 |    31 |     3   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T3        |     1 |    18 |     1   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IDX_T3_ID |     1 |       |     1   (0)| 00:00:01 |
|   4 |   VIEW PUSHED PREDICATE      | V_T1T2    |     1 |    13 |     2   (0)| 00:00:01 |
|*  5 |    FILTER                    |           |       |       |            |          |
|   6 |     MERGE JOIN CARTESIAN     |           |     1 |    26 |     2   (0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN        | IDX_T1_ID |     1 |    13 |     1   (0)| 00:00:01 |
|   8 |      BUFFER SORT             |           |     1 |    13 |     1   (0)| 00:00:01 |
|*  9 |       INDEX RANGE SCAN       | IDX_T2_ID |     1 |    13 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

--可以看到推入后的COST值,ORACLE计算的结果为3比上一条推入的4略小;
在日常的运维中如果发现SQL在推入后的效果更佳时你就可以考虑推入这个方法去暂时解决这个问题,以及要清楚
哪些条件可让ORACLE进入推入的操作,哪些不能; 
如下举例,不同类型的视图,相同的连接类型,一个可以推入,一个不行;
        create view v_tt as 
  2    select t2.object_id,t1.status 
  3    from t1,t2
  4    where t1.object_id=t2.object_id
  5    union 
  6    select t1.object_id,t3.status
  7    from t1,t3
  8    where t1.object_id=t3.object_id
  9    ;

SQL_ID  dttpqvxhpjwm4, child number 0
-------------------------------------
   select  /*+ push_pred(v_tt) */t1.status,v_tt.object_id    from v_tt
,t1     where v_tt.object_id=t1.object_id(+)     and t1.object_id=88

Plan hash value: 1281273642

------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |           |       |       |     9 (100)|          |
|   1 |  NESTED LOOPS                      |           |     2 |    40 |     9  (23)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID      | T1        |     1 |    18 |     2   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                | IDX_T1_ID |     1 |       |     1   (0)| 00:00:01 |
|   4 |   VIEW                             | V_TT      |     2 |     4 |     7  (29)| 00:00:01 |
|   5 |    SORT UNIQUE                     |           |     2 |    62 |     7  (58)| 00:00:01 |
|   6 |     UNION ALL PUSHED PREDICATE     |           |       |       |            |          |     --推入
|*  7 |      FILTER                        |           |       |       |            |          |
|   8 |       MERGE JOIN CARTESIAN         |           |     1 |    31 |     3   (0)| 00:00:01 |
|   9 |        TABLE ACCESS BY INDEX ROWID | T1        |     1 |    18 |     2   (0)| 00:00:01 |
|* 10 |         INDEX RANGE SCAN           | IDX_T1_ID |     1 |       |     1   (0)| 00:00:01 |
|  11 |        BUFFER SORT                 |           |     1 |    13 |     1   (0)| 00:00:01 |
|* 12 |         INDEX RANGE SCAN           | IDX_T2_ID |     1 |    13 |     1   (0)| 00:00:01 |
|* 13 |      FILTER                        |           |       |       |            |          |
|  14 |       MERGE JOIN CARTESIAN         |           |     1 |    31 |     2   (0)| 00:00:01 |
|* 15 |        INDEX RANGE SCAN            | IDX_T1_ID |     1 |    13 |     1   (0)| 00:00:01 |
|  16 |        BUFFER SORT                 |           |     1 |    18 |     1   (0)| 00:00:01 |
|  17 |         TABLE ACCESS BY INDEX ROWID| T3        |     1 |    18 |     1   (0)| 00:00:01 |
|* 18 |          INDEX RANGE SCAN          | IDX_T3_ID |     1 |       |     0   (0)|          |
------------------------------------------------------------------------------------------------


--把v_t1t2代替原来v_tt视图,设置了no_merge,push_pred依然不能推入,视图类型不一样;
SQL_ID  7wq68281uxuah, child number 0
-------------------------------------
       select  /*+ no_merge(v_tt)  push_pred(v_tt)
*/t1.status,v_tt.object_id    from v_t1t2 v_tt ,t1     where
v_tt.object_id=t1.object_id(+)     and t1.object_id=88

Plan hash value: 1712600844

-------------------------------------------------------------------------------------------
| Id  | Operation                     | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |           |       |       |     4 (100)|          |
|   1 |  MERGE JOIN CARTESIAN         |           |     1 |    31 |     4   (0)| 00:00:01 |
|   2 |   VIEW                        | V_T1T2    |     1 |    13 |     2   (0)| 00:00:01 |
|   3 |    MERGE JOIN CARTESIAN       |           |     1 |    26 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IDX_T1_ID |     1 |    13 |     1   (0)| 00:00:01 |
|   5 |     BUFFER SORT               |           |     1 |    13 |     1   (0)| 00:00:01 |
|*  6 |      INDEX RANGE SCAN         | IDX_T2_ID |     1 |    13 |     1   (0)| 00:00:01 |
|   7 |   BUFFER SORT                 |           |     1 |    18 |     4   (0)| 00:00:01 |
|   8 |    TABLE ACCESS BY INDEX ROWID| T1        |     1 |    18 |     2   (0)| 00:00:01 |
|*  9 |     INDEX RANGE SCAN          | IDX_T1_ID |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------


其它的查询转换类型还包含有:
连接因式分解,表扩展(table expansion),表移除,in的改写形式 


--连接因式分解(VW_JF_XX),JF:join factorization,关键提示字眼
概念:针对union all语句,对其中的公共部份拿出再与原SQL的剩余部份做连接
条件:须等价语义转换这个大前提


--表扩展(table expansion)
概念:其中一个分区的索引失效并不影响其它分区的索引使用情况,11G R2前一个分区索引失效,走索引会全部转为全表扫描;
前提:基于成本考虑
expand_table(t1)/no_expand_table(t1)


--表移除
概念:把不影响SQL执行结果的表删除,少做一次连接

备注:lnnvl函数lnnvl(deptno in (10) )

--IN写法
(1)第一种
in-list iterator
可被10142,10157事件禁止

(2)第二种
in-list iterator expansion
概念:将in后面的变量用union all来连接各个分支,保证每个分去的计划正确性,缺点分支越长越耗解析时长
,并且当in-list iterator生效时,使用use_concat(此HINT)并不生效,可用10142,10157将interator禁掉

(3)第三种
in做为filter的过滤条件
满足两条件a.in后面为子查询而非常量 b. in后面的子查询不可展开

(4)第四种
子查询展开与(子查询中包含视图)的合并


多维聚合前的数据变形:维度对齐与指标衍生实战指南 多维聚合不是简单套用GROUP BY,而是以数据形状适配业务语义的系统性工程。其核心在于将离散、异构、粒度不一的原始数据,通过维度对齐、指标衍生等关键变形动作,重构为可稳定分组、可精确计算、可追溯验证的聚合就绪形态。这一过程直接决定复购率、新客占比等复合指标的准确性与可复用性,广泛应用于BI报表开发、指标平台搭建及实时数仓建设等场景。本文聚焦数据变形的本质逻辑与五大实操动作,帮助工程师跨越从‘能跑通’到‘可交付’的关键鸿沟。 阅读详情

相关推荐

MuleSoft+LangChain企业AI编排实战:打通数据孤岛与大模型

AI编排(AI Orchestration)是企业落地大模型的核心枢纽,它解决的不是模型能力问题,而是数据调度、安全治理与业务集成的系统性挑战。其本质是构建一条可审计、可扩展、符合GDPR/SOX等合规要求的数据-模型-应用闭环通路。关键技术包括API网关统一接入、多源异构系统连接器(如SAP/Salesforce/Oracle)、动态脱敏与字段级权限控制、以及与LangChain等AI框架的松耦合协同。典型应用场景涵盖销售智能助手、客户流失预警、合规知识生成等,尤其适用于金融、医疗、制造等强监管行业。本文

weixin_30615767的博客 468

3.RAG&LLM 从零学习笔记--- Query Transformations Part-1

查询转换是一组专注于重写和/或修改问题以进行检索的方法本篇介绍5种。

weixin_47059517的博客 1187

基础及入门(1)-Flink SQL流批一体

不,事件时间 10:00:59 小于窗口结束 10:01:00,但是它的到来使得 Watermark 可能变成 10:00:59 - 5s = 10:00:54,此时 Watermark 仍小于窗口结束,窗口不会关闭。如果此数据来得很晚,比如系统已收到过 10:01:06 的数据,Watermark 已经到了 10:01:01,那这条 10:00:59 的数据就会被视为迟到,可能被丢弃或交给侧输出),通过允许的 5 秒乱序,大部分合理迟到都能被容纳。两者结合,就让 SQL 获得了处理无限流的超能力。

xiaobinhxb的博客 188

SQL调优指南笔记5:Query Transformations

本文为SQL Tuning Guide第5章“查询转换”的笔记。 5.1 OR Expansion 5.2 View Merging 5.2.1 Query Blocks in View Merging 5.2.2 Simple View Merging 5.2.3 Complex View Merging 5.3 Predicate Pushing 5.4 Subquery Unnesting 5.5 Query Rewrite with Materialized Views 5.5.1 About Qu

In-Memory Computing Technology 868

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例)

本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。

3c4x5z6v7b的博客 625

三维跨孔电磁波CT数据可视化框架搭建

利用matlab实现对跨孔电磁波CT实测数据反演,并搭建了三维CT数据可视化框架,可装填实测CT反演数据。

Neverlevsun的博客 1167

知识图谱用于细粒度大模型幻觉评估:兼论Langchain-RAG问答中的问题改写范式

来自:老刘说NLP快来!NLP论文投稿、LLM交流、论文直播群我们在之前的文章中有说过,Langchain作为当前RAG和AGENT的一个明星框架,已经为大家所熟知,而随着应用人数的增加,在技术层面上也出现了许多的问题和对应的优化方案。例如,一般RAG通常将文档分割成块,嵌入其中,并检索与用户问题语义相似度高的文档块。但是,这也带来了一些问题:文档块可能包含不相关的内容,从而降低了检索效率;用户问...

zenRRan的博客 1407

Exchange 2013/2016/2019修改附件大小限制

Exchange 2013/2016/2019邮件大小限制 可以在三个位置上配置Exchange上的默认邮件大小限制: 组织传输设置 发送/接收连接器设置 用户邮箱设置 1.打开Exchange Management Shell 使用命令查看默认限制 get-transportconfig | ft maxsendsize, maxreceivesize get-receiveconnector | ft name, maxmessagesize get-sendconnector | ft

高级基础架构专家-Hunter 6094

RAG查询转换(Query Transformations)的优化方案(1)——多查询(Multi Query)

爬取网页内容,提取 main_box 里的文本。 把文本向量化并存储到 FAISS 数据库。 让 LLM 生成 5 个改写版本的问题,提高召回率。 用这 5 个问题去数据库检索,获取相关文档。

陈开心的博客 1337

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 503

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 530

深入理解 Hive SQL 中的 TRANSFORM 函数

本文详细介绍了 Hive SQL 中 TRANSFORM 函数的使用方法和应用场景。TRANSFORM 是一个强大的工具,用于在 SQL 查询中直接进行复杂的数据转换,或调用外部脚本进行自定义的数据处理。文章首先解释了 TRANSFORM 函数的基本用法,通过实例演示如何将销售物品列表中的每个项目提取出来并计算销售数量。接着,展示了如何使用 TRANSFORM 结合 regexp_replace 函数解决数组中的枚举值替换问题。最后,介绍了如何利用 TRANSFORM 调用外部 Python 脚本进行数据转

liuya19921123的博客 3179

AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

Lce的专栏 3236

构建可撤销权限的LLM数据访问层:安全架构与Java实战

在数据库权限管理中,核心在于实现细粒度的访问控制与动态授权。其原理是通过策略引擎和查询代理层,在用户请求与数据源之间建立安全屏障,确保操作合规。这一机制的技术价值在于贯彻最小权限原则,有效防范数据泄露与越权访问,是数据安全治理的关键环节。其典型应用场景包括多租户SaaS平台、金融风控系统和涉及敏感数据的企业应用。本文聚焦于大型语言模型(LLM)集成场景,针对其直接连接生产数据库带来的权限回收难题,提出了一套基于中间层架构的解决方案。该方案通过认证、授权、查询转换与审计等核心组件,实现了权限的动态管理与即时撤

weixin_33806914的博客 386

告别抖动与滞后:深入博能传动伺服DSC功能,用105报文提升多轴同步性能

本文深入解析博能传动伺服DSC功能如何通过105报文实现多轴同步性能提升,有效解决工业自动化中的抖动与滞后问题。详细介绍了DSC技术原理、105报文实现机制及多轴同步工程实践,帮助工程师优化伺服系统性能,实现绝对齿轮同步。

weixin_30394981的博客 184

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

努力让自己发光,对的人才能迎着光而来 13万+

从零构建Spark互动合照流程:环境搭建、核心代码与典型问题排查

分布式计算框架通过将大规模数据处理任务分解到多台机器并行执行,解决了单机性能瓶颈问题。其核心原理在于提供了弹性数据集、内存计算和DAG执行引擎等抽象,能够显著提升海量数据的处理效率。在实时推荐、用户行为分析和日志聚合等场景中,这类技术展现出巨大价值。本文聚焦于Apache Spark,以其强大的DataFrame API和优化器,演示如何构建一个完整的互动合照生成数据处理流程。通过模拟用户互动日志的过滤、聚合操作,并深入解析RDD与DataFrame的区别,以及开发中常见的环境配置与内存溢出问题,为开发者提

weixin_30236595的博客 463

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【课程设计】SSM网上村委会业务办理系统-计算机毕业设计源码30923

系统需涵盖用户管理、办事申请管理、补贴活动通告管理、党员发展管理、公告管理、留言板管理、农业补贴管理、土地变更管理、用户管理、管理员管理等功能

Biye_Design的博客 5058

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

企业级AI编排实战:MuleSoft+LangChain构建可信数据-智能闭环

AI编排(AI Orchestration)是企业将大语言模型(LLM)真正融入核心业务系统的关键技术路径,其本质并非简单调用API,而是通过可审计、可治理、可分级授权的流程设计,在多源异构系统(如Salesforce、SAP、Oracle)间构建安全可信的数据-智能闭环。它解决的是数据主权、系统耦合与责任归属三大现实瓶颈,技术价值体现在协议适配、动态脱敏、权限熔断与全链路追踪等工程能力上。典型应用场景包括销售风险预警、财务合规分析与HR智能入职等,尤其适用于已具备ERP/CRM等 legacy 系统、亟需

chulilang8944的博客 361

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

多维聚合中的数据操纵:动态维度裁剪与条件度量重计算实战

多维聚合是现代BI与实时OLAP的核心能力,其本质是突破传统GROUP BY的静态路径限制,构建可任意组合、折叠、下钻的弹性分析网格。技术原理上,它依赖向量化引擎(如DuckDB)、列式内存模型(Arrow)与规则驱动执行层协同工作,实现毫秒级动态切片。其核心价值在于统一数据口径、消除ETL冗余、兼顾实时性与灵活性。典型应用场景涵盖电商大促实时看板、银行反洗钱特征计算、工业设备预测性维护等需要高频交互与业务逻辑深度嵌入的领域。本文聚焦Data Manipulation in Multi-Dimensiona

weixin_30613727的博客 399

ESP32开发入门:创建工程、编译与烧录全流程解析

嵌入式开发中,ESP32作为物联网主流芯片,常用于智能硬件原型与产品落地。然而,与STM32等传统单片机不同,ESP32的官方工具链ESP-IDF依赖CMake、Ninja和命令行,初看门槛较高。其开发流程可拆解为创建工程、编译、烧录三部分:通过idf.py create-project生成项目骨架,set-target匹配芯片型号,build触发CMake配置与增量编译,最终由esptool将bootloader、分区表和应用固件写入指定Flash地址。理解这些底层原理有助于排查环境与烧录问题,并显著提升

weixin_33841722的博客 422

多维聚合实战:从空间构建到跨维计算的工程化方法

多维聚合是BI与数据分析的核心能力,其本质远超SQL中GROUP BY的基础语法,涉及分析空间定义、维度建模约束、层级汇总、同比计算及业务规则驱动等系统性工程。理解维度组合的笛卡尔积基底、代理键一致性、事实表粒度唯一性等底层原理,是保障报表准确性的前提;而空间构建、层级折叠、跨维计算和条件变形四大操作类型,则直接决定分析结果的技术价值与业务可用性。在零售、SaaS、制造等多行业实践中,该能力支撑着动态钻取、异常标记、占比分析等关键场景。本文聚焦真实工程落地,详解如何用物化空间表、闭包层级、安全LAG/日期对

chubaisheng8627的博客 368

机器学习流水线实战手册:从数据契约到模型灰度发布的编码指南

机器学习工作流(ML Workflow)本质上是数据、特征、模型与部署协同演进的工程系统,其核心原理在于通过可验证的代码契约保障端到端可重现性。技术价值体现在规避90%线上故障——如训练推理不一致、环境漂移、特征污染和发布失控。典型应用场景包括金融风控模型迭代、电商推荐AB测试、工业预测性维护等需高可靠交付的业务系统。本文聚焦‘Coding Guide’实践范式,深度融合Great Expectations数据契约校验、Feast特征统一计算、Optuna+MLflow可复现实验管理、KServe+Argo

abxlep7702的博客 504

springboot李庄古镇农产品销售系统 毕业设计----附源码66743

系统将用户、商家、管理员三种角色分为农产商品推荐、客服咨询、多级商城浏览、购物车和订单流转、地址簿维护、售后申请、店铺信息配置、商品上架下架、配送状态更新、可视化报表、用户权限审核等具体的业务。按照软件工程规范依次完成需求调研、总体架构设计、前后端功能模块划分、数据库关系建模、编码实现和测试验证。

VXSJ881的博客 169

工作中使用到的单词(软件开发)_第五版

本文摘要: 本文为软件开发相关的术语与技术要点整理,主要包含2020-2025年间四版内容更新(No.01-41)。重点包括: 证书文件格式(PEM/P12)差异 外部API通信注意事项(Accept头设置、HTTPS连接问题) Postman工具使用技巧(Cookie管理、请求头设置) WAS配置相关经验(JVM设置、SSL连接问题) 数据库操作命令(DB2表结构修改) IBM安全管理组件(TAM/iv-user机制) 网络通信细节(chunked传输编码特性) 常用开发工具(curl、Postman)的

sun0322 2516

(课程设计)基于Spring Boot的社区生鲜配送管理系统的设计与实现-计算机毕设 附源码08610

注册用户功能分析: 登录注册:注册用户可以通过手机号、邮箱等信息完成账户的注册和登录。登录后,系统会根据用户的角色和权限展示相应的功能模块,保证了用户体验的个性化。 首页:为用户展示系统的核心内容,包括热销生鲜商品、促销活动、最新消息等。通过首页,用户能够快速了解商城动态,便于后续购物决策。 通知公告:系统通过通知公告模块向用户发布相关的系统信息、活动信息、服务更新等,确保用户能够及时了解平台的最新消息和变动。 新闻资讯:用户可以在平台上查看各类生鲜相关的新闻资讯,包括饮食健康、食材选择等内容,为用户提供有

ID3461074420的博客 3833
上一篇: SQL优化【基础08】 - 耗能SQL分析一般流程思路
下一篇: SQL优化【基础10】 - 10046&10053
launch_225
博客等级 码龄18年 125粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值