Caractéristiques cachées dans Oracle

j'ai apprécié les réponses et les questions sur fonctionnalités cachées dans le serveur sql

Que pouvez-vous nous dire sur Oracle?

Tables cachées, fonctionnement interne de ..., secret stocké procs, paquet qui a de bonnes Utilités...

24
demandé sur Peter Gfader 2008-12-19 18:12:55

21 réponses

comme Apex fait maintenant partie de chaque base de données Oracle, ces fonctions d'utilité Apex sont utiles même si vous n'utilisez pas Apex:

SQL> declare
  2    v_array apex_application_global.vc_arr2;
  3    v_string varchar2(2000);
  4  begin
  5  
  6    -- Convert delimited string to array
  7    v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ',');
  8    for i in 1..v_array.count
  9    loop
 10      dbms_output.put_line(v_array(i));
 11    end loop;
 12  
 13    -- Convert array to delimited string
 14    v_string := apex_util.table_to_string(v_array,'|');
 15    dbms_output.put_line(v_string);
 16  end;
 17  /
alpha
beta
gamma
delta
alpha|beta|gamma|delta

PL/SQL procedure successfully completed.
15
répondu Tony Andrews 2008-12-19 15:57:17

" les scanners complets ne sont pas toujours mauvais. Les indices ne sont pas toujours bons."

une méthode d'accès basée sur un index est moins efficace pour lire des lignes qu'un balayage complet lorsque vous la mesurez en termes de lignes accédées par unité de travail (généralement par lecture logique). Cependant, de nombreux outils interpréteront un balayage complet de la table comme un signe d'inefficacité.

prenez un exemple où vous lisez quelques centaines de factures frmo une table de facture et la recherche d'un paiement méthode dans une petite table de recherche. L'utilisation d'un index pour sonder la table de recherche pour chaque facture signifie probablement trois ou quatre io logiques par facture. Cependant, un balayage complet de la table de recherche en préparation pour une jointure de hachage à partir des données de facture ne nécessiterait probablement que quelques lectures logiques, et la jointure de hachage lui-même serait cmoplete en mémoire à presque aucun coût du tout.

cependant beaucoup d'outils regarderaient cela et verraient "full table scan", et vous diraient d'essayer d'utiliser un index. Si vous le faites, vous venez peut-être de désaxer votre code.

incidemment une dépendance excessive sur les index, comme dans l'exemple ci-dessus, provoque une augmentation du" taux de réponse du Cache tampon". C'est pourquoi le BCHR est surtout absurde comme prédicteur de l'efficacité du système.

12
répondu David Aldridge 2008-12-23 17:39:45

l'indice de cardinalité n'est généralement pas documenté.

 explain plan for
 select /*+ cardinality(@inner 5000) */ *
 from   (select /*+ qb_name(inner) */ * from dual)
 /
 select * from table(dbms_xplan.display)
 /
 --------------------------------------------------------------------------
 | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
 --------------------------------------------------------------------------
 |   0 | SELECT STATEMENT  |      |  5000 | 10000 |     2   (0)| 00:00:01 |
 |   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
 --------------------------------------------------------------------------
9
répondu David Aldridge 2008-12-19 17:32:30

le taux de succès du Cache tampon n'a pratiquement aucun sens en tant que prédicteur de l'efficacité du système

8
répondu David Aldridge 2008-12-23 17:40:19

vous pouvez visualiser les données d'une table à partir d'une heure précédente en utilisant la requête Flashback, avec certaines limitations.

Select *
  from my_table as of timestamp(timestamp '2008-12-01 15:21:13')

11g a une toute nouvelle caractéristique placée autour de préserver les changements historiques plus fermement.

8
répondu David Aldridge 2008-12-23 17:43:28

la reconstruction fréquente des indices est presque toujours une perte de temps.

7
répondu David Aldridge 2008-12-23 17:40:58

wm_concat fonctionne comme le MySql group_concat, mais il n'est pas documenté.

avec données:

-car-   -maker-
Corvette Chevy
Taurus   Ford
Impala   Chevy
Aveo     Chevy

select wm_concat(car) Cars, maker from cars
group by maker

vous donne:

-Cars-                   -maker-
Corvette, Impala, Aveo   Chevy
Taurus                   Ford
7
répondu jle 2010-03-26 19:10:43
6
répondu David Aldridge 2008-12-19 17:33:08

je viens d'apprendre pour la pseudo-colonne Ora_rowSCN. Si vous ne configurez pas votre table pour cela, ce pcolumn vous donne le bloc SCN. Cela pourrait être très utile pour l'urgence, " oh merde, je n'ai pas d'audit sur cette table et je me demande si quelqu'un a changé les données depuis hier."

mais encore mieux est si vous créez la table avec Rowdependecies sur. Cela met le SCN du dernier changement sur chaque ligne. Cela vous aidera à éviter un problème "D'édition perdue" sans devoir inclure chaque colonne dans votre requête.

IOW, lorsque vous saisissez une ligne pour modifier l'utilisateur, sélectionnez également Ora_rowscn. Ensuite, lorsque vous postez les modifications de l'utilisateur, incluez Ora_rowscn = v_rscn en plus de la clé unique dans la clause where. Si quelqu'un a touché la ligne depuis que vous l'avez saisi, aka lost edit, la mise à jour correspondra à zéro ligne puisque l'ora_rowscn aura changé.

