23c 新特性之SQL_transpiler
描述
介紹
有時我們需要查詢的選擇列表中的函式。這些可能是內建的函式,或者是我們自己編碼的函式。預設操作是為查詢返回的每一行呼叫函式。如果函式是確定性的,那麼對於相同的輸入引數簽名,它會給出相同的輸出,並且與處理的行數相比,使用的引數簽名數較低,這可能會浪費很多資源效率。
Oracle23c 中的自動 SQL_transpiler 允許將一些函式轉換為 SQL 表示式,以減少 SQL 中函式呼叫的開銷。我們使用 WHERE 子句中的一個函式作為過濾器來查詢表。執行計劃中的謂詞資訊顯示該函式被用作篩選器。
的應用
開關後,Oracle 自動將函式轉化為SQL 表示式。對於高頻操作,可極大程度降低函式呼叫,降低爭用,同時還能一定程度上提升效能。
測試
測試函式建立
SQL> conn roger/roger@enmopdb1 Connected. SQL> create table t0710 ( 2 a number, 3 b number, c number ); 4 5 Table created. SQL> insert into t0710 values (1, 2, 3), (2, 20, 30), (3, 200, 300); 3 rows created. SQL> commit; Commit complete. SQL> create or replace function add_numbers(p1 in number, p2 in number) 2 return number as 3 begin 4 return p1 + p2; 5 end; 6 / Function created.
開啟前後執行計劃對比
不開啟SQL_transpiler
SQL> select a, b, c from t0710 where add_numbers(b, c) = 500; A B C ---------- ---------- ---------- 3 200 300 Execution Plan ---------------------------------------------------------- Plan hash value: 925956317 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 39 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T0710 | 1 | 39 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("ADD_NUMBERS"("B","C")=500) SQL> alter system flush shared_pool; System altered. SQL> alter session set sql_transpiler=on; Session altered. SQL> select a, b, c from t0710 where add_numbers(b, c) = 500; A B C ---------- ---------- ---------- 3 200 300 Execution Plan ---------------------------------------------------------- Plan hash value: 925956317 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 39 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T0710 | 1 | 39 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("B"+"C"=500)
此時Oracle 自動將函式轉化為SQL 表示式
執行效率對比
不開啟SQL_transpiler
SQL> alter system flush shared_pool; System altered. SQL> set timing on SQL> declare 2 c number; 3 begin for i in 1 . 4 . 500000 loop select count(1) into c from t0710 where add_numbers(b, c) = 500; 5 6 end loop; 7 end; 8 / PL/SQL procedure successfully completed. Elapsed: 00:00:25.19
開啟SQL_transpiler
SQL> alter system flush shared_pool; System altered. Elapsed: 00:00:00.12 SQL> alter session set sql_transpiler=on; Session altered. Elapsed: 00:00:00.00 SQL> declare 2 c number; 3 begin 4 for i in 1 .. 500000 loop 5 select count(1) into c from t0710 where add_numbers(b, c) = 500; 6 end loop; 7 end; 8 / PL/SQL procedure successfully completed. Elapsed: 00:00:16.17
此處測試開啟 sql_transpiler ,執行效率提升大約 36% ,開啟 sql_transpiler 開關後 ,Oracle 自動將函式轉化為 SQL 表示式。對於高頻操作,可極大程度降低函式呼叫,降低爭用,同時還能一定程度上提升效能。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/23825935/viewspace-3004477/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 23c 新特性之實時SQL計劃管理SQL
- 23C新特性SQL防火牆 (SQL Firewall)SQL防火牆
- Oracle 23C Free下載安裝及新特性Oracle
- Oracle Database 23c Beta 釋出,增加 300 多個新特性OracleDatabase
- Java 10 新特性之 AppCDSJavaAPP
- Java 8 新特性之方法引用Java
- IOS11新特性之maskedCornersiOS
- iOS 8 之後UINavigationController新特性iOSUINavigationController
- ES6 新特性之SymbolSymbol
- JDK8新特性之stream()JDK
- MySQL 8 新特性之Clone PluginMySqlPlugin
- HTML5 新特性之 WebsocketHTMLWeb
- Java8新特性之:OptionalJava
- MySQL 8 新特性之Invisible IndexesMySqlIndex
- JDK8新特性之Stream流JDK
- JDK 1.8 新特性之Lambda表示式JDK
- ?Java8新特性之Optional類Java
- JDK 9新特性之Flow API 初探JDKAPI
- 開心檔之Java 9 新特性Java
- java8 新特性之方法引用Java
- java8 新特性之Optional 類Java
- PHP新特性之閉包、匿名函式PHP函式
- 12c RMAN新特性之Recover Table
- es6新特性之 class 基本用法
- PHP 7.4 新特性之箭頭函式PHP函式
- JDK1.8新特性之Lambda表示式JDK
- Java8新特性探索之Stream介面Java
- javascript ES6 新特性之 解構JavaScript
- JDK1.8新特性之Lambda表示式()->JDK
- Java8新特性之時間APIJavaAPI
- js--ES6新特性之解構JS
- PHP8新特性之match表示式PHP
- java8 新特性之Lambda 表示式Java
- java8 新特性之預設方法Java
- 新特性
- MySQL5.6新特性之Multi-Range ReadMySql
- JDK8新特性之函式式介面JDK函式
- JDK1.8的新特性之Lambda表示式JDK