Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

SYS_OP_C2C आंतरिक रूपांतरण के कारण Oracle SQL निष्पादन योजना बदल जाती है

SYS_OP_C2C एक internal function जो एक implicit conversion करता है का varchar2 national character set . के लिए TO_NCHAR . का उपयोग करके समारोह। इस प्रकार, सामान्य तुलना का उपयोग करके फ़िल्टर की तुलना में फ़िल्टर पूरी तरह से बदल जाता है।

मुझे यकीन नहीं है कि पंक्तियों की संख्या कम क्यों है , लेकिन मैं गारंटी दे सकता हूं कि यह अधिक . हो सकता है बहुत। लागत अनुमान प्रभावित नहीं होगा।

आइए एक परीक्षण मामले में चरण-दर-चरण देखने का प्रयास करें।

SQL> CREATE TABLE t AS SELECT 'a'||LEVEL col FROM dual CONNECT BY LEVEL < 1000;

Table created.

SQL>
SQL> EXPLAIN PLAN FOR SELECT * FROM t WHERE col = 'a10';

Explained.

SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     5 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |     1 |     5 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------

   1 - filter("COL"='a10')

13 rows selected.

SQL>

अब तक सब ठीक है। चूँकि 'a10' मान वाली केवल एक पंक्ति है, अनुकूलक ने एक पंक्ति का अनुमान लगाया है।

आइए देखते हैं राष्ट्रीय वर्ण सेट रूपांतरण के साथ।

SQL> EXPLAIN PLAN FOR SELECT * FROM t WHERE col = N'a10';

Explained.

SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    10 |    50 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |    10 |    50 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------

   1 - filter(SYS_OP_C2C("COL")=U'a10')

13 rows selected.

SQL>

यहाँ क्या हुआ? हम देख सकते हैं filter(SYS_OP_C2C("COL")=U'a10') , जिसका अर्थ है कि एक आंतरिक फ़ंक्शन लागू किया जाता है और यह varchar2 . को रूपांतरित करता है nvarchar2 . का मान . फ़िल्टर को अब 10 पंक्तियाँ मिलीं।

यह किसी भी इंडेक्स उपयोग को भी दबा देगा, क्योंकि अब कॉलम पर एक फ़ंक्शन लागू होता है। हम इसे एक function-based index बनाकर ट्यून कर सकते हैं full table scan से बचने के लिए .

SQL> create index nchar_indx on t(to_nchar(col));

Index created.

SQL>
SQL> EXPLAIN PLAN FOR SELECT * FROM t WHERE to_nchar(col) = N'a10';

Explained.

SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1400144832

--------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |            |    10 |    50 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T          |    10 |    50 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | NCHAR_INDX |     4 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access(SYS_OP_C2C("COL")=U'a10')

14 rows selected.

SQL>

हालाँकि, क्या यह निष्पादन योजनाओं को समान बना देगा? नहीं, मुझे लगता है कि दो अलग-अलग वर्णों . के साथ , फ़िल्टर समान रूप से लागू नहीं किया जाएगा। इस प्रकार, अंतर निहित है।

मेरा शोध कहता है,



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एक बाधा के कॉलम नाम (नामों) को वापस करने के लिए फ़ंक्शन कैसे बना सकता हूं?

  2. oracle डंप फ़ाइल को oracle डेटाबेस में कैसे अपलोड करें:AWS RDS

  3. Oracle डेटाबेस में PL/SQL पैकेज कैसे बनाएँ?

  4. Oracle डेटाबेस किस परिस्थिति में डेटाटाइम कॉलम मानों के अमान्य समय भाग की अनुमति देता है?

  5. Oracle के साथ AWS पायथन लैम्ब्डा