trop cool.

5
répondu Mark Brady 2008-12-23 17:25:11

si vous obtenez la valeur de PASSWORD colonne sur DBA_USERS vous pouvez sauvegarder/restaurer des mots de passe sans les connaître:

 ALTER USER xxx IDENTIFIED BY VALUES 'xxxx';
4
répondu FerranB 2009-02-26 23:50:46

contourne le cache tampon et lit directement à partir du disque en utilisant des lectures de chemin direct.

alter session set "_serial_direct_read"=true;

provoque un checkpoint tablespace (9i) ou fast object (10g+), donc prudent sur les systèmes OLTP occupés.

3
répondu David Aldridge 2008-12-19 17:27:57

plus de trucs sans papiers à http://awads.net/wp/tag/undocumented/

attention: utilisez à vos risques et périls.

3
répondu Eddie Awad 2008-12-19 18:44:55

Je ne sais pas si cela compte comme caché, mais j'ai été assez heureux quand j'ai vu cette façon de voir rapidement ce qui s'est passé avec une déclaration SQL que vous accordez.

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL;

SELECT * FROM TABLE(dbms_xplan.display_cursor( NULL, NULL, 'RUNSTATS_LAST'))
;

PLAN_TABLE_OUTPUT
-----------------------------------------------------
SQL_ID  5z36y0tq909a8, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL

Plan hash value: 272002086

---------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------
|   1 |  TABLE ACCESS FULL| DUAL |      1 |      1 |      1 |00:00:00.02 |       3 |      2 |
---------------------------------------------------------------------------------------------


12 rows selected.

où:

  • les lignes E sont des lignes estimées.
  • A-Lignes lignes réelles.
  • Un Temps est le temps réel.
  • Les tampons
  • sont des tampons réels.

où le plan estimé varie de l'exécution réelle par ordres de grandeur, vous savez que vous avez des problèmes.

3
répondu WW. 2009-07-27 23:03:13

N'est pas une fonctionnalité cachée, mais Finegrained-access-control (FGAC), aussi connu sous le nom de row-level security, est quelque chose que j'ai utilisé dans le passé et a été impressionné par l'efficacité de sa mise en œuvre. Si vous cherchez quelque chose qui garantit que vous pouvez contrôler la granularité de la façon dont les lignes sont exposées aux utilisateurs avec des permissions différentes - indépendamment de l'application qui est utilisée pour visualiser les données (SQL*Plus ainsi que votre application web) - alors cela un bijou.

le l'indexation intégrée en texte intégral est plus largement documentée, mais se distingue toujours par sa stabilité (essayez juste d'exécuter une réindexation complète de colonnes indexées en texte intégral sur des échantillons de données similaires sur MS-SQL et Oracle et vous verrez la différence de vitesse).

3
répondu davek 2009-11-02 20:03:59
3
répondu priyanka.sarkar 2010-01-02 10:11:02

Instantané des tables. Également trouvé dans Oracle Lite, et extrêmement utile pour rouler votre propre mécanisme de réplication.

2
répondu MusiGenesis 2008-12-19 15:35:33

@Pierre

vous pouvez en fait lier une variable de type" curseur " dans TOAD, puis l'utiliser dans votre déclaration et il affichera les résultats dans la grille de résultats.

exec open :cur for select * from dual;
2
répondu Chris R. Donnelly 2017-05-23 12:03:00

Q: Comment appeler un stocké avec un curseur de crapaud?

A: exemple, changez le curseur, le nom de paquet et le nom proc enregistré

declare cursor PCK_UTILS.typ_cursor;  

begin   
    PCK_UTILS.spc_get_encodedstring(  
        'U',  
        10000002,  
        null,  
        'none',  
        cursor);  
end;
1
répondu Peter Gfader 2008-12-19 15:25:56

Le Modèle de Clause (disponible pour Oracle 10g et plus)

1
répondu Doug Porter 2010-01-20 15:25:18

WM_CONCAT pour l'agrégation de chaîne

1
répondu priyanka.sarkar 2011-10-19 02:33:06

sous-requête Scalaire de la mise en cache est l'un des plus caractéristiques surprenantes dans Oracle

-- my_function is NOT deterministic but it is cached!
select t.x, t.y, (select my_function(t.x) from dual)
from t

-- logically equivalent to this, uncached
select t.x, t.y, my_function(t.x) from t

le sous-jeu "caching" ci-dessus évalue my_function(t.x) une seule fois par valeur unique de t.x . Si vous avez de grandes partitions de la même valeur t.x , cela accélérera immensément vos requêtes, même si my_function est et non déclaré DETERMINISTIC . Même si c'était DETERMINISTIC , vous pouvez vous peut-être un commutateur de contexte SQL - > PL/SQL coûteux.

bien sûr, si my_function n'est pas une fonction déterministe, alors cela peut conduire à des résultats faux, donc soyez prudent!

1
répondu Lukas Eder 2012-04-18 12:02:45