[firebase-br] NOT EXISTS

Carlos H. Cantu listas em warmboot.com.br
Qua Jul 23 10:09:43 -03 2014


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

GS> Vou executar o teste aqui e depois eu posto.


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.
GS>  
GS> Além disso, preciso que voce faça o teste a frio, isto é,
GS> reinicie o serviço, execute a query com o NOT, depois  reinicie o
GS> serviço, execute a query sem o NOT.


GS> Fico no aguardo.

GS>  

GS> Em 22 de julho de 2014 21:50, Carlos H. Cantu
GS> <listas em warmboot.com.br> escreveu:

GS>  Continuo discordando da generalização que vc fez no email inicial,
GS>  sobre evitar usar NOT. A prova de que a performance nem sempre é
GS>  prejudicada eu já dei.
GS>  
GS>  No exemplo que postei, a consulta realizada pelo Firebird será a mesma
GS>  tanto na query que usa NOT como na que não usa: em ambos os casos, ele
GS>  irá verificar se houve pelo menos uma nota emitida para o produto
GS>  dentro do período especificado. A negativa é aplicada sobre o
GS>  resultado.
GS>  
GS>  O tempo de preparação da query, no meu exemplo, foi menor com o NOT do
GS>  que sem ele. A diferença no tempo de execução foi de 47ms, ou seja,
GS>  praticamente nada.
GS>  
GS>  O ganho que vc se refere geralmente ocorre em consultas onde usaram
GS>  NOT IN e vc substitui por EXISTS, pela limitação do otimizador eu já
GS>  citei (e que consta no ReleaseNotes).
GS>  
GS>  O perigo de generalizar é que muitos assumem como verdade absoluta
GS>  para todos os casos, portanto, é importante ficar claro que cada caso
GS>  é um caso.





Mais detalhes sobre a lista de discussão lista