ORACLE中內部函數SYS_OP_C2C和隱式類型轉換

来源:https://www.cnblogs.com/kerrycode/archive/2018/08/17/9491647.html
-Advertisement-
Play Games

什麼是SYS_OP_C2C呢?官方的介紹如下: SYS_OP_C2C is an internal function which does an implicit conversion of varchar2 to national character set using TO_NCHAR func... ...


什麼是SYS_OP_C2C呢?官方的介紹如下:

 

SYS_OP_C2C is an internal function which does an implicit conversion of varchar2 to national character set using TO_NCHAR function. Thus, the filter completely changes as compared to the filter using normal comparison.

 

 

簡單的來說,SYS_OP_C2C 是一個內部函數,功能是將VARCHAR2的數據類型轉換成國家字元集的NVARCHAR2類型,內部通過TO_NCHAR函數實現。

 

 

 

其實為什麼要介紹一下這個內部函數,是因為最近一個同事在優化一個SQL語句時,發現即使創建了相關欄位的索引,但是SQL語句的執行計劃仍然不走索引,而走全表掃描,個人在分析了後,發現即使這個索引涉及的三個欄位的選擇率不高,但是也不是不走索引的原因,而是因為隱式轉換問題(全局臨時表的跟物理表關聯的欄位數據類型不一致),如果Automatic SQL Tuning - SQL Profiles Tuning Advisor建議創建基於SYS_OP_C2C的函數索引,或者執行計劃中有類似 filter(SYS_OP_C2CCOLUMN).....這樣的信息,那麼你應該檢查是否出現了隱式類型轉換(implicit type conversion

 

 

什麼是隱式類型轉換(implicit type conversion)?

 

 

如果進行比較的兩個值的數據類型不同,則 ORACLE 必須將其中一個值進行類型轉換使其能夠比較。這就是所謂的隱式類型轉換。通常當開發人員將數字存儲在字元列時會導致這種問題的產生。ORACLE 在運行時會強制轉化其中一個值,(由於固定的規則)在索引字元列使用 to_number。由於添加函數到索引列所以導致索引不被使用。實際上,ORACLE 也只能這麼做,類型轉換是一個應用程式設計因素。由於轉換是在每行都進行的,這會導致性能問題。詳見:

Document 232243.1 ORA-01722 ORA-01847 ORA-01839 or ORA-01858 From Queries with Dependent Predicates

 

 

官方文檔SYS_OP_C2C Causing Full Table/Index Scans (文檔 ID 732666.1)中有介紹:

 

APPLIES TO:

 

Oracle Database - Enterprise Edition - Version 10.1.0.2 to 12.1.0.1 [Release 10.1 to 12.1]

Information in this document applies to any platform.

This problem can occur on any platform.

 

SYMPTOMS

 

1) You are executing a query using bind variables.

2) The binding occurs via an application (eg. .NET, J2EE ) using a "string" variable to bind.

3) The query is incorrectly performing a full table/index scan instead of an unique/range index scan. 

4) When looking at advanced explain plan, sqltxplain or 10053 trace, you notice that the "Predicate Information" shows is doing a "filter(SYS_OP_C2C)".

 

e.g select * from table(dbms_xplan.display_cursor(&sql_id,null,'ADVANCED'));

 

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter(SYS_OP_C2C("COL1")=:B1)            <=== filter operation occurring

 

 

CAUSE

 

The bind variable "string" is using a different datatype to the column that is being queried. 

This means that an implicit conversion of the data is required to execute the query.  SYS_OP_C2C is the implicit function which is used to convert the column between nchar and char.

 

SOLUTION

 

  1. Create a function based index on the column.

e.g create index <index_name> on <table_name> (SYS_OP_C2C(<column>));

OR

  2. Ensure that your bind "string" datatype and column datatype are the same.

      A java example where this can occurs is when defaultNChar=TRUE.  This will cause strings to bind as NVARCHAR2 causing the predicate that are subset datatypes to be converted to NVARCHAR2.

      e.g.    -Doracle.jdbc.defaultNChar=true

                <connection-property name="defaultNChar">true</connection-property>

 

 

  

