Rechercher sur arkzoyd.com

30 mai 2011

Requêtes Parallèles, Partie 2/2 : Mise en file d'attente

Parmis les nouveautés de la version 11.2.0.2, vous pouvez mettre en attente des requêtes en parallèle lorsqu'un certain nombre de processus est utilisé. Grâce à la gestion automatique du parallèlisme et resource manager, les requêtes qui sont dégradées en série en gestion manuelle, sont mises en files d'attente pour être traitées en parallèle dès que possible en mode automatique. Pour bien comprendre de quoi il s'agit, commencez par lire Requêtes Parallèles, Partie 1/2 : Downgrade en Série qui présente la sérialisation des requêtes parallèles. Mais revenons au sujet...

L'intérêt de cette fonctionnalité est évident. Prenons un exemple :
  • Supposons que notre base de données n'exécute qu'une seule typologie de requêtes : des rapports,
  • Disons que notre requête type s'exécute avec un parallèlisme de 16 en 5 minutes et qu'en série, elle prend 1 heure,
  • Imaginons que notre système puisse exécuter un maximum de 4 requêtes simultanément sans dégrader les performances du système. Pour assurer le meilleur parallèlisme, vous aurez activé 128 processus parallèles
Avec cet exemple, si, en moyenne, il y a 1 rapports exécuté toutes les 5 minutes mais que pendant certains pics, vous pouvez aller jusqu'à 5 ou 6 rapports exécutés simultanément... Vous voyez où je veux en venir ?

Requêtes Parallèles, Partie 1/2 : Downgrade en Série

Parmis les nouveautés de la version 11.2.0.2, vous pouvez mettre en attente des requêtes en parallèle lorsque les processus parallèles sont épuisés plutôt que de les exécuter en série. Dans la seconde partie de cet article, je vous propose d'illustrer cette nouvelle fonctionnalité.

Mais avant ça, nous allons illustrer comment une requête en parallèle est exécutée en série. Vous verrez également que le plan, même capturé dans la shared pool, s'affiche avec un DOP qui n'est pas celui d'un plan en série...

28 mai 2011

Amazon RDS (Relational Database Service) est disponible pour Oracle

Ca y est, Amazon RDS supporte Oracle 11g ; vous pourrez désormais provisionner vos serveurs ! 2 modèles de facturation sont disponibles pour le même type de services :
  • "Bring Your Own Licenses" supporte les versions EE, SE et SE1 et nécessite, comme son nom l'indique, vos propres licences vos bases de données par ailleurs en mode "full use" ou "term license"
  • "License Included" ne supporte que la version Standard Edition One mais permet de payer vos licences Oracle à l'heure

Télécharger les logiciels Oracle depuis OTN et MOS avec WGET

Il est toujours possible de télécharger les logiciels Oracle avec WGET. Oracle a, certes, fait un récent changement mais ils n'ont pas interdit son utilisation, bien au contraire... Ils fournissent eux-même le script sur My Oracle Support.

Qu'est-ce qui a changé ? L'agent du navigateur est désormais contrôlé. Pour contourner ce contrôle, il suffit donc d'ajouter l'option --user-agent="Mozilla/5.0" à vos anciens scripts.

Si vous n'avez jamais utilisé WGET et que vous rêvez de lancer un téléchargement sur vos serveurs avant d'éteindre votre PC avec la commande nohup ou screen. Ou encore que vous voulez éviter de transporter des fichiers de machines en machines, voici comment faire...

Transitivité des contraintes CHECK ou quand les tables stockées dans SYS n'obéissent pas aux mêmes règles !

Les contraintes CHECK, comme les autres contraintes donnent des informations à l'optimiseur pour résoudre les plans d'exécutions. Cependant, du fait de la manière dont Oracle estime les cardinalités avec des fonctions cela peut poser des problèmes. Jonathan Lewis donne un exemple intéressant sur son blog. De ce fait, en fonction des versions et des cas d'utilisation, Oracle tire partie ou pas de ces contraintes...

Autremennt dit, la manière dont les prédicats associés aux contraintes CHECK sont poussés dans les opérations des plans d'exécution dépend d'un certain nombre de facteurs et notamment :
  • Si la colonne testée implique directement la colonnes sur laquelle il y a une contrainte CHECK ou, par transitivité, une autre colonne
  • Si la condition de test est contradictoire avec la contrainte
  • Si le propriétaire de la table incriminée est SYS ou un autre utilisateur
