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 » Optimisation requête (encore) » 07/02/2013 18:00:34

> Elle fait quelle taille ? (je dirais entre 1,5 et 2Go vu le plan...


2,4 GO


> Et ça tourne sur quel genre de machine ?


Windows 2003, un serveur de 5 ans d'age. Processeurs Xeon E5420 à 2,5GHz (8 coeurs) et 16 GO de ram. Avec autant de mémoire, la meilleure optimisation des paramètres du serveur serait quoi ?

J'ai aussi un autre serveur linux sur lequel Postgres 8.4 tourne bien plus vite. Mais j'ai un problème d'onduleur à régler avant de faire une migration.

#2 Re : Optimisation » Optimisation requête (encore) » 07/02/2013 16:55:20

> c'est préférable d'indiquer votre version précise de PostgreSQL

Oui, pardon. J'y avais pensé, puis j'ai oublié...
Postgresql 8.4 sous windows server 2003.

> il y a combien de prix associés au type d'article ZFER, et combien de prix associés au canal 23

Prix avec ZFER: 2,8 millions
Prix avec canal 23: 500000
Au final : 200000 lignes


Et question qui n'a rien à voir, on fait comment pour insérer des sauts de lignes dans le message ?
[Modif]: Apparemment deux sauts de lignes consécutifs...

#3 Optimisation » Optimisation requête (encore) » 07/02/2013 14:46:05

mentat
Réponses : 8

Bonjour.

J'ai trois tables pour mes tarifs :
Table: prix_nets_sap (+7 millions de lignes)

CREATE TABLE prix_nets_sap
(
  devise character varying(5),
  date_prix_1 date,
  tarif_1 double precision,
  source_tarif_1 character varying(4),
  condition_1 double precision,
  type_condition_1 character varying(5),
  prix_1 double precision,
  date_prix_2 date,
  tarif_2 double precision,
  source_tarif_2 character varying(4),
  condition_2 double precision,
  type_condition_2 character varying(5),
  prix_2 double precision,
  prsu double precision,
  qte double precision,
  montant_1 double precision,
  montant_2 double precision,
  montant_prsu double precision,
  hausse double precision,
  marge double precision,
  qte_groupe_clients numeric,
  stats_debut text,
  stats_fin text,
  type_condition_2_libelle text,
  type_condition_1_libelle text,
  marge_unitaire numeric,
  article_id integer,
  client_id integer
)
WITH (
  OIDS=FALSE
);

CREATE INDEX prix_nets_sap_idx_article_id
  ON prix_nets_sap
  USING btree
  (article_id);

CREATE INDEX prix_nets_sap_idx_client_id
  ON prix_nets_sap
  USING btree
  (client_id);

Table: articles_canal (+30000 lignes)
CREATE TABLE articles_canal
(
  organisation_commerciale text NOT NULL,
  canal text NOT NULL,
  code text NOT NULL,
  designation text,
  type_articles text,
  type_libelle text,
  groupe_articles text,
  groupe_articles_libelle text,
  article_id integer,
  CONSTRAINT articles_canal_code PRIMARY KEY (organisation_commerciale, canal, code)
)
WITH (
  OIDS=FALSE
);


CREATE INDEX articles_canal_idx_id
  ON articles_canal
  USING btree
  (article_id);

CREATE INDEX articles_canal_idx_type_articles
  ON articles_canal
  USING hash
  (type_articles);


Table: clients (+10000 lignes)

CREATE TABLE clients
(
  code character varying(10) NOT NULL,
  libelle character varying(35),
  organisation_commerciale text,
  canal text NOT NULL,
  societe text NOT NULL DEFAULT 2100,
  client_id integer,
  CONSTRAINT clients_pk PRIMARY KEY (societe, canal, code)
)
WITH (
  OIDS=FALSE
);

CREATE INDEX client_idx_canal
  ON clients
  USING hash
  (canal);

CREATE INDEX clients_idx_id
  ON clients
  USING btree
  (client_id);

Quand je lance le query :
SELECT c.canal, c.code AS client, c.libelle AS client_libelle,
  a.code AS produit, a.designation AS produit_libelle,
  p.*
   FROM prix_nets_sap p, articles_canal a, clients c
  WHERE p.article_id = a.article_id AND p.client_id = c.client_id
  and a.type_articles='ZFER' and c.canal='23'

J'obtiens :
Hash Join  (cost=18138.64..449404.38 rows=1741506 width=299) (actual time=124352.620..313052.105 rows=197539 loops=1)
  Hash Cond: (p.article_id = a.article_id)
  ->  Hash Join  (cost=1621.77..393703.61 rows=1741506 width=257) (actual time=124298.204..312206.315 rows=527043 loops=1)
        Hash Cond: (p.client_id = c.client_id)
        ->  Seq Scan on prix_nets_sap p  (cost=0.00..345768.39 rows=7706239 width=226) (actual time=0.011..309203.834 rows=7706239 loops=1)
        ->  Hash  (cost=1614.68..1614.68 rows=567 width=35) (actual time=1.691..1.691 rows=567 loops=1)
              ->  Bitmap Heap Scan on clients c  (cost=72.66..1614.68 rows=567 width=35) (actual time=0.210..1.377 rows=567 loops=1)
                    Recheck Cond: (canal = '23'::text)
                    ->  Bitmap Index Scan on clients_idx_code  (cost=0.00..72.52 rows=567 width=0) (actual time=0.171..0.171 rows=567 loops=1)
                          Index Cond: (canal = '23'::text)
  ->  Hash  (cost=16414.95..16414.95 rows=8154 width=46) (actual time=54.365..54.365 rows=8108 loops=1)
        ->  Bitmap Heap Scan on articles_canal a  (cost=1551.51..16414.95 rows=8154 width=46) (actual time=2.269..49.253 rows=8108 loops=1)
              Recheck Cond: (type_articles = 'ZFER'::text)
              ->  Bitmap Index Scan on articles_canal_idx_type_articles  (cost=0.00..1549.47 rows=8154 width=0) (actual time=1.596..1.596 rows=8108 loops=1)
                    Index Cond: (type_articles = 'ZFER'::text)
Total runtime: 313101.246 ms

Et comme à chaque fois que je regarde un explain query, c'est une tannée à comprendre ce qu'il faut faire pour améliorer les choses.
Je vois un Seq scan sur la plus grosse table, alors que j'ai deux index (integer) sur les articles et les clients.

Bref, si quelqu'un peut m'aider à traduire le klingon...
Merci d'avance

#4 Re : ODBC » Erreur avec la clause "AS" » 24/01/2011 10:30:56

Ok, c'est un bug ms-query. Donc il n'y a pas de solution ?

Le problème c'est que ms-query est l'outil intégré à Excel pour récupérer des données de BDD et qu'apparemment on ne peut le remplacer par un outil plus moderne (fonctionnel ou mieux développé...).
On doit bientôt migrer vers Office 2010, mais toujours avec ms-query...

#5 Re : ODBC » Erreur avec la clause "AS" » 13/01/2011 18:42:12

Je suis d'accord, sauf que ma requête initiale c'est :
select code as groupe_vendeurs
from groupes_vendeurs

C'est microsoft query ou le driver ODBC qui ajoute tout seul des '

#6 Re : ODBC » Erreur avec la clause "AS" » 13/01/2011 17:29:39

Le log dit (merci, j'avais pas pensé à regarder là...) :
2011-01-13 13:02:49 CET ERREUR:  erreur de syntaxe sur ou près de « 'groupe_vendeurs' » au caractère 33
2011-01-13 13:02:49 CET INSTRUCTION :  SELECT groupes_vendeurs.code AS 'groupe_vendeurs'
    FROM public.groupes_vendeurs groupes_vendeurs

Bon, comment on peut lui dire d'utiliser " au lieu de ' ?

#7 ODBC » Erreur avec la clause "AS" » 13/01/2011 14:19:43

mentat
Réponses : 10

Bonjour.

Quand j'effectue une requete dans microsoft query avec le driver ODBC de postgresql, si j'utilise une clause as,
j'obtiens un message d'erreur.

Exemple:
select code as groupe_vendeurs
from groupes_vendeurs

=>ERREUR: Erreur de syntaxe sur ou près de 'groupe_vendeurs';
Error while executing the query

Alors que la requête passe bien avec pgAdmin.
Si j'enlève "as groupe_vendeurs" cela passe bien.

Postgresql 8.4, windows 2003 server

J'ai cherché un peu sur internet, mais comme le terme as sert beaucoup, je ne trouve rien de bien probant.

Merci d'avance à ceux qui se pencheront sur mon problème.
Crodialement

#8 Re : Général » Masquer le contenu d'un schema à un utilisateur » 04/10/2010 14:56:22

D'accord. Donc pas de solution à mon problème... Dommage !

Merci beaucoup pour votre réponse (très rapide !).

Cordialement

#9 Général » Masquer le contenu d'un schema à un utilisateur » 04/10/2010 14:17:49

mentat
Réponses : 3

Bonjour à toutes et à tous.

J'ai une base de données avec plusieurs schema, dont un (tmp) dont je voudrais masquer le contenu pour un utilisateur (en connexion odbc). Mais je n'y arrive pas (je crois que je m'y prend comme un manche (terme technique)).

J'ai donc deux roles de connexion :
CREATE ROLE postgres LOGIN
  ENCRYPTED PASSWORD '................'
  SUPERUSER INHERIT CREATEDB CREATEROLE;

CREATE ROLE test LOGIN
  ENCRYPTED PASSWORD '............'
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;
GRANT accesodbc TO test;

Un role de groupe:

CREATE ROLE accesodbc
  NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;

et le schema que je voudrais rendre opaque :

CREATE SCHEMA tmp
  AUTHORIZATION postgres;
GRANT ALL ON SCHEMA tmp TO postgres;

Je n'ai pas d'autorisation dessus pour mon utilisateur ou son role, ni pour public pourtant, j'en vois bien le contenu, même si je ne peux pas lire une de ses table (droits refusé).

Normalement, c'est l'option USAGE qui permet de masquer le contenu d'un schéma. Mais la, je n'ai aucun droit et pourtant je peux voir le contenu.

Visiblement je ne comprends pas correctement le fonction des droits. Que dois-je entrer comme instruction (grant/revoke...) pour masquer le contenu du schema tmp à mon utilisateur test ?

Je vous remercie d'avance, de vos réponses éclairées...

#10 Général » Masquer des tables à des utilisateurs » 17/03/2010 12:10:08

mentat
Réponses : 2

Bonjour.

J'ai une base Postgresql 8.3 (pas encore eu le temps de passer à 8.4, mais cela devrait être utile pour les
clauses window (http://sqlpro.developpez.com/article/ol … se-window/).

Toute la gestion des saisies se fait par l'intermédiaire d'un intranet.
Les indicateurs, analyses des données se fait en général sous excel en attaquant la base par odbc.
Mais comme il y a pas mal de tables, je voudrais que ne soient accessibles que les tables/vues que j'aurai
choisies.

En utilisant les roles, j'ai bien modifié les permissions d'accès, mais on voit toujours les tables même si on ne peut pas y accéder.

Est-il possible de masquer une table/un schéma pour un utilisateur (role) ?

Google ne m'a pas trouvé grand chose de pertinent...

Merci d'avance.

Pied de page des forums

Propulsé par FluxBB