[firebase-br] NOT EXISTS
Gladiston Santana
gladiston em vidy.com.br
Qua Jul 23 13:33:34 -03 2014
Pelo que eu vejo, seu 'not exists' teve pouca interferência porque
tratou-se duma tabela indexada pelo campo com o qual consultaria depois,
você foi cuidadoso tanto no seu programa como na demonstração, mas numa
tabela não indexada provavelmente sua consulta travaria o banco.
Sou coerente com minha mensagem inicial, talvez tenha exagerado no
'nunca', mas se puder evitá-lo seria melhor, a opção de negação é sempre
mais custosa para o banco.
Tomei o cuidado na mensagem inicial de mencionar outras possíveis opções em
detrimento do 'not exists', uma delas o LEFT JOIN.
Mesmo você, não pode negar que seu exemplo teria tido um êxito muito melhor
com LEFT JOIN do que foi com o NOT EXISTS, provavelmente levaria 3x menos
tempo com LEFT JOIN.
um abraço,
Em 23 de julho de 2014 10:09, Carlos H. Cantu <listas em warmboot.com.br>
escreveu:
> GS> Mas gostaria que voce postasse o PLAN junto com a estatistica, a
> GS> quantidade de reads não deve ter sido a mesma para a mesma coisa.
>
> Para a sua diversão (e constatação):
>
> Query
> ------------------------------------------------
> select P.CODPROD
> from PRODUTOS P
> where exists(select *
> from NOTAS N
> join PRODNOTA PN on PN.ID_NUM = N.ID_NUM and PN.CODPROD =
> P.CODPROD
> where N.EMISSAO > '1.1.2010')
>
> Plan
> ------------------------------------------------
> PLAN JOIN (PN INDEX (FK_PNOTA_CODPROD), N INDEX (PK_NOTAS))
> PLAN (P NATURAL)
>
> Query Time
> ------------------------------------------------
> Prepare : 15,00 ms
> Execute : 5.507,00 ms
> Avg fetch time: 2,22 ms
>
> Memory
> ------------------------------------------------
> Current: 18.206.152
> Max : 18.378.752
> Buffers: 2.048
>
> Operations
> ------------------------------------------------
> Read : 296.593
> Writes : 0
> Fetches: 2.145.149
> Marks : 0
>
>
> Enchanced Info:
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
> | Table Name | Records | Indexed | Non-Indexed |
> Updates | Deletes | Inserts | Backouts | Purges | Expunges |
> | | Total | reads | reads |
> | | | | | |
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
> |NOTAS | 0 | 301959 | 0 |
> 0 | 0 | 0 | 0 | 0 | 0 |
> |PRODNOTA | 0 | 301959 | 0 |
> 0 | 0 | 0 | 0 | 0 | 0 |
> |PRODUTOS | 0 | 0 | 5140 |
> 0 | 0 | 0 | 0 | 0 | 0 |
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
>
>
> Com NOT:
>
> Query
> ------------------------------------------------
> select P.CODPROD
> from PRODUTOS P
> where not exists(select *
> from NOTAS N
> join PRODNOTA PN on PN.ID_NUM = N.ID_NUM and PN.CODPROD =
> P.CODPROD
> where N.EMISSAO > '1.1.2010')
>
> Plan
> ------------------------------------------------
> PLAN JOIN (PN INDEX (FK_PNOTA_CODPROD), N INDEX (PK_NOTAS))
> PLAN (P NATURAL)
>
> Query Time
> ------------------------------------------------
> Prepare : 15,00 ms
> Execute : 4.509,00 ms
> Avg fetch time: 1,70 ms
>
> Memory
> ------------------------------------------------
> Current: 18.206.296
> Max : 18.378.752
> Buffers: 2.048
>
> Operations
> ------------------------------------------------
> Read : 296.593
> Writes : 0
> Fetches: 2.145.149
> Marks : 0
>
>
> Enchanced Info:
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
> | Table Name | Records | Indexed | Non-Indexed |
> Updates | Deletes | Inserts | Backouts | Purges | Expunges |
> | | Total | reads | reads |
> | | | | | |
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
> |NOTAS | 0 | 301959 | 0 |
> 0 | 0 | 0 | 0 | 0 | 0 |
> |PRODNOTA | 0 | 301959 | 0 |
> 0 | 0 | 0 | 0 | 0 | 0 |
> |PRODUTOS | 0 | 0 | 5140 |
> 0 | 0 | 0 | 0 | 0 | 0 |
>
> +-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
>
>
>
> PS: Em ambos os casos, as estatísticas foram tiradas após fetchall e
> sempre na segunda execução do mesmo comando, para equalizar o efeito
> "cache".
>
> []s
> Carlos H. Cantu
> www.FireBase.com.br - www.firebirdnews.org
> www.warmboot.com.br - blog.firebase.com.br
>
>
Mais detalhes sobre a lista de discussão lista