Cet article présente plusieurs exemples de plans mettant en oeuvre une contrainte CHECK pour accompagner vos réflexions. Et si vous n'êtes pas satisfait du comportement d'Oracle, vous pouvez toujours utiliser la Note [ID 271999.1] "Disable generation of predicates from CHECK constraints"

26 mai 2011

TDE : chiffrées sur disque, déchiffrées dans la SGA

L'utilisation de tables dans les tablespaces chiffrés avec transparent data encryption (aka TDE) ne fonctionne pas du tout comme la compression ! En effet, alors qu'avec la compression, les blocs compressés sont manipulés compressés dans le buffer cache, ce n'est pas le cas avec le chiffrement au niveau du tablespace ; les blocs chiffrés sur disques sont déchiffrés systématiquement dans la SGA. Cet article, met en évidence ce point.

Quelle différence cela fait-il ? Une grosse en fait... En effet, lorsque vous chiffrez des données au niveau d'une colonne, les données indexées ne peuvent pas être accédées dans un index avec un INDEX RANGE SCAN. Dans le cas du chiffrement d'un tablespace, au contraire, tous les algorithmes associés aux plans d'exécutions restent identiques...

22 mai 2011

Oracle Database 11.2.0.2 : Online Patch devient réel

Si vous lisez la documentation ou de certains blogs bien choisis comme celui de Laurent Schneider, vous savez qu'Oracle promet de livrer des patchs online depuis la version 11.1.0.6. Cela dit entre la promesse et la réalité, il aura fallu attendre de long mois.

La note MOS "761111.1 RDBMS Online Patching Aka Hot Patching" indique en effet "It will be delivered starting with RDBMS 11.2.0.2.0.". Et de fait, lorsque vous regardez les patchs 11.2.0.2, ce qui restait une théorie une possibilité devient réel ; voici quelques exemples réels de patchs online réels :
  • 9912965: LRG9H32: GTX DIES WITH ORA-00600 [KJUSCL:!FREE]
  • 9943960: "TTX ID1: %X ID2: %X RET: %D WAITOPT: %D"MESSAGE IN TRACE FILE
  • 10188727 - Dump (kkeidc) from parallel nested loops on REFERENCE partitioned table
Voici quelques notes à propos de l'application des "patchs online" ou "hot patches"

21 mai 2011

Installer Oracle 11.2 sur Ubuntu 11.04 x64

Nouveau laptop signifie nouvelle installation d'Oracle sur une autre version d'Ubuntu ! Natty Narwhal installé en 64 bits et les autocollants décollés, vous êtes prêt à commencer. La note de Don Seiler à propos de l'installation d'Oracle 11.2 sur Ubuntu 10.04 s'applique quasiment à la lettre.

Cet article en reprend les grandes étapes avec, quand c'est possible, des raccourcis. Evidemment, il y a toujours quelques "nouveaux" problèmes. Lisez bien les fichiers de log. Ce qui suit référence toutes les difficultés de la version Oracle sur Ubuntu x64...

16 mai 2011

Cas dégénéré de jointure externe multi-colonnes à moitié cuisinée

Il y a quelques jours, on m'a présenté un cas dégénéré de jointure externe multi-colonnes à moitié cuisinée. Si vous êtes intéressé par ces singularités de développeurs, qui ne signifient rien, regardez l'excellent article de Kevin Meade intitulé Common errors seen when using OUTER-JOIN, vous y découvrirez quelques "bonnes" idées... ou pas.

Celà étant, le cas dont il s'agit est d'autant plus intéressant qu'il prévient l'élimination de partitions. Je vous propose donc dans cet article d'illustrer le cas original avant le cas dégénéré.

14 mai 2011

Notifiez les Caches Niveau 2 de vos serveurs d'applications via Streams

Dans certaines circonstances, cacher des données sur un serveur d'applications est plus intéressant que de les interroger quand un utilisateur en a besoin. Les frameworks TopLink/EclipseLink ou Hibernate implémentent des caches dit de "niveau 2" depuis plusieurs années déjà... Dans le cas d'Hibernate, il existe même plusieurs implémentations de caches disponibles sous la forme de plug-ins. Si vous avez besoin de monter en charge ou d'assurer la disponibilité, il est également possible d'utiliser des caches distribués comme Coherence, avec TopLink ou avec Hibernate et de monter ainsi plusieurs instances de caches niveau 2 en clusters.

