PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Optimisation » Tuning avec postgresqltuner.pl » 02/03/2018 16:11:43

jvm

Bonjour,

Comment peut on utiliser votre script sous un environnement Windows ?

Désolé de la question , mais je maitrise pas encore bien PostgreSql

Merci d'avance

#2 Re : Migration » Migration procédure stocker SQL vers PostGresql » 02/03/2018 12:07:03

jvm

Bonjour à tous,


Alors j'ai fini par trouvé une solutions, que voici, par contre en terme de performance, j'ai un rapport  de 1 a 4 entre SQL Server et PostGreSql, mon postgreSql est 4 fois plus lent !


CREATE OR REPLACE FUNCTION public.ps_compteur(
    tablename character varying)
    RETURNS integer
    LANGUAGE 'sql'

    COST 100
    VOLATILE PARALLEL RESTRICTED
AS $BODY$

   INSERT INTO Indice( reference )
   SELECT tableName WHERE NOT EXISTS( SELECT code FROM indice WHERE reference = tableName );

   UPDATE indice SET compteur = compteur + 1
   WHERE reference = tableName
   RETURNING compteur;
$BODY$;

#3 Migration » Migration procédure stocker SQL vers PostGresql » 02/03/2018 10:08:35

jvm
Réponses : 1

Bonjour à tous,

Voilà je cherche a basculer la procédure stocké SQL Server ci-dessous vers PostgreSQL :

CREATE PROCEDURE [dbo].[PS_COMPTEUR] 
                 @TABLE_NAME NVARCHAR(128),
                 @NEW_ID     INT OUTPUT
AS
   SET NOCOUNT ON;
   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
   DECLARE @error INT = 0;
   DECLARE @trsName CHAR(6) = 'Indice';

  BEGIN TRANSACTION @trsName;
   IF NOT EXISTS(SELECT Code FROM Indice WHERE Reference = @TABLE_NAME)
      BEGIN
         INSERT INTO Indice( Reference )
         SELECT @TABLE_NAME WHERE NOT EXISTS(SELECT Code FROM Indice WHERE Reference = @TABLE_NAME);
         SET @error = @error + @@error;
      END;

   UPDATE Indice SET Compteur = Compteur + 1, @NEW_ID = Compteur + 1
   FROM Indice AS TC WHERE Reference = @TABLE_NAME;
   SET @error = @error + @@error;
 
   IF @error = 0
      COMMIT TRANSACTION @trsName;
   ELSE
      ROLLBACK TRANSACTION @trsName;


Après plusieurs recherche et avoir lu une partie de la documentation de PostgreSQL, je suis arrivé à faire cela :


CREATE OR REPLACE FUNCTION public.ps_indice(
    tablename character varying)
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 10
    VOLATILE
AS $BODY$
DECLARE
  result INTEGER;
BEGIN
   BEGIN
      IF NOT EXISTS(SELECT code FROM indice WHERE reference = tableName) THEN
         INSERT INTO Indice( reference )
         SELECT tableName WHERE NOT EXISTS(SELECT code FROM indice WHERE reference =  tableName);
      END IF;

      result = ( SELECT nextval( seqName ) );
   
      UPDATE indice SET compteur = result WHERE reference = tableName;
   EXCEPTION
      WHEN OTHERS THEN result = 100;
   END;
   RETURN result;
END;
$BODY$;

Mon problème est que la transaction n'est pas de type  ISOLATION LEVEL SERIALIZABLE et quelle n'est pas nommé du coup j'ai des doublons de code.

Merci d'avance pour votre aide à tous.

Bien cordialement

Pied de page des forums

Propulsé par FluxBB