bom dia Fabrizio, o problema está na subquery do where, caso eu altere a
condição cruzada (CX1.CODHOTEL = CX.CODHOTEL) para uma constante
(CX1.CODHOTEL = 1) o tempo e o custo caem drasticamente. Obrigado pela
atenção.
----------------------------------------------------------------------------------
SELECT
  CX.CODCAIXA , CX.DATATURNO
FROM
  CAIXA CX
WHERE
  CX.CODCAIXA =
       (SELECT MAX (CX1.CODCAIXA )
          FROM CAIXA CX1
         WHERE CX1.CODHOTEL = CX.CODHOTEL )
  AND CX.CODHOTEL = 1
----------------------------------------------------------------------------------
"Seq Scan on caixa cx  (cost=0.00..960.76 rows=64 width=16)"
"  Filter: ((codhotel = 1) AND (codcaixa = (SubPlan 2)))"
"  SubPlan 2"
"    ->  Result  (cost=0.04..0.05 rows=1 width=0)"
"          InitPlan 1 (returns $1)"
"            ->  Limit  (cost=0.00..0.04 rows=1 width=4)"
"                  ->  Index Only Scan Backward using pk_caixa on caixa cx1
 (cost=0.00..466.81 rows=12878 width=4)"
"                        Index Cond: ((codhotel = cx.codhotel) AND
(codcaixa IS NOT NULL))"
----------------------------------------------------------------------------------
CREATE TABLE caixa
(
  dataturno timestamp(3) without time zone,
  turno integer,
  operador integer,
  salinidinheiro numeric(15,2),
  saliniom1 numeric(15,2),
  saliniom2 numeric(15,2),
  datahorainicio timestamp(3) without time zone,
  datahorafim timestamp(3) without time zone,
  cotacaoom1 numeric(15,2),
  cotacaoom2 numeric(15,2),
  codcaixa integer NOT NULL,
  codproxcaixa integer,
  codhotel integer NOT NULL,
  CONSTRAINT pk_caixa PRIMARY KEY (codhotel, codcaixa),
  CONSTRAINT idx_caixa_cdh_dtturno_turno UNIQUE (codhotel, dataturno, turno)
)


Em 18 de fevereiro de 2013 23:38, Joel Benelli <[email protected]>escreveu:

> Pessoal não estou encontrando alternativa para a query abaixo:
>
> select cx.cdcaixa, cx.dtturno, cx.cdempresa
>    from caixa cx
> where cx.cdcaixacancelado =
>          (select max(cx1.codcaixa) from caixa cx1 where cx1.cdempresa =
> cx.cdempresa)
>
> Como estou lendo a mesma tabela duas vezes (uma no escopo principal e
> outra na cláusula where) e a resolução de uma das leituras depende da
> outra, fatalmente uma delas fará seq scan. Esta é uma prática constante no
> aplicativo que comecei a analisar e no Postgre fica lento.
>
> Se alguém puder me dar uma luz agradeço.
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a