Ces solutions se généralisent. JPA 2.0 formalise en effet cette gestion de cache à travers la spécification d'un Shared Cache et la définition d'une API standard de gestion associée. Les mêmes concepts sont développés dans les plateformes .Net avec les différents caches de niveau 2 de N-Hibernate ou le développement de ce type d'approches sur Entity Framework. Seulement voilà, qui dit cache, dit nécessité d'invalider le cache !

En effet, si vous modifiez des données par le biais d'ordres SQL ou via une infrastructure d'intégration qui s'appuie sur un adaptateur SQL, il vous faut retirer les objects correspondants des caches pour anticiper les erreurs qui résulteraient de l'incohérence des données dans vos caches applicatifs et vos bases de données. Dans ce qui suit, vous trouverez une mise en oeuvre simple qui s'appuie sur Streams ; L'intérêt de cette solution réside dans le fait qu'elle ne nécessite pas de licences supplémentaires si vous êtes en version Enterprise Edition et n'impacte pas réellement votre base de données. Evidemment il existe d'autres approches comme XStreams, Goldengate ou Streams Downstream Capture qui ont leur propres avantages, mais c'est une autre histoire...

Continuous Query Notifications : Les résultats de vos requêtes "toujours à jour"

J'étais parti pour expliquer les principes d'utilisation de "Object Continuous Notification (OCN)" et "Query Result Continuous Notification (QRCN)" dans le contexte des caches niveau 2 des serveurs d'applications. Seulement, ça ne marche juste pas ! J'y reviendrai donc avec un exemple basé sur Streams. Alors à quoi servent ces technologies qui permettent, en quelques lignes, de s'abonner aux changements sur une table sur le résultat d'une requête ? "polling"?

Si vous voyez mis en oeuvre du "polling" pour notifier de manière très rapide un système ou un utilisateur, il y a de grandes chances que ce ne soit pas la meilleure approche. Les approches publish/subscribe sont souvent bien plus adaptées. "Continuous Query Notification (CQN)" et ses 2 variantes (OCN et QRCN)" permettent d'adapter très rapidement un algorithme de polling en publish/subscribe sans même que personne ne sache vraiment qu'il s'agisse de publish/subscribe. Alors ça vaut bien l'intérêt d'y passer quelques minutes !

Dans cet article vous trouverez 2 exemples de ces techniques ; pour tout savoir en détail, reportez-vous aux documents suivants :

09 mai 2011

Langue et messages Oracle

Cet exemple est dédié à ceux qui ont toujours rêvé de dire coredump en suédois, en chinois ou en japonais. Vous pouvez utiliser le package utl_lms. Remarquez que vous saurez désormais l'écrire; pas forcément le prononcer...

Qui a dit "ça ne sert à rien" ?

08 mai 2011

"Cursor de (Ref) Cursors" et PL/SQL

A l'opposé des fonctions pipelined, aka fonctions de table, qui retournent l'équivalent du résultat d'une requête à partir d'une fonction et utilisables dans une requête avec la fonction table(), les "Ref Cursor" permettent de manipuler les lignes résultant d'ordres SELECT comme un paramètre que l'on se passe de SQL en PL/SQL à l'aide de la fonction cursor().

Si vous manipulez des données en masse, vous avez probablement joué avec ces 2 outils qui sont d'une élégance rare. Vous savez également que les curseurs ne peuvent pas être manipulés dans des type enregistrements ou collections en PL/SQL. Si vous ne le saviez pas, le code ci-dessous illustre ce point :
create or replace package x is
   type oops is record (r sys_refcursor);
end ;
/

show err

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/4      PL/SQL: Declaration ignored
2/25     PLS-00989: Cursor Variable in record, object, or collection is
         not supported by this release
L'exemple qui suit contourne ce point dans votre code PL/SQL à l'aide d'un EXECUTE IMMEDIATE ... INTO.

SELECT n lignes, n étant ce que tu veux... enfin presque !

Un truc que j'utilise très souvent pour générer un jeu de données est la requête suivante :
select rownum from dual connect by level<=10000;
Cet ordre ramène 10000 lignes et vous pouvez ainsi générer ce qui vous intéresse. Sous la forme d'un INSERT (SELECT) et avec quelques fonctions MOD et RPAD, cette syntaxe permet d'éviter d'écrire du PL/SQL pour générer vos exemples. Si vous lisez ce blog, cette syntaxe ne vous est pas inconnue !

