在PostgreSQL中进行优化的简单选择

在PostgreSQL中进行优化的简单选择,sql,postgresql,join,create-table,Sql,Postgresql,Join,Create Table,我有以下查询,我想对其进行优化,执行时间为4秒,行数为122928,但表之间没有任何链接 有什么方法可以优化这一点吗?我需要相同数量的行,但执行时间需要大大缩短 select dc.cddocument, us.cduser from dcdocument dc, aduser us WHERE (dc.FGUSECATACCESSROLE <> 1 OR dc.FGUSECATACCESSROLE IS NULL); 创建表调整器 CREATE TABLE public.ad

我有以下查询,我想对其进行优化,执行时间为4秒,行数为122928,但表之间没有任何链接

有什么方法可以优化这一点吗?我需要相同数量的行,但执行时间需要大大缩短

select dc.cddocument, us.cduser
from dcdocument dc, aduser us
 WHERE  (dc.FGUSECATACCESSROLE <> 1 OR dc.FGUSECATACCESSROLE IS NULL);
创建表调整器

CREATE TABLE public.aduser
(
    cduser integer NOT NULL,
    idlogin character varying(50) COLLATE pg_catalog."default",
    iduser character varying(50) COLLATE pg_catalog."default",
    nmuser character varying(255) COLLATE pg_catalog."default",
    idpassword character varying(50) COLLATE pg_catalog."default",
    dsuseremail text COLLATE pg_catalog."default",
    fglanguage integer,
    fguserenabled integer,
    cdmailserver integer,
    cdleader integer,
    dtinsert date,
    dtupdate date,
    nmuserupd character varying(255) COLLATE pg_catalog."default",
    idphone character varying(50) COLLATE pg_catalog."default",
    dsuser text COLLATE pg_catalog."default",
    nmdomainuid character varying(255) COLLATE pg_catalog."default",
    nmcertserialnum character varying(255) COLLATE pg_catalog."default",
    flpublickey bytea,
    fgnotice integer,
    fgstatuslogin integer,
    flphoto bytea,
    fgaccessrestrict integer,
    fgalterpassword integer,
    nmviewmodules character varying(255) COLLATE pg_catalog."default",
    idpasswordvalid character varying(50) COLLATE pg_catalog."default",
    nmuseremail character varying(255) COLLATE pg_catalog."default",
    fgtheme integer,
    fghomepage integer,
    dsurlhomepage text COLLATE pg_catalog."default",
    cddashboard integer,
    cddashboardtab integer,
    fgdashdoshare integer,
    dtrequestrstpsw date,
    idhashpassword character varying(50) COLLATE pg_catalog."default",
    cdlastlicense integer,
    fgpwdversion integer,
    cdcustomization integer,
    nmhashlastsession character varying(255) COLLATE pg_catalog."default",
    fgtransfped integer,
    cdtransfpedto integer,
    fgcontactenable integer,
    fgcontactpopup integer,
    cdfavorite integer,
    fgedittoolbar integer,
    fgeditgrid integer,
    nmphotopath character varying(255) COLLATE pg_catalog."default",
    dtbirthday date,
    CONSTRAINT pkaduser PRIMARY KEY (cduser),
    CONSTRAINT fk__aduser__cdtransf__56764864 FOREIGN KEY (cdtransfpedto)
        REFERENCES public.aduser (cduser) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fk_userleader FOREIGN KEY (cdleader)
        REFERENCES public.aduser (cduser) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.aduser
    OWNER to postgres;
CREATE INDEX "TESTE2"
    ON public.aduser USING btree
    (cduser)
    TABLESPACE pg_default;
CREATE INDEX seixcdleader
    ON public.aduser USING btree
    (cdleader)
    TABLESPACE pg_default;
CREATE INDEX seixusercdmailserv
    ON public.aduser USING btree
    (cdmailserver)
    TABLESPACE pg_default;
CREATE INDEX seixusercdtransfpedto
    ON public.aduser USING btree
    (cdtransfpedto)
    TABLESPACE pg_default;
CREATE INDEX seixuserenabled
    ON public.aduser USING btree
    (fguserenabled)
    TABLESPACE pg_default;
CREATE INDEX seixuserfglanguage
    ON public.aduser USING btree
    (fglanguage)
    TABLESPACE pg_default;
CREATE INDEX seixusergnfavorite
    ON public.aduser USING btree
    (cdfavorite)
    TABLESPACE pg_default;
CREATE INDEX seixuseridlogin
    ON public.aduser USING btree
    (idlogin COLLATE pg_catalog."default")
    TABLESPACE pg_default;
CREATE INDEX seixusernmdomainuid
    ON public.aduser USING btree
    (nmdomainuid COLLATE pg_catalog."default")
    TABLESPACE pg_default;
CREATE INDEX seixusernmfgencdus
    ON public.aduser USING btree
    (nmuser COLLATE pg_catalog."default", iduser COLLATE pg_catalog."default", cduser, fguserenabled)
    TABLESPACE pg_default;

您的查询已经以最佳方式执行,并在27毫秒内完成

有两件事可能有助于解释您观察到的问题:

在这两个表之间执行交叉联接,因为没有连接它们的WHERE条件,也就是说,aduser中的每一行都与dcdocument中匹配该条件的每一行相结合

这将导致208*591=122928个结果行,这可能不是您想要的

您必须使用像pgAdmin这样的客户端,它需要很长时间才能显示查询返回的许多结果行


解决方案可能是在WHERE或JOIN子句中添加缺少的条件。

为FGUSECATACCESSROLE创建索引?我已经有了此表和列的索引。请向我们展示Create table语句。和两张桌子的大小。多少行是1?性能问题应该包括解释分析和一些关于表大小、索引、当前时间性能、期望时间等的信息。慢是一个相对术语,我们需要一个实际值来比较。Thx为帮助,我在分析过滤器删除的行时用了一些额外的信息编辑了这篇文章:393,这是来自最后一个结果,意思是来自122928行?不,仅来自dcdocument。条件是没有索引可以提供可读性帮助,但是对于这样一个小表,这是没有问题的。我不确定2是否适用于这里,因为explain analyze不会返回要显示的行,而且122k仍然不太多,因此27秒的执行时间太高。我想可能是硬盘速度慢、共享缓冲区或工作内存设置太少的问题。我在笔记本上做实验,面临的挑战是减少查询执行的最长时间。我使用的是PGadmin,您是否有其他工具可以最好地管理它?我进行了几次连接,但没有得到第一行查询的结果。我将按照您的提示进行其他测试,谢谢。@JuanCarlosOropeza查询运行27毫秒,即0.027秒,并解释分析清楚地表示实际。。。行数=122928。所以我认为你找错人了。
CREATE TABLE public.dcdocument
(
    cddocument integer NOT NULL,
    cdcategory integer,
    dtdocument date,
    fgstatus integer,
    dssummary text COLLATE pg_catalog."default",
    nmtitle character varying(255) COLLATE pg_catalog."default",
    nmauthor character varying(255) COLLATE pg_catalog."default",
    iddocument character varying(50) COLLATE pg_catalog."default",
    dsdoccancel text COLLATE pg_catalog."default",
    fgusecataccessrole integer,
    cdcreatedby integer,
    nrhits integer,
    dtinsert date,
    dtupdate date,
    nmuserupd character varying(255) COLLATE pg_catalog."default",
    dtvalidity date,
    qtvalidity integer,
    fgtypevalid integer,
    cdprod integer,
    cdapprov integer,
    cdtemparchival integer,
    cdfavorite integer,
    fgoldstatus integer,
    CONSTRAINT pkdcdocument PRIMARY KEY (cddocument),
    CONSTRAINT fkdocumcdcreatedby FOREIGN KEY (cdcreatedby)
        REFERENCES public.aduser (cduser) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.dcdocument
    OWNER to postgres;
CREATE INDEX "TESTES"
    ON public.dcdocument USING btree
    (cddocument, fgusecataccessrole)
    TABLESPACE pg_default;
CREATE INDEX seixdoccataccessrole
    ON public.dcdocument USING btree
    (fgusecataccessrole)
    TABLESPACE pg_default;
CREATE INDEX seixdoccdcategory
    ON public.dcdocument USING btree
    (cdcategory)
    TABLESPACE pg_default;
CREATE INDEX seixdocumcdcreated
    ON public.dcdocument USING btree
    (cdcreatedby)
    TABLESPACE pg_default;
CREATE INDEX seixdocumentapprov
    ON public.dcdocument USING btree
    (cdprod, cdapprov)
    TABLESPACE pg_default;
CREATE INDEX seixdocumentfavori
    ON public.dcdocument USING btree
    (cdfavorite)
    TABLESPACE pg_default;
CREATE INDEX seixdocumentstatus
    ON public.dcdocument USING btree
    (fgstatus)
    TABLESPACE pg_default;
CREATE INDEX seixdocumtemparchi
    ON public.dcdocument USING btree
    (cdtemparchival)
    TABLESPACE pg_default;
CREATE TABLE public.aduser
(
    cduser integer NOT NULL,
    idlogin character varying(50) COLLATE pg_catalog."default",
    iduser character varying(50) COLLATE pg_catalog."default",
    nmuser character varying(255) COLLATE pg_catalog."default",
    idpassword character varying(50) COLLATE pg_catalog."default",
    dsuseremail text COLLATE pg_catalog."default",
    fglanguage integer,
    fguserenabled integer,
    cdmailserver integer,
    cdleader integer,
    dtinsert date,
    dtupdate date,
    nmuserupd character varying(255) COLLATE pg_catalog."default",
    idphone character varying(50) COLLATE pg_catalog."default",
    dsuser text COLLATE pg_catalog."default",
    nmdomainuid character varying(255) COLLATE pg_catalog."default",
    nmcertserialnum character varying(255) COLLATE pg_catalog."default",
    flpublickey bytea,
    fgnotice integer,
    fgstatuslogin integer,
    flphoto bytea,
    fgaccessrestrict integer,
    fgalterpassword integer,
    nmviewmodules character varying(255) COLLATE pg_catalog."default",
    idpasswordvalid character varying(50) COLLATE pg_catalog."default",
    nmuseremail character varying(255) COLLATE pg_catalog."default",
    fgtheme integer,
    fghomepage integer,
    dsurlhomepage text COLLATE pg_catalog."default",
    cddashboard integer,
    cddashboardtab integer,
    fgdashdoshare integer,
    dtrequestrstpsw date,
    idhashpassword character varying(50) COLLATE pg_catalog."default",
    cdlastlicense integer,
    fgpwdversion integer,
    cdcustomization integer,
    nmhashlastsession character varying(255) COLLATE pg_catalog."default",
    fgtransfped integer,
    cdtransfpedto integer,
    fgcontactenable integer,
    fgcontactpopup integer,
    cdfavorite integer,
    fgedittoolbar integer,
    fgeditgrid integer,
    nmphotopath character varying(255) COLLATE pg_catalog."default",
    dtbirthday date,
    CONSTRAINT pkaduser PRIMARY KEY (cduser),
    CONSTRAINT fk__aduser__cdtransf__56764864 FOREIGN KEY (cdtransfpedto)
        REFERENCES public.aduser (cduser) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fk_userleader FOREIGN KEY (cdleader)
        REFERENCES public.aduser (cduser) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.aduser
    OWNER to postgres;
CREATE INDEX "TESTE2"
    ON public.aduser USING btree
    (cduser)
    TABLESPACE pg_default;
CREATE INDEX seixcdleader
    ON public.aduser USING btree
    (cdleader)
    TABLESPACE pg_default;
CREATE INDEX seixusercdmailserv
    ON public.aduser USING btree
    (cdmailserver)
    TABLESPACE pg_default;
CREATE INDEX seixusercdtransfpedto
    ON public.aduser USING btree
    (cdtransfpedto)
    TABLESPACE pg_default;
CREATE INDEX seixuserenabled
    ON public.aduser USING btree
    (fguserenabled)
    TABLESPACE pg_default;
CREATE INDEX seixuserfglanguage
    ON public.aduser USING btree
    (fglanguage)
    TABLESPACE pg_default;
CREATE INDEX seixusergnfavorite
    ON public.aduser USING btree
    (cdfavorite)
    TABLESPACE pg_default;
CREATE INDEX seixuseridlogin
    ON public.aduser USING btree
    (idlogin COLLATE pg_catalog."default")
    TABLESPACE pg_default;
CREATE INDEX seixusernmdomainuid
    ON public.aduser USING btree
    (nmdomainuid COLLATE pg_catalog."default")
    TABLESPACE pg_default;
CREATE INDEX seixusernmfgencdus
    ON public.aduser USING btree
    (nmuser COLLATE pg_catalog."default", iduser COLLATE pg_catalog."default", cduser, fguserenabled)
    TABLESPACE pg_default;