Note utilisateur: 4 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles activesEtoiles inactives

Une nouveauté sur la 11g est l'apparition de l'ACS pour Adaptive Cursor Sharing. Cette nouvelle fonctionnalité permet de pallier aux problèmes de bind rencontrer sur les requêtes SQL utilisant des paramètres.

Rappel : Il est possible d'utiliser des variables ou des litéraux dans les requêtes. Les litéraux sont des valeurs en dur dans la requête (type='manager' par exemple). Chaque requête génère alors un plan potentiellement différent pour chaque valeur du litéral. Plus le nombre requête avec des valeurs différentes est important plus la consommation mémoire dans le sharepool est importante.

De plus le calcul d'un nouveau plan (hard parse) est très couteux en CPU. Pour pallier cette problématique, l'utilisation des variables dans les requêtes permet de limiter ce problème car un seul plan est déterminé par l'optimiseur et les valeurs. Les requêtes suivantes vont reprendre le plan calculé (soft parse). Le problème c'est que le premier plan calculer n'est pas forcement le plus optimal suivant les valeurs utilisées pour chaque variable.

Un paramètre d'initialisation : CURSOR_SHARING pouvait prendre plusieurs valeurs et le comportement de l'optimiseur est différent suivant qu'il y ai ou non des histogrammes sur les colonnes :

Prenons un exemple de requête :

SELECT * FROM emp WHERE TYPE='Manager'
CURSOR_SHARING Consommation Mémoire Performance de la requête Comportement de l'optimiseur
EXACT La plus forte (chaque requête a son propre curseur) la meilleure (chaque requête a son propre plan, optimal pour les litéraux utilisés)

l'optimiseur vous la requête tel quelle (qu'il y ai ou non des histogrammes)
--> where type='Manager'

FORCE La meilleure (la plus réduite possible) potentiellement le pire, l'optimiseur forcant l'utilisation de variable et ne calculant alors qu'un seul plan. l'optimiseur force le remplacement du ou des litéraux par des variables (qu'il y ai ou non des histogrammes)
--> where type=:a
SIMILAR sans Histo La meilleure (la plus réduite possible) potentiellement le pire, l'optimiseur forcant l'utilisation de variable et ne calculant alors qu'un seul plan. Le fait qu'il n'y ai pas d'histogramme indique pour l'optimiseur que la colonne est répartie de manière équitable (not skew = pas de biais), il va donc utiliser le remplacement de la ou les variables
--> where type=:a
SIMILAR avec Histo Pas autant que le mode EXACT mais assez proche tout de même la meilleure (chaque requête a son propre plan, optimal pour les litéraux utilisés)  Pour l'optimiseur le fait qu'il y ai un histogramme lui indique que la colonne contient des données non uniformement distribuées (les valeurs peuvent influencer le plan). Dans ce cas, il n'opére pas de modification de la requête.
--> where type='Manager'

 Avec l'ACS, le comportement de l'optimiseur est un peut plus complexe :

Commentaire (0) Clics: 5470

Note utilisateur: 4 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles activesEtoiles inactives

Excel est un excellent tableur. Pourtant contrairement à une base de données, il est plus difficile d'y faire une jointure.

La jointure en base de données permet (entre autre) de récupérer un ou plusieurs champs d'une (ou plusieurs) autre table que la table principale.

Dans excel la table principale est un tableau et les autres tables périphériques d'autres tableaux.

La fonction RECHERCHEV est une fonction excel qui permet de récupérer des informations d'autres tableaux et donc de faire une "jointure" dans excel.

A partir du tableau d'origine une cellule appelle la fonction RECHERCHEV qui va rechercher la présence d'un élement du tableau original dans un autre tableau. Les tableaux n'ont pas nécessairement la même taille (ni en nombre de lignes ni en nombre de colonnes).

Exemple :

Commentaire (0) Clics: 12076

Note utilisateur: 4 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles activesEtoiles inactives

Dans excel, j'ai toujours trouvé qu'il y avait un manque cruel de la fonction de comptage des éléments distinct d'une plage.

Une petite fonction utilisateur est donc nécessaire pour pallier ce manque.

voici le code de cette fonction :

Function NbValUniques(laPlage As Range)
Dim ValeursUniques As New Collection
On Error Resume Next
For Each cell In laPlage
ValeursUniques.Add cell.Value, CStr(cell.Value)
Next cell
On Error GoTo 0
NbValUniques = ValeursUniques.Count
End Function

Il suffit alors d'appeller cette fonction comme n'importe quelle autre depuis une cellule excel et de définir la plage des éléments à compter :

 

Commentaire (0) Clics: 4793

Note utilisateur: 0 / 5

Etoiles inactivesEtoiles inactivesEtoiles inactivesEtoiles inactivesEtoiles inactives

With Excel, I had always found that there was a crual leak with functions : no count distinct !

A simple user function could help to fill the gap.

 

Here is the code :

Function NbValUniques(laPlage As Range)
Dim ValeursUniques As New Collection
On Error Resume Next
For Each cell In laPlage
ValeursUniques.Add cell.Value, CStr(cell.Value)
Next cell
On Error GoTo 0
NbValUniques = ValeursUniques.Count
End Function

You just have to call the function like any other function from a cell and define the range that you would like to count :

 

Commentaire (0) Clics: 3126

Sous-catégories

Des tutoriaux et cours gratuits sur Oracle

Articles traitant de l'intégration de données

Tutoriaux sur Unix et les shells scripts