UDOP-large文档理解模型实战:英文文档智能处理全流程解析

核心内容摘要

蓝牙Host BQB dongle对比介绍
LLaVA-v1.6-7b开源大模型:低成本GPU算力下高效图文推理部署

C++课后习题训练记录Day99

我写这篇ä¸�是“产å“�介ç»�â€�而是一份替æ�¢é¡¹ç›®çš„å¼€å�‘者笔记哪些地方能çœ�心哪些地方最好æ��å‰�踩刹车。文里所有 SQL/PLSQL 片段我都按“å¤�制到 ksql 就能跑â€�æ�¥å‡†å¤‡æŠŠ Oracle è¿�移里最常è§�çš„ä¸€äº›æ”¹é€ ç‚¹å°½é‡�用一æ�¡èƒ½æ‰§è¡Œçš„路线串起æ�¥ã€‚æ–‡ç« ç›®å½•

为什么我会把“替��拆�四件事

ä¸€å¼ å›¾è¯´æ¸…è¿�ç§»æµ�æ°´çº¿æˆ‘ä¹ æƒ¯è¿™ä¹ˆè�½åœ°

�境��置Windows 上用 ksql 快速�一个“�跑通�的�验场

1 ���“Oracle 模�自检�

æ•°æ�®ç±»å�‹æ˜ 射我最关心的ä¸�是“能ä¸�能建表â€�而是“语义有没有悄悄å�˜â€�

��用一个“订�系统�把表�索引�分区��列跑通

1 一键�始化��制粘贴执行

Oracle 特有功能的替代å®�ç�°æˆ‘最常写的三类改é€

1 ROWNUM能用但��心“先��还是先截断�

2 CONNECT BY层次查询能��建议把递归逻辑测试到边界

3 DBLINKè·¨åº“è®¿é—®èƒ½ç”¨ä½†æˆ‘å»ºè®®å…ˆå®šæ¸…â€œä½ è¦�的是查询还是å�Œæ­¥â€�

存储过程ã€�函数ã€�æ¸¸æ ‡æˆ‘æ›´å–œæ¬¢â€œå…ˆå°�步跑通å†�规模化è¿�ç§»â€�

1 一个�跑通的过程计算订�金� 记录审计自治事务

2 æ¸¸æ ‡è¿�移显å¼�æ¸¸æ ‡ %ROWCOUNT 的常è§�模å¼�

性能调优我对比的��是“快�快�而是“�么定��

1 用执行计划把“猜测���“���

2 用 HINT �“��对比�别拿它当长期��

3 分区�统计信�先把“能命中��对我在�移�盘里最常写的“踩�清��

为什么我会把“替æ�¢â€�拆æˆ�四件事把 Oracle æ�¢æˆ�金仓KingbaseES大家第一å��应往往是“兼容性到底行ä¸�行â€�。但真到项目里最è¦�命的ä¸�是“能ä¸�能跑â€�而是“æ€�么稳稳交付â€�ã€‚è¯´ç™½äº†å…¼å®¹æ€§å¸®ä½ å°‘æ”¹ä»£ç �ä¸�ä¼šæ›¿ä½ æŠŠé¡¹ç›®å�šå®Œã€‚æ‰€ä»¥æˆ‘ä¹ æƒ¯å…ˆæŠŠæ›¿æ�¢æ‹†æˆ�四件事语法ä¸�对象SQLã€�视图ã€�åº�列ã€�触å�‘器ã€�包/过程/函数是å�¦èƒ½æ�¥ä½�æ•°æ�®ç±»å�‹NUMBER/DATE/CLOB 这类“è€�朋å�‹â€�到底æ€�么è�½åœ°ç²¾åº¦å’Œè¯­ä¹‰æ˜¯å�¦ä¸€è‡´è¿�行ä¸�工具链脚本æ€�么跑ã€�æ€�么å›�å½’ã€�æ€�么定ä½�æ…¢ SQL上线é£�险å›�滚策略ã€�ç�°åº¦ã€�å�Œå†™/对账窗å�£æ€�么设计。手册里对 Oracle 兼容覆盖é�¢å†™å¾—很细在 Oracle 模å¼�下数æ�®ç±»å�‹ã€�伪列ã€�DML/DQLã€�过程化语言ã€�触å�‘器ã€�动æ€� SQL 这些常è§�能力都在兼容范围里è¿� DBLink è¿™ç§�å��“工程å�‘â€�çš„èƒ½åŠ›ä¹Ÿç»™åˆ°äº†ã€‚è¿™ç¯‡æ–‡ç« æˆ‘å°±æŒ‰â€œç�°åœºçœŸçš„会踩â€�的路å­�æ�¥å†™å…ˆæŠŠæ•°æ�®ç±»å�‹è�½ç¨³å†�把过程/函数跑通最å��把 ROWNUMã€�CONNECT BYã€�DBLINK 这些高频点用å�¯æ‰§è¡Œçš„æ–¹å¼�验è¯�一é��。

