क्या यह मैं था, मैं समस्या को एक अलग तरीके से देखने की कोशिश करता। एक SQL पार्सर लिखने के बजाय (जिसके लिए एक नियमित अभिव्यक्ति की तुलना में बहुत अधिक की आवश्यकता होगी जब तक कि आप गारंटी नहीं दे सकते कि सभी SQL कथन उपलब्ध SQL व्याकरण के एक बहुत छोटे उपसमुच्चय का उपयोग करते हैं), मैं प्रत्येक वस्तु के लिए एक क्वेरी योजना तैयार करूंगा और फिर क्वेरी PLAN_TABLE
उन वस्तुओं को देखने के लिए जिन्हें Oracle को हिट करना है। इंडेक्स को किस टेबल पर परिभाषित किया गया है, यह जानने के लिए आपको इंडेक्स एक्सेस के लिए एक अतिरिक्त लुकअप करना होगा, लेकिन यह काफी सीधा होना चाहिए।
यदि आप इस पथ से नीचे जाते हैं, हालांकि, आप उन आधार तालिकाओं को पुनः प्राप्त कर रहे होंगे, जिन्हें आपकी क्वेरी वास्तव में स्पर्श करती है, बजाय इसके कि वास्तव में प्रश्नों को संदर्भित किया जा सकता है। यानी, यदि आपके पास कोई प्रश्न है SELECT * FROM view_1
और view_1
, बदले में, table_a
. के विरुद्ध एक क्वेरी के रूप में परिभाषित किया गया है और table_b
, केवल table_a
और table_b
योजना का हिस्सा होगा। और आपको query_rewrite
disable को अक्षम करना होगा सत्र के लिए यदि आप क्वेरी योजनाओं को भौतिक विचारों को संदर्भित करने से रोकना चाहते हैं यदि वे भौतिक विचार विशेष रूप से क्वेरी का हिस्सा नहीं थे।
यदि, प्रत्येक प्रश्न के लिए, आप एक
. करते हैंEXPLAIN PLAN FOR <<the query>>
तब आप
. कर सकते हैंSELECT DISTINCT object_owner, object_name, object_type
FROM plan_table
वस्तुओं की सूची प्राप्त करने के लिए। अगर OBJECT_TYPE
INDEX%
like जैसा है , फिर आप DBA_INDEXES
. का उपयोग कर सकते हैं देखें (या ALL_INDEXES
या USER_INDEXES
यह इस बात पर निर्भर करता है कि प्रश्न में वस्तुओं का मालिक कौन है और आपके पास किस स्तर के विशेषाधिकार हैं) यह निर्धारित करने के लिए कि सूचकांक किस तालिका पर परिभाषित है
SELECT table_owner, table_name
FROM dba_indexes
WHERE owner = <<object_owner from plan_table>>
AND index_name = <<object_name from plan_table>>
इसलिए, उदाहरण के लिए, यदि मेरे पास एक दृश्य है view_1
create or replace view view_1
as
select *
from emp join dept using (deptno)
और एक प्रश्न
select * from view_1;
मैं कर सकता हूँ
SQL> explain plan for select * from view_1;
Explained.
SQL> ed
Wrote file afiedt.buf
1 SELECT distinct object_owner, object_name, object_type
2* FROM plan_table
SQL> /
OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------- -------------------------
SCOTT DEPT TABLE
SCOTT PK_DEPT INDEX (UNIQUE)
SCOTT EMP TABLE
यह मुझे बताता है कि क्वेरी वास्तव में EMP
. को मार रही है और DEPT
टेबल। यह PK_DEPT
को भी हिट कर रहा है index ताकि मैं देख सकूं कि किस तालिका को परिभाषित किया गया है।
SQL> ed
Wrote file afiedt.buf
1 SELECT table_owner, table_name
2 FROM dba_indexes
3 WHERE owner = 'SCOTT'
4* AND index_name = 'PK_DEPT'
SQL> /
TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT DEPT
जैसा कि यह पता चला है, उस सूचकांक को DEPT
. पर परिभाषित किया गया है तालिका भी है, इसलिए मुझे पता है कि केवल EMP
और DEPT
SCOTT
में टेबल स्कीमा क्वेरी में शामिल होने जा रहे हैं।