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 : ODBC » Vues matérialisées non visibles » 07/05/2021 15:06:10

C'est bien ça ! J'ai testé avec un autre client ODBC ("Database browser" trouvé sur https://www.etl-tools.com) et lui il sait bien afficher les vues mat.
(pour info, ça ne marche pas avec Office 365 Enterprise ni avec Office Home 2019)
Je vais donc les remplacer par de vraies tables "de cache"...
Merci.

#2 ODBC » Vues matérialisées non visibles » 06/05/2021 15:17:16

mgmpg
Réponses : 2

Bonjour,

J'utilise la (quasi) dernière version (13.00.000) du driver odbc officiel sous windows 10.
Le serveur est en v12, sous Linux.
Depuis Excel, je vois les schémas, les tables et les vues mais pas les vues matérialisées.
Pourtant en jetant un oeil au source, on dirait que c'est pris en compte...
Même manque avec le driver v12...

#3 Site PostgreSQL.fr » Horodatage des témoignages » 27/11/2020 11:26:05

mgmpg
Réponses : 1

Bonjour,
Pensez-vous qu'il serait possible de voir la date de chaque témoignage car actuellement ce n'est pas pratique de savoir lesquels sont nouveaux :-(

#4 Re : Optimisation » requête lente via fdw » 27/11/2020 11:02:59

J'ai trouvé un "hack" pour faire passer le similarity_threshold à la base distante: dans celle-ci, je crée plusieurs vues qui font simplement un "select set_limit()" et j'appelle la bonne vue distante avant ma vraie requete distante avec l'opérateur "%" => ça fonctionne mais il ne faudrait pas que set_limit disparaisse (marquée comme deprecated dans la doc !)


Voici une fonction qui crée autant de vues que de valeurs de similarity souhaitées:
create or replace function fc_create_set_fdw_pgtrgm_similarity_views(
        param_view_name_prefix  text,   -- can be schema prefixed, _nnn will be added after this name, ie _065 for 0.65 value
        param_from_value        float,  -- 0 to 1
        param_to_value          float,
        param_step              float
) returns setof text as $$
declare
        curr_value      numeric(3,2);
        view_name       text;
        sql_cmd         text;
begin
        curr_value=param_from_value;
        while (curr_value<=param_to_value) loop
                view_name=param_view_name_prefix||'_'||to_char(curr_value*100,'FM000');
                --
                sql_cmd='drop view if exists '||view_name||' cascade';
                execute sql_cmd;
                --
                sql_cmd='create or replace view '||view_name||' as select set_limit('||to_char(curr_value,'FM0.00')||')'; -- TODO: set_limit() is currently deprecated
                execute sql_cmd;
                return next sql_cmd;
                --
                perform fc_comment_on('view',view_name,
                        'View that just set the pg_trgm.similarity_threshold value (only way to set it for a remote fdw query with the % operator!)',current_setting('sessionvar.version',true));
                --
                curr_value=curr_value+param_step;
        end loop;
        --
        return;
end; $$
language plpgsql;


Idéalement, if faudrait pouvoir envoyer un "SET" à une base distante, y'a du patch en cours à ce sujet ?

#5 Re : ODBC » Authentification par le compte windows possible ? » 06/08/2019 16:01:16

J'ai pu finalement avoir l'accès à l'AD via un "proxy" ldap :-)
Malheureusement, le serveur n'aime pas cette config (ldap+mapping): l'option d'authentification « map » est seulement valide pour les méthodes d'authentification « ident, peer, gssapi, sspi et cert »
Dommage :-((((

#6 ODBC » Authentification par le compte windows possible ? » 06/08/2019 12:13:25

mgmpg
Réponses : 2

Bonjour,

J'ai des clients sous Windows 10, loggés via domaine/ad et un serveur pg v10.9 sous Linux.
J'ai plusieurs sources odbc vers différentes bases et ça fonctionne parfaitement (via des vues dans Excel par exemple, les perfs sont excellentes, même pour des dizaines de milliers de lignes avec 50 colonnes !).

Ce qui me gène, c'est le fait de stocker le mot de passe d'un compte dans les infos odbc : j'utilise un compte pg à qui je donne les droits select/execute sur toutes les tables/vues/procs.
D'autant plus que j'ai plein de bases et que du coup je génère les sources odbc par un script powershell qui contient donc ce mot de passe "en dur"...
Bien sur, si je ne mets pas de mot de passe dans la source odbc, il me sera demandé à chaque première lecture dans Excel...

Est-il possible d'utiliser le compte windows à la place (mettre le login windows comme username dans la source, sans le mot de passe) et, avec le mapping de tous les comptes windows potentiels dans pg_ident.conf vers mon compte pg "readonly", de demander le mot de passe windows lors de la première connection ?
Je crains ne pouvoir accèder directement à l'ad depuis le serveur Linux, ni via ldap... Seul "SAML" serait possible...

#7 Général » Reformatage des requêtes paramètrées dans les logs » 28/02/2019 12:34:49

mgmpg
Réponses : 2

Bonjour,

La plupart des ORM font leur requête en deux fois, par exemple:

LOG:  execute <unnamed>: SELECT ... WHERE t0.id = $1
DETAIL:  parameters: $1 = '4396'

C'est un peu galère pour suivre ce que fait une appli à debugger, surtout quand on a 20 paramètres...
(pas moyen de copier/coller le sql entre autres...)

Est-ce qu'un outil de reformatage de ces "paires" de ligne existe déja ?
(sinon, je bricolerai qq chose :-)

<mode rêve>Un paramètre dans le postgresql.conf qui forcerait la fusion de ce type de requête serait idéal !</mode>

#8 Re : Réplication » Automatisation de la liste des tables répliquées » 19/09/2018 10:07:03

Ah, oui, j'aime bien l'idée de "détourner" un plugin Nagios pour comparer 2 schémas :-)

#9 Re : Réplication » Automatisation de la liste des tables répliquées » 18/09/2018 08:40:09

Mais je vais/veux utiliser la réplication logique :-)
Lors du brexit, quand je vais retirer l'Angleterre du groupe europe dans ma base country, les autres bases vont récupérer cette modif, via "subscription", dans "leurs" tables country*...
Je me renseigne juste sur le meilleur moyen/astuce de créer et maintenir la structure de ces tables "mirroir" dans les bases qui s'abonnent...

#10 Réplication » Automatisation de la liste des tables répliquées » 17/09/2018 13:08:59

mgmpg
Réponses : 4

Bonjour,

J'ai plein de bases qui chacunes contiennent des infos de pays.
Comme y'a un gros ménage de prévu les prochains mois, je pense à faire une base "country" (bon assez grosse quand même car il y aura les langues pratiquées par pays, l'appartenance à des groupes, des historiques de taux de devises, les traductions de tout ça, etc... une bonne vingtaine de tables en tout) dont je répliquerais les tables dans toutes mes autres bases.

Je laisse les fdw de coté pour cet usage (problèmes de perfs, séquenciers, pas possible d'utiliser des FK qui pointent dessus, ...).

Actuellement, j'ai un script bash qui part d'un dump sql pour en faire une version "nettoyée", que je pourrai lancer dans mes bases cibles:

echo "Preparing a cleaned sql dump to create all published tables in another database..."
pg_dump ${PG_PARAMS} --format=plain --no-owner --schema-only --no-acl ${DB_NAME} >${DB_NAME}_schema_only.pgdump.sql
# functions definition can end with $$; or $_$; or $_X$;
# views definitions have at least one space on the start of each line of the body (TODO: better pattern to check this)
pcregrep -vM \
  '(^$|^--|^SET |^COMMENT ON (DATABASE|EXTENSION|OPERATOR|FUNCTION|VIEW|) |^CREATE EXTENSION |^CREATE OPERATOR (\n|.)*?\);$|^CREATE TRIGGER |^CREATE FUNCTION (\n|.)*?\$_{0,1}X{0,1}\$;$|^CREATE VIEW (\n|.)*?;$|CREATE PUBLICATION |ALTER PUBLICATION )' \
  ${DB_NAME}_schema_only.pgdump.sql \
  >${DB_NAME}_schema_only.pgdump.cleaned.sql

Voyez vous/existe-t-il une meilleure méthode ?

J'envisageais aussi de passer par un fdw sur la base cible vers la base country pour analyser son dico et y retrouver les tables publiées afin le les créer (mais il faut aussi trouver les définitions de types/domaines/etc... pas si facile!)

#11 Re : Optimisation » requête lente via fdw » 18/05/2018 15:03:53

Ah, oui, du coup, je viens de me rendre compte que je ne peux pas "envoyer" un autre threshold à la base distante :-(
(à moins que le fdw se connecte par un utilisateur dédié sur lequel on aurait fait un "alter role set th=0.1")

Qu'est ce que ça implique de passer cette fonction en immutable ? (je n'ai pas besoin d'une vue "stable" des données, c'est pour faire des recherches de titres de films...)

#12 Re : Optimisation » requête lente via fdw » 15/05/2018 16:29:57

Bon, je crois avoir trouvé une solution: ce n'est que si les fonctions sont immutables qu'elles peuvent être déportées (dixit la doc).
En faisant un simple "alter function similarity_op(text,text) immutable;" (au lieu de stable) sur la base cible et la base contenant le fdw, le sql envoyé est bien celui avec le filtre !
Et je divise par 10 le temps d'éxécution, ce qui m'arrange bien car pour un affichage de suggestions dans un champ de saisie, devoir attendre 2/3 secondes, c'était pas glop !

#13 Optimisation » requête lente via fdw » 15/05/2018 10:30:24

mgmpg
Réponses : 5

Bonjour,

J'ai une requête qui ne veut pas "envoyer son where" au serveur distant (en v10.4 des 2 cotés, même machine, en debian stable).
C'est un filtre "similarity" :  where (column % search)
La colonne est indéxée, pas de souci sur la base en direct...

L'explain montre : Remote SQL: SELECT column FROM public.table
et donc malheureusement, ça filtre en local: Rows Removed by Filter: 249486 :-(

J'ai pourtant précisé "extensions 'pg_trgm'" dans le "create server", ce qui est nécessaire pour que pg pousse les filtres sur le serveur distant...

Est-ce un bug ?

#14 Re : PL/Perl » Plantage process serveur lors de l'appel de unaccent » 28/08/2015 13:45:18

J'ai retesté tout ça car avant, comme je passais la même chaine, le "cache" immutable de pg faussait les tests!
Désormais je suffixe la chaine avec un séquencier pour forcer l'écecution...
J'ai rajouté le gros tableau en "SHARED" (en espérant l'avoir bien fait...) et le test avec Unicode::Normalize

set client_min_messages='WARNING';

drop database if exists test_pg_perl;
create database test_pg_perl;
\c test_pg_perl

create extension unaccent;
create extension plperl;
create extension plperlu;


create or replace function perl_unaccent(param_charset text, param_string text) returns text as $$
        use Text::Unaccent;
        return unac_string($_[0],$_[1]);
$$ language plperlu immutable strict;


create or replace function perl_unaccent_with_bigmap(param_string text) returns text as $$
# Based on:
# http://cpansearch.perl.org/src/PJACKLAM/Text-Unaccent-PurePerl-0.05/lib/Text/Unaccent/PurePerl.pm
# Author:      Peter John Acklam
# Time-stamp:  2013-03-02 12:38:55 +00:00
# E-mail:      pjacklam@online.no
# URL:         http://home.online.no/~pjacklam
if (!defined $_SHARED) {
$_SHARED={
 # 00A0 NO-BREAK SPACE
 # ->   0020 SPACE
 "\xA0" => " ",
--------------------(CUT)--------------------
 # FFEE HALFWIDTH WHITE CIRCLE
 # ->   25CB WHITE CIRCLE
 "\x{FFEE}" => "\x{25CB}"
}
};
my $str_in=$_[0];
my $str_out='';
my $offset_max=length($str_in)-1;
for my $offset (0..$offset_max) {
  my $chr=substr($str_in,$offset,1);
  $str_out.=exists $_SHARED->{$chr} ? $_SHARED->{$chr} : $chr;
};
return $str_out;
$$ language plperl immutable strict;


create or replace function perl_unicode_normalize(param_string text) returns text as $$
        use Unicode::Normalize;
        my $w=NFD($_[0]);
        $w =~ s/\pM//g;  # strip combining characters
        return $w;
$$ language plperlu immutable strict;


\set str2unacc '''Ça va, lʼœil de Владимир a été passé au Kärcher !'''
\echo Test sur la chaine: :str2unacc
select unaccent(:str2unacc);
select perl_unaccent('utf-8',:str2unacc);
select perl_unaccent_with_bigmap(:str2unacc);
select perl_unicode_normalize(:str2unacc);

\set loops 5000
\echo Test sur :loops appels:
explain analyze select unaccent(:str2unacc||seq)                  from generate_series(1,:loops) as tbl(seq);
explain analyze select perl_unaccent('utf-8',:str2unacc||seq)     from generate_series(1,:loops) as tbl(seq);
explain analyze select perl_unaccent_with_bigmap(:str2unacc||seq) from generate_series(1,:loops) as tbl(seq);
explain analyze select perl_unicode_normalize(:str2unacc||seq)    from generate_series(1,:loops) as tbl(seq);

Ce qui donne:

Test sur la chaine: 'Ça va, lʼœil de Владимир a été passé au Kärcher !'
                     unaccent                      
---------------------------------------------------
 Ca va, lʼeil de Владимир a ete passe au Karcher !

                               perl_unaccent                                
----------------------------------------------------------------------------
 Ca va, lʼÅ\u0093il de Ð\u0092ладимиÑ\u0080 a ete passe au Karcher !

             perl_unaccent_with_bigmap             
---------------------------------------------------
 Ca va, lʼœil de Владимир a ete passe au Karcher !

              perl_unicode_normalize               
---------------------------------------------------
 Ca va, lʼœil de Владимир a ete passe au Karcher !
(1 ligne)

Test sur 5000 appels:
                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series tbl  (cost=0.00..20.00 rows=1000 width=4) (actual time=0.528..11.804 rows=5000 loops=1)
 Total runtime: 12.073 ms

                                                        QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series tbl  (cost=0.00..267.50 rows=1000 width=4) (actual time=0.509..55.731 rows=5000 loops=1)
 Total runtime: 56.385 ms

                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series tbl  (cost=0.00..267.50 rows=1000 width=4) (actual time=0.469..164.947 rows=5000 loops=1)
 Total runtime: 165.531 ms

                                                        QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series tbl  (cost=0.00..267.50 rows=1000 width=4) (actual time=0.455..92.159 rows=5000 loops=1)
 Total runtime: 92.847 ms

Si je commente le test "defined" (donc en réaffectant le tableau SHARED à chaque fois, ça repasse de 165 à ~6500ms !

#15 Re : PL/Perl » Plantage process serveur lors de l'appel de unaccent » 25/08/2015 10:56:28

En 9.4 j'ai 8.655ms, 1.119ms et 7834ms donc quasi kif-kif...

#16 Re : PL/Perl » Plantage process serveur lors de l'appel de unaccent » 25/08/2015 10:53:43

Merci pour vos analyses !

En attendant, j'ai un peu benchmarké ce qui était dispo (à savoir l'extension unaccent, la lib perl unaccent et le source perl unaccent_pureperl, en pg9.1.16 sur une debian wheezy):

drop database if exists test_pg_perl;
create database test_pg_perl;
\c test_pg_perl

create extension unaccent;
create extension plperl;
create extension plperlu;

create or replace function perl_unaccent(param_charset text, param_string text) returns text as $$
        use Text::Unaccent;
        return unac_string($_[0],$_[1]);
$$ language plperlu immutable strict;

create or replace function perl_unaccent_pure(param_string text) returns text as $$
# http://cpansearch.perl.org/src/PJACKLAM/Text-Unaccent-PurePerl-0.05/lib/Text/Unaccent/PurePerl.pm
# Author:      Peter John Acklam
# Time-stamp:  2013-03-02 12:38:55 +00:00
# E-mail:      pjacklam@online.no
# URL:         http://home.online.no/~pjacklam
my $map = {
 # 00A0 NO-BREAK SPACE
 # ->   0020 SPACE
 "\xA0" => " ",
...
########################### bon là, j'ai viré tout le tableau associatif pour le paste...
...
 # FFEE HALFWIDTH WHITE CIRCLE
 # ->   25CB WHITE CIRCLE
 "\x{FFEE}" => "\x{25CB}"
};
my $str_in=$_[0];
# Iterate over each character in the input string. If the character exists
# in the map, replace the current character according to the map, otherwise
# keep the character as it is.
my $str_out = '';
my $offset_max = length($str_in) - 1;
for my $offset (0 .. $offset_max) {
  my $chr = substr($str_in, $offset, 1);
  $str_out .= exists $map->{$chr} ? $map->{$chr} : $chr;
};
return $str_out;
$$ language plperl;

\set str2unacc '''Mon œil à été passé au Kärcher'''
\set loops 5000
explain analyze select unaccent(:str2unacc) from generate_series(1,:loops);
explain analyze select perl_unaccent('utf-8',:str2unacc) from generate_series(1,:loops);
explain analyze select perl_unaccent_pure(:str2unacc) from generate_series(1,:loops);

Voici les résultats:

                                                     QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series  (cost=0.00..12.50 rows=1000 width=0) (actual time=0.579..7.934 rows=5000 loops=1)
 Total runtime: 8.207 ms

                                                     QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series  (cost=0.00..10.00 rows=1000 width=0) (actual time=0.406..0.840 rows=5000 loops=1)
 Total runtime: 1.078 ms

                                                       QUERY PLAN                                                        
-------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series  (cost=0.00..260.00 rows=1000 width=0) (actual time=2.207..7790.519 rows=5000 loops=1)
 Total runtime: 7791.658 ms

#17 Re : PL/Perl » Plantage process serveur lors de l'appel de unaccent » 21/08/2015 11:35:06

Je reproduis le bug sur une install from scratch de debian/jessie (autre serveur de test/dev installé fin avril).
Ca semble donc déja exclure un bug de migration de distrib wheezy->jessie...
Y'a-t-il un moyen de débugger ça plus en profondeur ?

#18 Re : PL/Perl » Plantage process serveur lors de l'appel de unaccent » 21/08/2015 10:45:43

Tout vient de la jessie:
aptitude search -F '%25V %p' '~i (^perl$|plperl|unaccent)'
1.08-1+b5                 libtext-unaccent-perl                                                                                                                                                                                             
5.20.2-3+deb8u1           perl                                                                                                                                                                                                               
9.4.3-0+deb8u1            postgresql-plperl-9.4

#19 PL/Perl » Plantage process serveur lors de l'appel de unaccent » 21/08/2015 10:10:56

mgmpg
Réponses : 18

Bonjour,

Je fais des tests de migration pg9.1->9.4 (migration debian wheezy->jessie).

J'ai une fonction pour wrapper la fonction perl text::unaccent mais celle-ci fait carrément vautrer le serveur :-((
** Error in `postgres: postgres testperl [local] SELECT': free(): invalid pointer: 0x00007fc100000000 ***
2015-08-21 09:04:58 CEST [13653-77] LOG:  processus serveur (PID 13503) a été arrêté par le signal 6 : Aborted
2015-08-21 09:04:58 CEST [13653-78] DÉTAIL:  Le processus qui a échoué exécutait : SELECT unaccent('utf-8','_');
2015-08-21 09:04:58 CEST [13653-79] LOG:  arrêt des autres processus serveur actifs
2015-08-21 09:04:58 CEST [14091-1]  postgres@[local] testperl [inconnu] FATAL:  le système de bases de données est en cours de restauration
2015-08-21 09:04:58 CEST [12850-2] ATTENTION:  arrêt de la connexion à cause de l'arrêt brutal d'un autre processus serveur
2015-08-21 09:04:58 CEST [12850-3] DÉTAIL:  Le postmaster a commandé à ce processus serveur d'annuler la transaction
        courante et de quitter car un autre processus serveur a quitté anormalement
        et qu'il existe probablement de la mémoire partagée corrompue.
2015-08-21 09:04:58 CEST [12850-4] ASTUCE :  Dans un moment, vous devriez être capable de vous reconnecter à la base de
        données et de relancer votre commande.
2015-08-21 09:04:58 CEST [13653-80] LOG:  tous les processus serveur se sont arrêtés, réinitialisation
2015-08-21 09:04:58 CEST [14092-1] LOG:  le système de bases de données a été interrompu ; dernier lancement connu à 2015-08-21 08:56:43 CEST
2015-08-21 09:04:58 CEST [14092-2] LOG:  le système de bases de données n'a pas été arrêté proprement ; restauration
        automatique en cours
2015-08-21 09:04:58 CEST [14092-3] LOG:  la ré-exécution commence à 0/61B0360
2015-08-21 09:04:58 CEST [14092-4] LOG:  enregistrement de longueur nulle à 0/61B4F58
2015-08-21 09:04:58 CEST [14092-5] LOG:  ré-exécution faite à 0/61B4F28
2015-08-21 09:04:58 CEST [14092-6] LOG:  la dernière transaction a eu lieu à 2015-08-21 09:04:39.712487+02 (moment de la journalisation)
2015-08-21 09:04:58 CEST [13653-81] LOG:  le système de bases de données est prêt pour accepter les connexions
2015-08-21 09:04:58 CEST [14096-1] LOG:  lancement du processus autovacuum

Et en plus, il embarque toute la famille dans le tombeau !

La lib perl fonctionne bien hors postgresql:
$ cat test.perl
use Text::Unaccent;
print unac_string('utf-8','titanic ta mère');
$ perl test.perl
titanic ta mere

Pour reproduire:

create database testperl;
\c testperl

create extension plperlu;
CREATE or replace FUNCTION unaccent(the_charset text, the_string text) RETURNS text AS $_X$
  use Text::Unaccent;
  return unac_string($_[0],$_[1]);
  $_X$
  language plperlu;

SELECT unaccent('utf-8','');
unaccent
----------

(1 ligne)
Ca marche avec une chaine vide !

SELECT unaccent('utf-8','_');
la connexion au serveur a été coupée de façon inattendue
        Le serveur s'est peut-être arrêté anormalement avant ou durant le
        traitement de la requête.
La connexion au serveur a été perdue. Tentative de réinitialisation : Échec.
!>
Même avec un caractère "non utf8", ça plante !

J'ai un autre wrapper pour la fonction perl suivante:
use HTML::Entities;
return decode_entities($_[0]);
et celui ci fonctionne sans problème !

Une idée ?

Pied de page des forums

Propulsé par FluxBB