ä¸€å¼ å›¾è¯´æ¸…è¿�ç§»æµ�æ°´çº¿æˆ‘ä¹ æƒ¯è¿™ä¹ˆè�½åœ°æº�库盘点对象/SQL/æ•°æ�®é‡�/ä¾�赖问题è¯�归类类å�‹/语法/过程/è¿�ç»´ç›®æ ‡åº“å‡†å¤‡Oracle模å¼�å®�例å�‚数基线结æ�„è¿�ç§»schema/表/索引/分区/åº�列数æ�®è¿�移全é‡�-æ ¡éªŒ-å¢�é‡�窗å�£SQL改写ä¸�兼容验è¯�ROWNUM/CONNECT BY/外è¿�æ�¥/包性能å›�归执行计划/索引/统计信æ�¯ä¸Šçº¿ä¸�å›�滚预案ç�°åº¦/å�Œå†™/对账我ä¸�太建议一上æ�¥å°±â€œå…¨é‡�自动è¿�â€�。更稳的å�šæ³•æ˜¯å…ˆæŠŠé£�险收敛挑一个模å�—æˆ–ä¸€ç»„æ ¸å¿ƒè¡¨æŠŠç±»å�‹ã€�过程ã€�æ…¢ SQL 这三件事跑通手里有了å�¯å¤�用的套路å†�扩é�¢ã€‚

ç�¯å¢ƒä¸�å‰�ç½®Windows 上用 ksql 快速æ�­ä¸€ä¸ªâ€œå�¯è·‘通â€�çš„å®�éªŒåœºä½ è¯´ä½ çš„ç�¯å¢ƒæ˜¯ Windows 且在 ksql 上æ“�作下é�¢æ‰€æœ‰æ¼”示默认满足Windows 已安装 KingbaseES并创建了 Oracle 模å¼�å®�ä¾‹ä½ èƒ½åœ¨ PowerShell / Windows Terminal 中执行ksql如æ�œä½ çš„ç�¯å¢ƒè¿™ä¸€æ­¥å°±å�¡ä½�了比如端å�£ä¸�通ã€�æœ�务没起æ�¥ã€�ksql è¿�ä¸�上我之å‰�写过一篇ä»�安装到è¿�通性验è¯�的笔记按步骤走基本ä¸�会翻车Windows 安装 KingbaseES V9R1C10 ä¸� Oracle 兼容特性å®�战概念解释我就ä¸�展开了先用能跑通的方å¼�把ç�¯å¢ƒç¡®è®¤ä¸‹æ�¥å�ªè¦�ä½ åœ¨ ksql é‡ŒæŠŠå‡ ä¸ªå…³é”®è¯­æ³•è·‘èµ·æ�¥å��é�¢æ‰€æœ‰å®�æ“�æ‰�有æ„�义。

1 ���“Oracle 模�自检�ksql -h

127.

0.

1 -p54321-U system -dtest端å�£è¿™å�—æŒ‰ä½ çš„å®�例æ�¥æˆ‘这边 Oracle 兼容版用的是 54322所以截图里会看到 54322。进到test#之å��å…ˆå�šä¸‰ä»¶äº‹SELECTCURRENT_USER;SELECTCURRENT_TIMESTAMP;-- Oracle ä¹ æƒ¯çš„ dual 伪表能跑通基本说æ˜�ä½ åœ¨ Oracle 语义ç�¯å¢ƒé‡ŒSELECTCURRENT_DATEFROMdual;如æ�œä½ æ�¥ä¸‹æ�¥è¿˜èƒ½è·‘通ROWNUMå’ŒCONNECT BY基本å�¯ä»¥è®¤ä¸ºâ€œOracle è¿�移的高频语法â€�处在å�¯éªŒè¯�范围内第 6 ç« ä¼šç»™ä¾‹å­�。

æ•°æ�®ç±»å�‹æ˜ 射我最关心的ä¸�是“能ä¸�能建表â€�而是“语义有没有悄悄å�˜â€�ç±»å�‹æ˜ 射这事最容易被“建表ä¸�报错â€�给骗了。表是建起æ�¥äº†æ²¡é”™ä½†è¯­ä¹‰ä¸€æ—¦å��了å��é�¢å°±æ˜¯æ…¢æ…¢å¯¹è´¦ã€�慢慢æ�‰å�‘。真å®�项目里类å�‹é£�é™©æˆ‘åŸºæœ¬éƒ½æ ½åœ¨è¿™ä¸‰ç±»ä¸Šç²¾åº¦NUMBER(p,s) 的范围ã€�金é¢�字段的四èˆ�五入时间语义DATE 到底带ä¸�带时间应用是å�¦ä¾�èµ–éš�å�«æ—¶é—´å¤§å¯¹è±¡ä¸�字符集CLOB/NCLOBã€�VARCHAR2/NVARCHAR2 的边界值ä¸�ç¼–ç �。KingbaseES 的手册里有类å�‹å¯¹ç…§è¡¨æ¯”如 numeric/number 对 Oracle NUMBER 的对应关系等我自己在项目里常用的“è�½åœ°æ˜ 射建议â€�å¤§æ¦‚æ˜¯è¿™æ ·Oracle 常è§�ç±»å�‹è¿�ç§»è�½åœ°å»ºè®®KingbaseES Oracle 模å¼�我会é¢�外检查的点NUMBER(p,s)优先ä¿�æŒ�为 NUMBER(p,s) / NUMERIC(p,s)金é¢�字段是å�¦å­˜åœ¨éš�å�«ç²¾åº¦æ‰©å±•VARCHAR2(n)VARCHAR(n)字段长度边界ã€�是å�¦ä¾�赖空串/空值差异CHAR(n)CHAR(n)å°¾éƒ¨ç©ºæ ¼æ¯”è¾ƒè§„åˆ™DATEDATEOracle 语义ç�¯å¢ƒä¸‹æ›´è´´è¿‘å�Ÿç”¨æ³•是å�¦æœ‰â€œå�ªå­˜æ—¥æœŸä¸�存时间â€�的约定TIMESTAMPTIMESTAMP时区列是å�¦éœ€è¦� TIMESTAMP WITH TIME ZONECLOB/NCLOBCLOB/NCLOB大字段更新是å�¦èµ° DBMS_LOB 路线BLOBBLOB事务ä¸�定ä½�器用法我自己的ç»�验是别在è¿�移第一天就“顺手把 NUMBER 全改æˆ� INTâ€�ã€‚ä½ çœ�下æ�¥çš„那点存储空间å��é�¢å¾ˆå®¹æ˜“以“线上对账差

01â€�的形å¼�åŠ å€�è¿˜ä½ ã€‚

å®�æ“�用一个“订å�•系统â€�把表ã€�索引ã€�分区ã€�åº�列跑通下é�¢è¿™å¥—脚本å�¯ä»¥ç›´æ�¥åœ¨ ksql 里执行建表ã€�建索引ã€�建åº�列ã€�建分区表ã€�æ�’æ•°æ�®ã€‚一å�£æ°”跑完å��é�¢ç¬¬ 6ã€�7ã€�8 ç« çš„å…¼å®¹éªŒè¯�和性能定ä½�就能顺ç�€å�šä¸‹å�»ã€‚

