6f429244e498457b8400e72e4af683b0 Alberto Blog: all_object - strange issue in Oracle 11GR2

venerdì 4 ottobre 2013

all_object - strange issue in Oracle 11GR2

Nei giorni scorsi mi sono trovato ad indagare per un problema strano.
Gli utenti mi dicevano che quando tentavano di collegare alcune tabelle Oracle tramite l'applicativo MSAccess via ODBC, l'applicazione impiegava diversi minuti, poi andava in time-out.
Come prima risoluzione ho tolto il time-out via ODBC e così ho fatto in modo che non andasse più in time-out, ma impiegava 10 min e più, prima di presentare tutti gli oggetti del DB, per scegliere la tabella desiderata.
Ho cominciato ad indagare e ho visto che per effettuare questa operazione con MSAccess lanciava questa query:

SELECT

        *

    FROM

        (

            SELECT

                    NULL table_qualifier

                    ,o1.owner table_owner

                    ,o1.object_name table_name

                    ,decode (

                        o1.owner

                        ,'SYS'

                        ,decode (

                            o1.object_type

                            ,'TABLE'

                            ,'SYSTEM TABLE'

                            ,'VIEW'

                            ,'SYSTEM VIEW'

                            ,o1.object_type

                        )

                        ,'SYSTEM'

                        ,decode (

                            o1.object_type

                            ,'TABLE'

                            ,'SYSTEM TABLE'

                            ,'VIEW'

                            ,'SYSTEM VIEW'

                            ,o1.object_type

                        )

                        ,o1.object_type

                    ) table_type

                    ,NULL remarks

                FROM

                    all_objects o1

                WHERE

                    o1.object_type IN (

                        'TABLE'

                        ,'VIEW'

                    )

            UNION

            SELECT

                    NULL table_qualifier

                    ,s.owner table_owner

                    ,s.synonym_name table_name

                    ,'SYNONYM' table_type

                    ,NULL remarks

                FROM

                    all_objects o3

                    ,all_synonyms s

                WHERE

                    o3.object_type IN (

                        'TABLE'

                        ,'VIEW'

                    )

                    AND s.table_owner = o3.owner

                    AND s.table_name = o3.object_name

            UNION

            SELECT

                    NULL table_qualifier

                    ,s1.owner table_owner

                    ,s1.synonym_name table_name

                    ,'SYNONYM' table_type

                    ,NULL remarks

                FROM

                    all_synonyms s1

                WHERE

                    s1.db_link IS NOT NULL

        ) tables

    WHERE

        1 = 1

        AND (

            table_type = 'TABLE'

            OR table_type = 'SYSTEM TABLE'

            OR table_type = 'VIEW'

            OR table_type = 'SYNONYM'

        )

    ORDER BY

        4

        ,2

        ,3;

       



Ho provato a lanciarla da Sql Developer per verificare lo stesso comportamento.
Stesso comportamento, anche da altri tools.
Questa query ci impiega veramente più di 10 min per essere eseguita.
All'inizio pensavo che fosse in relazione anche alle statistiche del Data Dictionary e quindi ho lanciato:

DBMS_STATS.GATHER_DICTIONARY_STATS;


ma le performance rimanevano inalterate ossia scadenti.

Ho verificato nel metalink e ci sono diverse Note che riguardano l'eccessiva lentezza di questo oggetto, ma riguardavano le versioni precedenti alla mia ( 11.2.0.3.0).

Ho trovato però questa nota ,Compilation Against a 11g Database Hangs or Takes a Very Long Time (Doc ID 880660.1) inerente Oracle Form, ma verificando bene ho notato che la query usata da questo Doc Id non era molto diversa da quella mia.
Lasciando un attimo da parte la patch da installare visto che riguardava Form, ho provato con il workaround proposto ossia:

create synonym all_objects for sys.dba_objects;


nello schema di competenza dell'utente che doveva collegare le tabelle tramite MSAccess.

Dopo la creazione di questo synonym la query  impiega circa 2 sec per essere eseguita, sia da MSAccess via ODBC che da Sql Developer.
Strano comportamento....


Nessun commento:

Posta un commento