2009-11-29 6 views
1

Comment oracle CACHE une requête (SQL), l'exécution de requête contient les étapes suivantes. 1. parse 2. Exécuter 3. FetchCACHE de SQL dans Oracle

en oracle vérifie première étape si la requête existe dans CACHE (Shared Pool) ou non (Il sera existe si la requête est identique et sur la base LRU), si elle existe alors PARSING sera ignoré et l'exécution commencera. Donc, pour rendre les requêtes performantes, nous devons utiliser des variables bind et utiliser les mêmes requêtes sql. Mais dans Parsing Oracle vérifie également l'authentification (Accès Utilisateur), si plusieurs utilisateurs utilisent la même requête, comment Oracle ignore/utilise l'analyse syntaxique?

Répondre

2

L'analyse d'une requête n'est pas liée à un utilisateur, elle dépend de la requête. Notez qu'un caractère exact pour la correspondance de caractères est requis. Les espaces et les commentaires dans une requête entraîneront l'échec de la correspondance du pool partagé. L'arborescence de l'analyse est ensuite utilisée dans la génération d'un plan d'exécution.

Si le même schéma est utilisé dans la nouvelle requête en tant que requête correspondante, le plan d'exécution existant est utilisé.

Vous pouvez tester cela en créant plusieurs schémas, un avec une petite quantité de données et un avec un grand montant. Ensuite, analysez toutes les tables. Jetez un oeil aux plans d'exécution pour la même requête avec des quantités de données très différentes. Cela montrera les différents plans d'exécution pour la même requête.

Maintenant, exécutez la requête un grand nombre de fois et vérifiez le temps qu'il faut pour la première , puis les exécutions suivantes. Utilisez Oracle Trace et regardez dans la douleur de la main gauche pour la fréquence "Re-Parse" . Cela peut également être glané à partir de certaines tables du dictionnaire.

Jetez un oeil à The Oracle documentation on using Oracle Trace

+0

+1: Les rats, battez-moi! –

+0

Si vous avez besoin de plus de détails ou si vous voulez obtenir plus de détails, veuillez demander dans les commentaires. Je ferai de mon mieux pour vous aider. –

+1

La requête est liée au nom du schéma d'analyse et à l'utilisateur de la session. Donc, user_a peut faire une ALTER SESSION SET CURRENT_SCHEMA = USER_B et exécuter SELECT * FROM EXAMPLE. La requête recherche des tables/vues/synonymes pour EXAMPLE dans USER_B mais vérifie également si USER_A a des privilèges sur ces objets. Il peut y avoir plusieurs SQL avec un texte identique qui fait référence à des objets ayant le même nom dans différents schémas. –

0

La pratique habituelle dans Oracle est de créer des procédures stockées avec droits définitifs ce qui signifie que les requêtes sont exécutées avec les privilèges de leur définisseur, en dépit de qui les appelle. C'est pourquoi le cache fonctionne bien.

Si vous créez une procédure ou un package avec droits d'invocateur (authid current_user), les requêtes seront analysées séparément pour chaque demandeur. Pour plus de détails, voir Invoker Rights Versus Definer Rights.

+0

Ce n'est pas sur une requête dans la procédure/fonction/package, sa simple instruction select –

+0

simple instruction select équivaut à Invocateur cas des droits. Lorsque deux utilisateurs différents émettent des requêtes identiques, cette requête sera analysée deux fois. Vous pouvez trouver deux lignes dans V $ SQL pour cette requête, ayant les mêmes sql_text et sql_id, mais parsing_schema_name. –

+0

J'avais tort. Si deux requêtes sont sintactiquement et sémantiquement égales (à savoir les deux utilisent les mêmes tables), la requête ne sera analysée qu'une seule fois. –

1

contrôles de premier oracle étape si la requête existe dans CACHE (Shared Pool) ou non (Il sera existe si la requête est identique et sur la base LRU), si elle existe Parsing alors volonté être sauté et l'exécution commencera. Donc, pour rendre les requêtes plus performantes, nous devons utiliser des variables bind et utiliser les requêtes sql identiques.

Ce processus est réel lorsque vous exécutez une requête sur Oracle:

  1. Parsing étapes
    1. Vérification de la syntaxe
    2. Analyse sémantique
    3. a-t la requête été exécutée dans une autre séance ?
  2. dur Parse
    1. Parse
    2. Optimize
    3. Générer le plan pour la requête.

Si la réponse à # 1.3 est oui - Oracle ignore la partie d'analyse syntaxique dur, et utilise le plan de requête existant.

Pour plus d'informations:
* AskTom: Difference between soft parse and hard parse
* Bind variables - The key to application performance