[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