關於SYS_OP_C2C內部函數出現的可能原因,概況起來就是

 

1)正在執行一個帶有綁定變數的查詢

 

    關於這個,以前也曾經遇到過這樣的案例,參考這篇博文ORACLE綁定變數隱式轉換導致性能問題

 

2)綁定變數經由application.NET, J2EE等)使用 "string" 類型的綁定變數來綁定。

 

3)該查詢錯誤的執行了全表掃描/索引掃描,而沒有使用索引唯一掃描或者索引範圍掃描

 

4)使用advanced 選項查看explain plan, sqltxlain or 10053 trace,你會註意到在"Predicate Information"部分  會顯示一個 "filter(SYS_OP_C2C)".

 

 

解決方案:

 

1. 建立一個基於函數的索引。

 

e.g create index <index_name> on <table_name> (SYS_OP_C2C(<column>));

 

2. 讓綁定變數定義的數據類型與該列的數據類型一致。

 

 

 

 

參考資料:

 

https://hoopercharles.wordpress.com/2015/02/08/to-n-or-not-to-n-is-sys_op_c2c-the-question-oracle-nvarchar-slow/

SYS_OP_C2C Causing Full Table/Index Scans (文檔 ID 732666.1)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.環境說明: 操作系統:CentOS 6.5 x86_64 資料庫:Mysql 5.6.22 伺服器:阿裡雲VPS,32G Mem,0 swap 二.問題情況: 1.某日發現公司線上系統的Mysql某個實例的從庫長時間記憶體占用達到60%如下圖 2.於是開始按照以下步驟排查: (1).查看mysql ...
  • 創建一個測試數據表 對UNION 和UNION ALL 進行比較: 在MySQL 5.1中文手冊中有下麵一句話: 如果您對UNION不使用關鍵詞ALL,則所有返回的行都是唯一的,如同您已經對整個結果集合使用了DISTINCT。如果您指定了ALL,您會從所有用過的SELECT語句中得到所有匹配的行。 ...
  • <if test="type ==1"> and DATE_FORMAT(create_date,'%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d') </if> <if test="type ==2"> <![CDATA[ and DATE_FORMAT(crea ...
  • 基礎準備:Node.Js 、npm或cnpm、redis安裝 1、建立一個項目文件夾,這裡命名 wxfc ,打開命令行輸入 npm install redis 、 因為沒有創建package.json所以警告, 但仍然可以用這個包的。 package.json只是展示項目所依賴的npm包的描述文件。 ...
  • 解壓版安裝操作官網下載: mysql-installer-community-8.0.12.0.msi如上操作: http://www.cnblogs.com/elfin/p/9429877.htmlmysqld --install 安裝服務net start mysql 啟動服務 解決navica ...
  • redis cluster + sentinel詳細過程和錯誤處理三主三備三哨兵1、基本架構192.168.70.215 7001 Master + sentinel 27001192.168.70.216 7002 Master + sentinel 27002192.168.70.217 700 ...
  • 抓到視窗期,分享紅利,所有為快不破!!! 當年學習移動互聯網的程式員現在年薪都50萬了,抓住機遇創業的都成功了 如今會多種主流後端技術的複合型人才已成為市場標配,這就是Java大數據 Java開發、大數據 人才缺口達到20萬以上,每年以20%的速度在增長 後端伺服器開發最流行的是Java開發,而開發 ...
  • 一. 查詢緩存 1.開啟緩存 設置了緩存開啟,緩存最大限制128M,重啟服務後,再次查詢 2 測試緩存 現在是緩存2次,命中一次 上面是二個查詢sql語句,此時緩存數是4,如下圖所示: 此時緩存數是6,說明緩存區分where條件值的大小寫。同樣也會區分sql關鍵詞的大小寫。如下圖所示: 設置好que ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...