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