sql >> Database >  >> RDS >> Oracle

Tabelnamen ontleden uit een aantal SQL-instructies

Als ik het was, zou ik de neiging hebben om het probleem op een andere manier te benaderen. In plaats van een SQL-parser te schrijven (waarvoor veel meer nodig is dan een reguliere expressie, tenzij je kunt garanderen dat alle SQL-instructies een zeer kleine subset van de beschikbare SQL-grammatica gebruiken), zou ik de neiging hebben om een ​​queryplan voor elk object te genereren en dan query PLAN_TABLE om de objecten te zien die Oracle moet raken. U moet een extra zoekactie uitvoeren voor toegang tot de index om erachter te komen in welke tabel de index is gedefinieerd, maar dat zou redelijk eenvoudig moeten zijn.

Als u dit pad volgt, haalt u echter de basistabellen op die uw query daadwerkelijk raakt, in plaats van naar de weergaven waarnaar de query's daadwerkelijk verwijzen. Dat wil zeggen, als je een zoekopdracht hebt SELECT * FROM view_1 en view_1 , op zijn beurt, wordt gedefinieerd als een zoekopdracht tegen table_a en table_b , alleen table_a en table_b zal deel uitmaken van het plan. En je zou query_rewrite moeten uitschakelen voor de sessie als u wilt voorkomen dat de queryplannen verwijzen naar gerealiseerde weergaven als die gerealiseerde weergaven niet specifiek deel uitmaakten van de zoekopdracht.

Als u voor elke zoekopdracht een

EXPLAIN PLAN FOR <<the query>>

je kunt dan

SELECT DISTINCT object_owner, object_name, object_type
  FROM plan_table

om de lijst met objecten te krijgen. Als OBJECT_TYPE is als INDEX% , kunt u vervolgens de DBA_INDEXES bekijken (of ALL_INDEXES of USER_INDEXES afhankelijk van wie eigenaar is van de objecten in kwestie en welk niveau van privileges u heeft) om te bepalen in welke tabel die index is gedefinieerd

SELECT table_owner, table_name
  FROM dba_indexes
 WHERE owner = <<object_owner from plan_table>>
   AND index_name = <<object_name from plan_table>>

Dus als ik bijvoorbeeld een weergave heb view_1

 create or replace view view_1
 as
 select *
   from emp join dept using (deptno)

en een vraag

select * from view_1;

Ik kan doen

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

Dit vertelt me ​​​​dat de zoekopdracht daadwerkelijk de EMP . bereikt en DEPT tafels. Het raakt ook de PK_DEPT index zodat ik kan kijken om te zien op welke tabel die is gedefinieerd.

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

Het blijkt dat die index is gedefinieerd op de DEPT tabel ook, dus ik weet dat alleen de EMP en DEPT tabellen in de SCOTT schema worden betrokken bij de zoekopdracht.




  1. Vind ongeldige datums in SQL Server 2008

  2. Hoe vergelijk ik 2 rijen uit dezelfde tabel (SQL Server)?

  3. Wat is het ideale gegevenstype om te gebruiken bij het opslaan van breedtegraad / lengtegraad in een MySQL-database?

  4. Mysql-databasesynchronisatie tussen twee databases