forced sequential scan when condition has current_user

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hi,

just a small question: is it normal that PostgreSQL 8.4.1 always uses
sequential scanning on any table when there is a condition having the
constant "current_user"? Of course there is a btree index set on that table,
but the DBMS just doesn't want to utilize it. When I replace current_user to
any string, the planner uses the index normally.

I can demonstrate it with the following simple query:

SELECT psz.kotesszam FROM projekt.projektszervezet psz WHERE
psz.felhasznalo_id = current_user;

Explain analyze:

"Seq Scan on projektszervezet psz  (cost=0.00..255.07 rows=42 width=9)"
"  Filter: ((felhasznalo_id)::name = "current_user"())"

Metadata:

CREATE TABLE "projekt"."projektszervezet" (
  CONSTRAINT "projektszervezet_pkey" PRIMARY KEY("kotesszam",
"felhasznalo_id"),
  CONSTRAINT "projektszervezet_fk_felhasznalo" FOREIGN KEY
("felhasznalo_id")
    REFERENCES "felhasznalo"."felhasznalo"("felhasznalo_id")
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
    NOT DEFERRABLE,
  CONSTRAINT "projektszervezet_fk_projekt" FOREIGN KEY ("kotesszam")
    REFERENCES "projekt"."projekt"("kotesszam")
    ON DELETE CASCADE
    ON UPDATE CASCADE
    NOT DEFERRABLE,
  CONSTRAINT "projektszervezet_fk_szerep" FOREIGN KEY ("szerep_id")
    REFERENCES "felhasznalo"."szerep"("szerep_id")
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
    NOT DEFERRABLE
) INHERITS ("projekt"."projektszervezet_sablon")
WITH OIDS;

CREATE INDEX "projektszervezet_idx_felhasznalo_id" ON
"projekt"."projektszervezet"
  USING btree ("felhasznalo_id");

CREATE INDEX "projektszervezet_idx_kotesszam" ON
"projekt"."projektszervezet"
  USING btree ("kotesszam");

CREATE TRIGGER "projektszervezet_archivalas" BEFORE UPDATE OR DELETE ON
"projekt"."projektszervezet" FOR EACH ROW EXECUTE PROCEDURE
"public"."projektszervezet_archivalas_trigger"();

CREATE TRIGGER "projektszervezet_idopecset" BEFORE UPDATE ON
"projekt"."projektszervezet" FOR EACH ROW EXECUTE PROCEDURE
"public"."idopecset_trigger"();

CREATE TRIGGER "projektszervezet_naplozas" BEFORE INSERT OR UPDATE OR DELETE
ON "projekt"."projektszervezet" FOR EACH ROW EXECUTE PROCEDURE
"public"."projektszervezet_naplozas_trigger"();

Inherited table:

CREATE TABLE "projekt"."projektszervezet_sablon" (
  "kotesszam" VARCHAR(10) NOT NULL,
  "felhasznalo_id" VARCHAR NOT NULL,
  "szerep_id" VARCHAR(3),
  "felvivo" VARCHAR DEFAULT "current_user"() NOT NULL,
  "felvitel_idopont" TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL,
  "modosito" VARCHAR,
  "modositas_idopont" TIMESTAMP WITHOUT TIME ZONE,
  "elso_felvivo" VARCHAR DEFAULT "current_user"() NOT NULL,
  "elso_felvitel_idopont" TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT now() NOT
NULL
) WITH OIDS;

CREATE TRIGGER "projektszervezet_idopecset" BEFORE UPDATE ON
"projekt"."projektszervezet_sablon" FOR EACH ROW EXECUTE PROCEDURE
"public"."idopecset_trigger"();


Thanks!
Balazs


-- 
Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux