[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