sql >> Databáze >  >> RDS >> Oracle

Analyzujte názvy tabulek z mnoha příkazů SQL

Kdybych to byl já, měl bych tendenci snažit se k problému přistupovat jinak. Spíše než psát analyzátor SQL (což by vyžadovalo mnohem více než regulární výraz, pokud nemůžete zaručit, že všechny příkazy SQL používají velmi malou podmnožinu dostupné gramatiky SQL), měl bych tendenci generovat plán dotazů pro každý objekt a poté dotaz PLAN_TABLE vidět objekty, které musí Oracle zasáhnout. Budete muset provést další vyhledávání přístupů k indexu, abyste zjistili, ve které tabulce je index definován, ale to by mělo být poměrně jednoduché.

Pokud se však vydáte touto cestou, budete získávat základní tabulky, kterých se váš dotaz ve skutečnosti dotýká, spíše než jakékoli pohledy, na které mohou dotazy ve skutečnosti odkazovat. Tedy pokud máte dotaz SELECT * FROM view_1 a view_1 , je zase definován jako dotaz proti table_a a table_b , pouze table_a a table_b bude součástí plánu. A budete muset vypnout query_rewrite pro relaci, pokud jste chtěli zabránit tomu, aby plány dotazů odkazovaly na materializované pohledy, pokud tyto materializované pohledy nebyly konkrétně součástí dotazu.

Pokud pro každý dotaz provedete

EXPLAIN PLAN FOR <<the query>>

pak můžete

SELECT DISTINCT object_owner, object_name, object_type
  FROM plan_table

získat seznam objektů. Pokud OBJECT_TYPE je jako INDEX% , pak můžete použít DBA_INDEXES zobrazení (nebo ALL_INDEXES nebo USER_INDEXES v závislosti na tom, kdo vlastní příslušné objekty a jakou úroveň oprávnění máte), abyste určili, ve které tabulce je tento index definován

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

Pokud tedy mám například pohled view_1

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

a dotaz

select * from view_1;

Mohu udělat

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

To mi říká, že dotaz ve skutečnosti zasahuje do EMP a DEPT tabulky. Naráží také na PK_DEPT index, abych se mohl podívat, na jaké tabulce je definován.

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

Jak se ukázalo, tento index je definován na DEPT tabulka také, takže vím, že pouze EMP a DEPT tabulky v SCOTT schéma budou zapojena do dotazu.




  1. Získejte všechny názvy tabulek, názvy sloupců a hodnoty sloupců ze specifické databáze

  2. automatizovat dotaz SQL tak, aby se spouštěl každý měsíc

  3. SQL Server Lock Eskalace

  4. Nelze načíst DLL 'SqlServerSpatial.dll'