1 一键�始化��制粘贴执行-- 清�如存在DROPTABLEIFEXISTSt_order_item;DROPTABLEIFEXISTSt_order;DROPTABLEIFEXISTSt_order_audit;DROPSEQUENCEIFEXISTSseq_order_id;-- �列Oracle项目里常�主键�自 sequenceCREATESEQUENCE seq_order_idSTARTWITH100001INCREMENTBY1;-- 订�主表按下�时间�范围分区示例按月CREATETABLEt_order(order_id NUMBER(12,

NOTNULL,customer_id NUMBER(12,

NOTNULL,order_timeTIMESTAMPNOTNULL,statusVARCHAR(

NOTNULL,remarkVARCHAR(

,total_amount NUMBER(12,

DEFAULT0NOTNULL,CONSTRAINTpk_t_orderPRIMARYKEY(order_id))PARTITIONBYRANGE(order_time)(PARTITIONp202601VALUESLESS THAN(TO_DATE(

,YYYY-MM-DD)),PARTITIONp202602VALUESLESS THAN(TO_DATE(

,YYYY-MM-DD)));-- �细表CREATETABLEt_order_item(item_id NUMBER(12,

NOTNULL,order_id NUMBER(12,

NOTNULL,skuVARCHAR(

NOTNULL,qty NUMBER(12,

NOTNULL,unit_price NUMBER(12,

NOTNULL,CONSTRAINTpk_t_order_itemPRIMARYKEY(item_id));CREATEINDEXidx_t_order_item_order_idONt_order_item(order_id);CREATEINDEXidx_t_order_customer_timeONt_order(customer_id,order_time);-- 审计表演示自治事务/日志CREATETABLEt_order_audit(audit_id NUMBER(12,

NOTNULL,order_id NUMBER(12,

,actionVARCHAR(

NOTNULL,action_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMPNOTNULL,detailVARCHAR(

,CONSTRAINTpk_t_order_auditPRIMARYKEY(audit_id));CREATESEQUENCE seq_audit_idSTARTWITH1INCREMENTBY1;-- �入一些订�INSERTINTOt_order(order_id,customer_id,order_time,status,remark,total_amount)VALUES(seq_order_id.NEXTVAL,2001,TO_TIMESTAMP(

10:12:00,YYYY-MM-DD HH24:MI:SS),NEW,NULL,

;INSERTINTOt_order(order_id,customer_id,order_time,status,remark,total_amount)VALUES(seq_order_id.NEXTVAL,2002,TO_TIMESTAMP(

09:45:10,YYYY-MM-DD HH24:MI:SS),PAID,年度��首�,

;-- æ�’å…¥æ˜�ç»†æ‰‹å·¥å†™å‡ æ�¡å��é�¢ä¹Ÿä¼šæ¼”示用 CONNECT BY 批é‡�é€ æ•°INSERTINTOt_order_item(item_id,order_id,sku,qty,unit_price)SELECT1,(SELECTMIN(order_id)FROMt_order),SKU-001,2,

9

50FROMdual;INSERTINTOt_order_item(item_id,order_id,sku,qty,unit_price)SELECT2,(SELECTMIN(order_id)FROMt_order),SKU-002,1,

1

00FROMdual;INSERTINTOt_order_item(item_id,order_id,sku,qty,unit_price)SELECT3,(SELECTMAX(order_id)FROMt_order),SKU-003,3,

3

90FROMdual;COMMIT;验�一下对象是�都在SELECTCOUNT(*)ASorder_cntFROMt_order;SELECTCOUNT(*)ASitem_cntFROMt_order_item;

Oracle 特有功能的替代å®�ç�°æˆ‘最常写的三类改é€

1 ROWNUM能用但è¦�å°�心“先æ�’åº�还是先截断â€�ROWNUM 伪列是为了兼容 Oracle è€ŒåŠ çš„æ‰‹å†Œé‡Œä¹Ÿä¸“é—¨æ��醒了一个ç»�å…¸å�‘带 ORDER BY 的时候ROWNUM 的结æ�œä¼šå�—å�–数顺åº�å½±å“�在项目里我一般这么写 Top-N-- å…ˆæ�’åº�å†�截断SELECT*FROM(SELECTorder_id,customer_id,order_time,total_amountFROMt_orderORDERBYorder_timeDESC)WHEREROWNUM10;如æ�œä½ æ›´å��æ ‡å‡†å†™æ³•ä¹Ÿå�¯ä»¥ç›´æ�¥ç”¨ORDER BY ... LIMIT ...。但在è¿�移阶段我通常先求“è€� SQL 能稳定跑â€�ç­‰æ ¸å¿ƒé“¾è·¯ç¨³äº†å†�æ…¢æ…¢æŠŠå†™æ³•å¾€æ›´æ ‡å‡†çš„æ–¹å�‘收敛。

2 CONNECT BY层次查询能æ�¥ä½�建议把递归逻辑测试到边界层次查询这å�—我更关心的是“能ä¸�能把è€�逻辑å�Ÿæ ·æ�¥ä½�â€�。手册里也写得比较æ˜�确层次查询用äº�父å­�关系数æ�®çš„层次返å›�KingbaseES ä¸� Oracle 都支æŒ�语义上是兼容的下é�¢ç”¨ä¸€ä¸ªç»„织结æ�„å�šæ¼”ç¤ºå�Œæ—¶æŠŠâ€œé€ 测试数æ�®â€�的方法也带上DROPTABLEIFEXISTSt_dept;CREATETABLEt_dept(dept_id NUMBER(12,

PRIMARYKEY,parent_id NUMBER(12,

,dept_nameVARCHAR(

NOTNULL);INSERTINTOt_deptVALUES(1,NULL,总部);INSERTINTOt_deptVALUES(2,1,ç ”å�‘中心);INSERTINTOt_deptVALUES(3,1,销售中心);INSERTINTOt_deptVALUES(4,2,å¹³å�°ç»„);INSERTINTOt_deptVALUES(5,2,应用组);COMMIT;-- 层次查询ä»�总部开始展开SELECTLPAD( ,(LEVEL-

*

||dept_nameASdept_tree,dept_id,parent_id,LEVELFROMt_deptSTARTWITHdept_id1CONNECTBYPRIOR dept_idparent_idORDERSIBLINGSBYdept_id;è¿�ç§»é¡¹ç›®é‡Œæˆ‘ä¼šä¸“é—¨åŠ ä¸¤ç±»ç”¨ä¾‹æ��å‰�把éš�æ‚£æ�ªå‡ºæ�¥å¾ªç�¯å¼•用parent_id 指å›�自己/祖先能å�¦è¢«å�Šæ—¶å�‘ç�°å±‚级很深100时性能ä¸�æ�’åº�是å�¦ç¬¦å�ˆé¢„期。

3 DBLINKè·¨åº“è®¿é—®èƒ½ç”¨ä½†æˆ‘å»ºè®®å…ˆå®šæ¸…â€œä½ è¦�的是查询还是å�Œæ­¥â€�在 Oracle 模å¼�下KingbaseES 的兼容能力中包å�« DBLink è¿™ç±»é«˜çº§èƒ½åŠ›å®˜ç½‘æ–‡ç« é‡Œä¹Ÿç»™äº† DBLink 在 Oracle 兼容模å¼�下å®�ç�°è·¨åº“å®�时访问/å�Œæ­¥çš„æ€�路我在项目里会先问一å�¥ä½ è¦�的是“跨库查询â€�还是“跨库å�Œæ­¥â€�。这会影å“�ä½ æ˜¯æŠŠå®ƒå½“ä½œè¿�行时ä¾�赖还是把它当作数æ�®é›†æˆ�链路的一ç�¯ã€‚下é�¢ç»™ä¸€ä¸ªâ€œèƒ½è¯»æ‡‚也好改â€�的例å­�远端è¿�æ�¥ä¿¡æ�¯æŒ‰ä½ ç�¯å¢ƒæ›¿æ�¢-- 示例创建数æ�®åº“链æ�¥è¯­æ³•é£�æ ¼ä¸� Oracle æ�¥è¿‘-- 具体å�‚æ•°ä¸�æ�ƒé™�è¦�æ±‚ä»¥ä½ ç‰ˆæœ¬çš„æ‰‹å†Œ/规范为准CREATEDATABASELINK lk_remote_financeCONNECTTOremote_user IDENTIFIEDBYremote_passwordUSING

192.

168.

1

20:1521/ORCL;-- 使用方å¼�示æ„�通过 dblink 访问远端对象SELECT*FROMremote_schema.remote_tablelk_remote_financeWHEREROWNUM5;我的工程建议是业务强ä¾�赖跨库查询时一定è¦�å�šè¶…æ—¶ã€�é‡�试ã€�熔断å�¦åˆ™ä¸€æ¬¡ç½‘络抖动就能拖å�®æ ¸å¿ƒé“¾è·¯ã€‚如æ�œå�ªæ˜¯è¿�移过渡期的数æ�®æ¯”对/对账更æ�¨è��å�šå¼‚æ­¥å�Œæ­¥ 本地查询把线上查询ä»�跨库ä¾�赖里拿æ�‰ã€‚

存储过程ã€�函数ã€�æ¸¸æ ‡æˆ‘æ›´å–œæ¬¢â€œå…ˆå°�步跑通å†�规模化è¿�ç§»â€�在 Oracle 模å¼�下过程化语言语法基础ã€�é�™æ€�/动æ€� SQLã€�存储过程/函数ã€�匿å��å�—ã€�触å�‘器这些能力都覆盖了。我在è¿�移里更喜欢走“å°�步快跑â€�先挑一个ä½�耦å�ˆã€�能验è¯�é—­ç�¯çš„过程跑通最好带事务ã€�日志ã€�异常å†�把è¿�移规范固化下æ�¥ç„¶å��å†�规模化æ�¨è¿›ã€‚

1 一个å�¯è·‘通的过程计算订å�•金é¢� 记录审计自治事务下é�¢è¿™ä¸ªè¿‡ç¨‹å�šä¸¤ä»¶äº‹æ±‡æ€»æ˜�细金é¢�写å›�主表用自治事务写审计日志主事务å›�滚也ä¸�å½±å“�日志。PRAGMA AUTONOMOUS_TRANSACTIONã€�DBMS_OUTPUT这类用法在ä¸�å°‘ Oracle 项目里都很常è§�。用它们å�šä¸ªå°�é—­ç�¯éªŒè¯�åŸºæœ¬èƒ½å¿«é€Ÿåˆ¤æ–­ä½ è¿™ä¸ªç‰ˆæœ¬çš„è¿‡ç¨‹èƒ½åŠ›åˆ°åº•èƒ½ä¸�能æ�¥ä½�è¿�移诉求。先开输出SETSERVEROUTPUTON;创建过程CREATEORREPLACEPROCEDUREp_recalc_order_total(p_order_id NUMBER)ISv_total NUMBER(12,

;PRAGMA AUTONOMOUS_TRANSACTION;v_audit_id NUMBER(12,

;BEGINSELECTCOALESCE(SUM(qty*unit_price),

INTOv_totalFROMt_order_itemWHEREorder_idp_order_id;UPDATEt_orderSETtotal_amountv_totalWHEREorder_idp_order_id;SELECTseq_audit_id.NEXTVALINTOv_audit_idFROMdual;INSERTINTOt_order_audit(audit_id,order_id,action,detail)VALUES(v_audit_id,p_order_id,RECALC_TOTAL,total||v_total);COMMIT;DBMS_OUTPUT.PUT_LINE(订å�•||p_order_id||å·²å›�写总金é¢�||v_total);END;/执行验è¯�ä½ å�¯ä»¥æŠŠè®¢å�•å�·æ�¢æˆ�ä½ å®�际生æˆ�çš„SELECTorder_id,total_amountFROMt_orderORDERBYorder_id;BEGINp_recalc_order_total((SELECTMIN(order_id)FROMt_order));END;/SELECTorder_id,total_amountFROMt_orderORDERBYorder_id;SELECT*FROMt_order_auditORDERBYaudit_id;è¿�ç§»é¡¹ç›®é‡Œæˆ‘ä¼šåœ¨è¿™ä¸€å±‚åŠ ä¸¤ç±»æ–­è¨€æ˜�细为空时是å�¦å†™å›� 0大订å�•æ˜�细 10w 行下汇总性能是å�¦æ»¡è¶³ SLA。

2 æ¸¸æ ‡è¿�移显å¼�æ¸¸æ ‡ %ROWCOUNT 的常è§�模å¼�这类代ç �在报表ã€�批处ç�†é‡Œå¾ˆå¸¸è§�è¿�移验è¯�时我会用它æ�¥ç¡®è®¤â€œæ¸¸æ ‡æ�§åˆ¶æµ�是ä¸�是一致â€�DECLARECURSORc_ordersISSELECTorder_id,customer_idFROMt_orderORDERBYorder_id;v_order_id t_order.order_id%TYPE;v_customer_id t_order.customer_id%TYPE;BEGINOPENc_orders;LOOPFETCHc_ordersINTOv_order_id,v_customer_id;EXITWHENc_orders%NOTFOUND;DBMS_OUTPUT.PUT_LINE(order_id||v_order_id||, customer||v_customer_id);ENDLOOP;DBMS_OUTPUT.PUT_LINE(rows||c_orders%ROWCOUNT);CLOSEc_orders;END;/

性能调优我对比的ä¸�å�ªæ˜¯â€œå¿«ä¸�å¿«â€�而是“æ€�么定ä½�â€�替æ�¢é¡¹ç›®é‡Œâ€œæ…¢â€�本身其å®�没那么å�¯æ€•真正难å�—的是线上报了慢 SQLä½ ç›¯ç�€ SQL 文本看å�Šå¤©è¿˜æ˜¯ä¸�知é�“该ä»�哪里下手。我的ç»�éªŒå¾ˆæœ´ç´ å�ªè¦�ä½ èƒ½ç¨³å®šæ‹¿åˆ°æ‰§è¡Œè®¡åˆ’æœ€å¥½å¸¦å®�际执行耗时ã€�看得懂索引有没有用上ã€�分区有没有è£�剪到ä½�调优就ä¸�会å�˜æˆ�ç�„学。

1 用执行计划把“猜测â€�å�˜æˆ�“è¯�æ�®â€�EXPLAINANALYZESELECTo.customer_id,SUM(i.qty*i.unit_price)ASamtFROMt_order oJOINt_order_item iONi.order_ido.order_idWHEREo.customer_id2001GROUPBYo.customer_id;è¿™æ�¡ SQL 我跑出æ�¥çš„è®¡åˆ’é‡Œæœ‰å‡ ä¸ªç»†èŠ‚æŒºâ€œå¯¹å‘³â€�çš„t_order是分区表所以计划里出ç�°äº†Append而且两æ�¡åˆ†åŒºåˆ†åˆ«èµ°äº†å�„自的索引扫æ��t_order_p202601_customer_id_order_time_idxå’Œt_order_p202602_customer_id_order_time_idx。这点很关键它说æ˜�按customer_id 2001的过滤æ�¡ä»¶ä¼˜åŒ–器确å®�æ„¿æ„�用索引å�»â€œå®šä½�å°‘é‡�æ•°æ�®â€�而ä¸�æ˜¯æŠŠæ•´å¼ è¡¨æ‰«ä¸€é��。t_order_item这边是Seq Scan别看到顺åº�扫æ��就慌。这里我的æ˜�ç»†è¡¨å°±å‡ è¡Œæ•°æ�®é¡ºæ‰«å��而更çœ�事。真å®�项目里如æ�œæ˜�细表很大那就è¦�盯紧是ä¸�是缺索引ã€�或者 join æ�¡ä»¶å†™æ³•导致索引用ä¸�上。è�šå�ˆéƒ¨åˆ†èµ°çš„æ˜¯Hash JoinGroupAggregate而且 Planning Time 大概

484 ms�Execution Time 大概

991 ms。对我这�“为了验�链路是�跑通�的�数�集�说这个�级就够了到大数��时我�而更关注节点类�有没有跑�比如该走索引���全表扫�该�剪分区�全分区扫�。

2 用 HINT å�šâ€œå�¯æ�§å¯¹æ¯”â€�别拿它当长期æ‹�æ�–很多 Oracle 项目里 HINT 用得特别é‡�这在è¿�ç§»é˜¶æ®µå¾ˆæ­£å¸¸ä½ å¾—å…ˆæŠŠæ ¸å¿ƒé“¾è·¯â€œé’‰ä½�â€�别让执行计划飘æ�¥é£˜å�»ã€‚我的用法是先拿 HINT å�šä¸€ä¸ªå¯¹ç…§å®�验确认它在这个版本/这个写法下确å®�生效å†�决定è¦�ä¸�è¦�ä¿�留到上线阶段能ä¸�长期背ç�€å°±ä¸�背ç�€ä½ å�¯ä»¥è¿™æ ·å�šä¸€ä¸ªâ€œå¯¹ç…§å®�验â€�EXPLAINANALYZESELECT/* INDEX(t_order idx_t_order_customer_time) */order_id,order_time,total_amountFROMt_orderWHEREcustomer_id2001ORDERBYorder_timeDESC;结æ�œå…¶å®�很能说æ˜�问题它直æ�¥èµ°äº†Index Scan Backward而且å�Œæ ·æ˜¯æŒ‰åˆ†åŒºå�šAppend计划里没出ç�°é¢�外的Sort节点。对ORDER BY order_time DESCè¿™ç§�查询æ�¥è¯´è¿™é€šå¸¸æ„�味ç�€ç´¢å¼•顺åº�刚好能满足æ�’åº�需求优化器就çœ�æ�‰äº†æ�’åº�开销。Planning Time 大概

230 ms�Execution Time 大概

116 ms至少在这个数æ�®é›†ä¸‹è·¯å¾„是清晰且稳定的。所以我的建议还是那å�¥è¯�è¿�移早期用 HINT å…œä½�“稳定å�¯æ�§â€�没问题但å��é�¢è¦�å°½é‡�把 SQL 和索引é…�å�ˆå¥½è®©ä¼˜åŒ–器自己也能选到这æ�¡è·¯ã€‚å�¦åˆ™ä½ 会å�‘ç�°ä¸šåŠ¡ä¸€æ‰©è¡¨ã€�统计信æ�¯ä¸€å�˜åŒ–HINT å�¯èƒ½å��而æˆ�了éš�患。

3 分区ä¸�统计信æ�¯å…ˆæŠŠâ€œèƒ½å‘½ä¸­â€�å�šå¯¹åˆ†åŒºè¿™å�—我一般ä¸�é� “感觉â€�而是先查一é��分区边界是ä¸�æ˜¯ä½ ä»¥ä¸ºçš„é‚£æ ·ã€‚æ¯”å¦‚ä¸‹é�¢è¿™æ�¡æŸ¥è¯¢èƒ½ç›´æ�¥æŠŠT_ORDER的分区å��和上界拉出æ�¥SELECTpartition_name,high_valueFROMALL_TAB_PARTITIONSWHEREtable_nameT_ORDER;ä»�图中结æ�œçœ‹P202601å’ŒP202602çš„high_value分别是

00:00:00�

00:00:00跟我们建表时按月切分的预期一致。确认了这个å†�谈“分区è£�剪â€�æ‰�有æ„�义。调优时我通常先å�šä¸¤ä»¶äº‹å…ˆæŠŠæŸ¥è¯¢æ�¡ä»¶å†™å¾—足够“å�¯è£�剪â€�比如按时间范围过滤时尽é‡�让æ�¡ä»¶è�½åœ¨åˆ†åŒºé”®ä¸Šå¹¶ä¸”é�¿å…�对分区键å�šå‡½æ•°åŒ…裹å†�按真å®�访问模å¼�看索引策略是更å��“按客户时间å�–最近 N æ�¡â€�还是“按订å�•å�·ç²¾ç¡®æŸ¥æ˜�细â€�索引该æ€�么组å�ˆåˆ«å…‰ç…§ç�€æ¨¡æ�¿å»ºã€‚我在è¿�ç§»å¤�盘里最常写的“踩å�‘清å�•â€�ROWNUM ORDER BYTop-N 一定è¦�å­�查询包起æ�¥ä¸�然结æ�œä¼šâ€œçœ‹èµ·æ�¥æ²¡é”™ä½†ä¸�稳定â€�ç±»å�‹åˆ«ä¹±æ”¹NUMBER/DATE/LOB 先求语义一致å†�考虑优化。过程先跑通最å°�é—­ç�¯å…ˆå�š 1 个å�¯éªŒè¯�过程带日志/异常/事务å†�批é‡�è¿�移。跨库别当本地用DBLink 能解决“能ä¸�能æ�¥â€�但解决ä¸�了“链路抖动â€�和“稳定性设计â€�。调优è¦�é� è¯�æ�®æŠŠ EXPLAIN ANALYZEã€�索引命中ã€�分区è£�剪这些能力跑通替æ�¢æ‰�å�¯æ�§ã€‚

豆花官网入口免费-豆花官网入口免费应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123