Pourtant cette méthode a ses limites comme vous pouvez vous en apercevoir ci-dessous :

07 mai 2011

Configuration statique Oracle Net et EZCONNECT

Vous trouverez ci-dessous 2 petits mots à propos de l'enregistrement statique des instances et des services dans le listener ainsi que la syntaxe EZCONNECT pour forcer l'utilisation d'une instance.

Comme vous le savez, depuis la fin les années 90 (:-P), il est recommandé de se connecter via un service à vos instances. Le service virtualise l'accès aux instances dans la mesure où vous le publiez depuis le paramètre service_names de l'instance ou avec les commandes srvctl XXX service dans l'infrastructure Grid. L'utilisation d'un service permet :
  • de décorréler les instances et les clients et de mettre en place des mécanismes de reprise automatique ou manuel des instances
  • lorsqu'il est utilisé avec les paramètres remote_listener ou listener_networks, de décorréler le nom du serveur via une adresse virtuelle ou une adresse SCAN du client
  • d'identifier la nature des activités dans une base de données
  • de gérer des priorités dans l'allocation des ressources
  • de distinguer les versions des objets (éditions) que vous utilise
Bref, les services sont un outil parfait pour adresser simplement nombre de configurations réseau.

Réduire l'accès de vos bases de données à certains serveurs

Il y a d'abord la perpétuelle fuite en avant d'Oracle qui donne le sentiment que, quand on commence à être serein sur une version, la suivante débarque. Il y a également la mémoire qui joue des tours lorsqu'on ne pratique pas...

J'avais oublié jusqu'à l'existence du paramètre TCP.VALIDNODE_CHECKING et si je n'avais pas mes notes, je pourrais dire que je ne l'ai jamais su. Si un jour vous n'arrivez pas à démarrer vos listeners à cause d'une erreur très étrange ou si vous voulez restreindre tous les accès à votre base Oracle au serveurs X, Y ou Z, (re)paramétrez la restriction des accès réseaux à Oracle en utilisant les paramètres TCP.* du fichier sqlnet.ora

01 mai 2011

Pourquoi NOT IN est sémantiquement différent de NOT EXISTS ?

Il y a quelques semaines, un peu agacé par une discussion où on m'expliquait, une fois encore, que pour obtenir de meilleures performances il fallait écrire une requête avec une syntaxe plutôt qu'une autre, j'ai écrit un article intitulé NOT EXISTS, NOT IN ou OUTER JOIN, on s'en fout ! Comme Sisyphe avant moi, je sais qu'il faudra que je remonte ma pierre bientôt ; la mienne est faîtes d'idées reçues. La prochaine fois, elle sera juste un peu moins lourde.

L'intérêt des technologies Oracle, c'est que vous ne pouvez pas vraiment vous laisser aller ! Alors que j'avais préparé sur ce blog ma parade, j'ai pris un raccourci. Et bien, c'est quand vous prêtez le flan qu'on vous rentre dedans gentillement.

Donc c'est vrai ! Je me laisse aller à prendre des raccourcis. Pire : je le fais exprès ! Il faut dire, à ma décharge, que le contexte du moment n'était pas exactement à discuter des subtilités de l'optimiseur avec des esprits brillants mais plutôt l'inverse (pourvu qu'ils ne se reconnaissent pas ;-D). Enfin, c'est un mal pour un bien puisque, j'imagine en écho à mon article et sur son blog, Ahmed AANGOUR a écrit SEMI-JOINS : IN vs EXISTS. Dans cet article, il explore avec intelligence un autre cas d'idée reçue et met le doigt sur l'époque de ces changements, c'est à dire la version 8i, grâce au paramètre optimizer_features_enable. Il a un esprit affuté, de la rigueur, des références saines et il ne se laisse pas encore aller comme moi à des concessions. Il doit être jeune ; je ne saurais trop vous conseiller de vous abonner à son blog, les bonnes ressources en français ne sont pas si répandues. Je lui souhaite de continuer à être exigeant.

Mais il m'appartient maintenant d'expliquer mon raccourci ; en quoi les clauses NOT IN et NOT EXISTS sont en réalité différentes et l'astuce que j'ai utilisée sans le dire dans mon article pour les rendre identiques...