[firebase-br] Firebird 3.02 e o Problema com os PLAN

Alexandre Benson Smith iblist em thorsoftware.com.br
Ter Jul 25 16:57:45 -03 2017


Anderson,

Como fica se você executar a seguinte query:

SELECT
	V.COD_VENDA,
	V.CODCLI_VENDA as CodCli,
	CL.NOME_CLIENTE
FROM
	VENDAS V JOIN
	CLIENTES CL ON (V.CODCLI_VENDA+0 = CL.COD_CLIENTE)
where
	v.DATA_VENDA >= '21.06.2017'


Estranho o otimizador escolher este plano....  A primeira coisa que eu 
iria olhar eram as estatísticas, mas você já disse que estão 
atualizadas, segunda coisa olhar se algum índice esta inativo por algum 
motivo mas são PK/FK então não deveriam estar inativos, terceira seria 
olhar os tipos de dados dos campos se estão corretos e compatíveis (ex. 
se não é o caso de ter um campo integer e outro varchar), mas pelo DDL 
que postou, está tb certo...

[]s

Em 30/6/2017 09:17, Anderson Barretta escreveu:
> olá pessoal,
> fazem uns 3 meses que migrei vários clientes para o Fb3.
>   a principio tudo ok,
> mas estamos enfrentando algumas lentidoes em querys que antes no Fb 2.5
> tinham um bom desempenho.
>
> pelo que li aqui no fórum e no BUG tracker do Firebird mais pessoas estão
> com esse problema.
>
> vou mostrar um exemplo bem simples, apenas com 2 tabelas
> onde no meu ver o Firebird escolhe de forma errada o PLAN
>
> tenho 2 tabelas bem simples:
>
> CREATE TABLE CLIENTES (
>      COD_CLIENTE   DM_ID /* DM_ID = INTEGER NOT NULL */,
>      NOME_CLIENTE  DM_NOME /* DM_NOME = VARCHAR(60) */
> );
> ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES
> PRIMARY KEY (COD_CLIENTE);
>
> --------------------------
>
> CREATE TABLE VENDAS (
>      COD_VENDA     DM_ID /* DM_ID = INTEGER NOT NULL */,
>      DATA_VENDA    DM_DATA /* DM_DATA = DATE */,
>      CODCLI_VENDA  DM_ID /* DM_ID = INTEGER NOT NULL */
> );
>
> ALTER TABLE VENDAS ADD CONSTRAINT PK_VENDAS PRIMARY KEY (COD_VENDA);
> CREATE INDEX VENDAS_IDX_CLI ON VENDAS (CODCLI_VENDA);
> CREATE INDEX VENDAS_IDX_DATA ON VENDAS (DATA_VENDA);
>
>
> a tabela de clientes tem 2.383 registros
> a tabela de vendas tem 2.299.899 registros
>
> e fazendo um select simples :
>
> SELECT
> V.COD_VENDA,
> V.CODCLI_VENDA as CodCli,
> CL.NOME_CLIENTE
> FROM
> VENDAS V JOIN CLIENTES CL ON (V.CODCLI_VENDA = CL.COD_CLIENTE)
> where v.DATA_VENDA >= '21.06.2017'
>
> o FB acaba optando  pela busca natural da tabela de clinetes
> onde o mais correto no meu ver, seria utilizar a PK da tabela:
>
> PLAN JOIN (CL NATURAL, V INDEX (VENDAS_IDX_CLI, VENDAS_IDX_DATA))
>
> isso acaba dando uma diferença significativa quando a tabela de clientes
> tem bastante registros.
>
> fiz vários testes aqui, fiz backup e restaurei...
>
> a seletividade do indice VENDAS_IDX_CLI é de
> 0.0004196391091682017
>
> acredito que isso seja um BUG do otimizador do Fb 3.
> pois no Fb2.5 pega o PLAN correto.
>
> tenho o backup da base (8MB) se alguem quiser testar...
>
>
>
>


-- 
Alexandre Benson Smith
Santo Andre - Sao Paulo - Brazil





Mais detalhes sobre a lista de discussão lista