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

एक गुच्छा एसक्यूएल स्टेटमेंट से पार्स टेबल नाम

क्या यह मैं था, मैं समस्या को एक अलग तरीके से देखने की कोशिश करता। एक 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 में टेबल स्कीमा क्वेरी में शामिल होने जा रहे हैं।




  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. थोक संग्रह ... सभी उपयोग के लिए

  3. EntityFramework कोड पहला Oracle

  4. उन पंक्तियों को ढूँढना जिनमें Oracle में संख्यात्मक डेटा नहीं है

  5. ओरेकल:एक सीमा से अधिक समूह कैसे करें?