Ha enfin du concret... Merci !

Envoyé par
estofilo
Voici ce que j'appelerais les ratés de l'article pré-cité:
- "gestion des espaces de stockage"
aucune mention des fichiers WAL qui justement sont l'espace contigu d'écriture qui est si important. Aucune mention du fait qu'une table ou un index ou les WAL peuvent être placés sur n'importe quelle partition et des disques différents.
N'importe quel SGBDR, sait faire cela ! Mais ce n'est pas de cela que je parle? Relisez bien...
La notion de tablespace PG ne fait qu'indiquer un répertoire. Rien d'autre !
Voici la syntaxe PG (v9.1.1):
CREATE TABLESPACE tablespace_name [ OWNER user_name ] LOCATION 'directory'
Ce que vous ne pouvez pas faire avec PostGreSQL :
1) vous ne pouvez pas indiquer une taille minimale de l'espace de stockage
2) vous ne pouvez pas indiquer une taille maximale de l'espace de stockage
3) vous ne pouvez pas indiquer un pas de croissance de l'espace de stockage
4) vous ne pouvez pas ajouter un autre répertoire a un tablespace déja créé
5) vous ne pouvez pas placer un espace de stockage en READ ONLY pour des tables statiques afin d'éviter le verrouillage
Toutes ces possibilités existent sur Oracle, SQL Server, IBM Db2, Sybase ASE...
Indiquez moi comment vous ferez le jour ou votre tablespace placé sur un disque est saturé ?.
- "une fonction SQL peut encapsuler n'importe quel code SQL du DML".
Comment ça du DML? Les fonctions exécutent aussi du DDL et ce DDL est transactionné. C'est une différence essentielle par rapport aux autres SGBDs.
Désolé, mais Sybase et SQL Server savent transactionner cela depuis l'origine. C'est d’ailleurs ce que la norme SQL exige. Il n'y a que Oracle à ne pas le faire. De là à dire que c'est une différence essentielle....
- "une fonction = une transaction".
Où est le sens de cette affirmation? L'idée c'est qu'une fonction doit impérativement être lancée dans le cadre d'une requête SQL, et pas en-dehors contrairement aux procédures stockées. Du coup une fonction ne peut pas faire un commit ou un rollback, parce qu'on ne fait pas de commit en plein milieu d'une requête. C'est cohérent dans l'architecture. Par contre une fonction peut elle-même lancer des requêtes en tout genre.
Ce qui n'est pas conforme à la norme SQL pour lequel ce qui est procédure doit pouvoir incorporer la gestion des transactions. Mais on pourrait d'ailleurs le dire différemment : PostGreSQL ne sait pas faire de procédures stockées. En effet la norme SQL précise que la fonction ou UDF ne peut pas être transactionnées, car elle doit être appelée dans une requête à linverse, la procédure doit pouvoir incorporer les ordres BEGIN WORK/TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL....
Autrement dit vos propos me confirme ce que j'affirme depuis très longtemps : PostGreSQL ne sait pas faire de procédures stockées !
- "une erreur annule automatiquement une transaction".
Seulement dans certaines circonstances. Dans une fonction il suffit d'un BEGIN.. END pour attraper les erreurs et les gérer sans rien annuler, exemple dans la doc avec le INSERT or UPDATE gérant la violation de clef primaire. Dans du SQL hors fonction on utilise des SAVEPOINT si on veut se prévenir d'une annulation totale de la transaction en cours pour une instruction qui part en erreur. C'est seulement si on fait rien de tout ça qu'une erreur termine sans appel la transaction où elle se produit.
Hors fonction, c'est donc pas dans la fonction. tant que je peut pas faire de COMMIT ou ROLLBACK l'intérêt des routines SQL de PG est très limité !
- l'exemple prétendument "calamiteux" de l'optimiseur qui serait supposé utiliser l'index est fait sur une requête ou l'index n'a pas d'intérêt puisque toutes les lignes de table sont renvoyées. Ca n'est pas un problème de choix de plan et s'il y avait des "hints" ça n'y changerait rien. la raison est que postgres ne sait pas faire des lectures "index seulement", ce sera d'ailleurs faisable dans la prochaine version majeure cette partie étant déjà développée.
Et bien si ça change beaucoup de chose, relisez l'exemple que je donne, car lire des lignes de 8 Ko dans une table à la place de lire des données de 4 octets dans un index ça fait quand même une différence de 7996 octets par lignes... Une toute petite paille !
- "Les seuls paramétrages de PostGreSQL le sont au niveau du serveur"
Non puisqu'une session peut à tout moment forcer pour elle seule tous les paramètres réglant l'optimiseur et notamment le forçage d'index ou les stratégies pour les jointures ou les tris.
Au niveau session, OK, mais c’est loin d'être l'équivalent des hints que l'on trouve sous Oracle, Sybase, SQL Server ou IBM DB2 ou l'on peut régler chaque requête indépendamment, voir en fonction de l'utilisateur (exemple le resources Governor de SQL Server)
- "VACUUM, bonne à tout faire"
la recommandation c'est de ne pas faire de vacuum manuel et de laisser faire auto-vacuum. Le DBA qui lancerait des vacuum manuels à tout bout de champ, il faut simplement qu'il s'abstienne de faire ça.
Pour vous donner une idée de la différence, sachez qu'il y a pas loin de 30 commandes et techniques différentes pour auditer la fragmentation, vérifier l'intégrité des pages, défragmenter ou reconstruire les index, libérer les espaces morts, voire réduire les fichiers, y compris en mode ONLINE dans SQL Server (donc sans perte de l'index en cours de reconstruction pour les utilisateurs etr sans verrou).
Dans PG VACUUM fait tout d'un coup et pour les grosses bases, c'est très pénalisant... Alors que dans Oracle ou SQL Server on peut le faire en différentes phases à différentes planification.
Par exemple vérifier l'intégrité des données une fois par semaine et défragmenter certaines tables/index tous les jours et récupérez de la place qu'une fois par mois...
Ceci afin d'éviter des processus très consommateurs de temps qui nuisent aux grosses bases.
Pour ce qui est de l'"auto" du vacuum... il existe un mécanisme similaire dans SQL Server pour recalculer les statistiques qui agit en tâche de fond en mode synchrone ou asynchrone. Enfin, toutes les tâches de DBA peuvent être planifiées "On Idle", c'est à dire quand le processeur passe en dessous d'un certains seuil de charge au moins un certain temps...
Ceci existe depuis la version 7 de SQL Server datant de 1998.
- "pas de possibilité de paralléliser sa sauvegarde..."
la sauvegarde filesystem à chaud est une bête copie de fichiers, rien n'empêche de copier des répertoires en parallèle avec les outils classiques tar, rsync et compagnie.
Quant à l'export pg_dump il n'y a pas d'option pour le paralléliser contrairement à pg_restore mais il peut être lancé simultanément sur des objets ou bases différentes.
La copie de fichier n'a rien à voir avec une sauvegarde digne de ce nom puisqu'il est impossible de copier des fichiers à chaud alors que la base travaille.... En principe point n'est besoin d'arrêter une base ou un serveur pour effectuer une sauvegarde.
Rien à voir avec une lecture en // des données dans la base et une écriture en // sur différents supports, vu que PG ne sait pas faire des lectures // de ses tables.
- "pas de sauvegarde différentielle"
faux aussi, certains font des rsync à chaud avec une sauvegarde précédente et d'autres sauvent les fichiers de WAL=journaux de transaction qui sont des différentiels par définition.
ça ce sont des sauvegardes du journal de transaction. Rien à voir avec des sauvegardes différentielles. Les sauvegardes différentielles sauvegardent les pages de données qui ont été modifiées depuis un certain temps (une sauvegarde précédente).
Lisez par exemple ceci pour comprendre les différences : http://fr.wikipedia.org/wiki/Sauvegarde
Sachez que j'ai été content pour une fois d'avoir un détracteur avec un peu de matière. ça change des rigolo qui affirment votre article est nul, c'est tout faux, sans aucun argument.
Je retiens le fait du paramétrage de session que j'ai effectivement omis et vais rectifier mon papier.
A +
Partager