Bad acess plan on firebird 3.0
------------------------------

                 Key: CORE-5659
                 URL: http://tracker.firebirdsql.org/browse/CORE-5659
             Project: Firebird Core
          Issue Type: Bug
    Affects Versions: 3.0.2
         Environment: Windows 10 x64
            Reporter: wesley blanco


Hi.

We are doing a migration process from firebird 2.5 to 3.0, and we found some 
points of slowness that did not exist.

We realize that it is only at a specific point, a type of join, that does not 
take any index in firebird 3 and the table is of almost 1mi of records.

We were able to create a script by extracting as few of these tables as 
possible from one of these points. I've attached the script.

I upload script on my DropBox: 
https://www.dropbox.com/s/x37rez36ot4jzd6/script.zip?dl=0

steps to reproduce:

1 - create database in version 2.5 and another in 3.0.
2 - run the attached script (isql.exe -> in 'C:\script.sql') on each of these 
databases.
3 - run select on each of the databases:

        SELECT A.ID_PEDIDO_ITEM,
               C.DESCRICAO
          FROM COM_PEDIDO B
          JOIN COM_PEDIDO_ITEM A ON A.ID_PEDIDO = B.ID_PEDIDO
                             AND (  NOT(A.ID_PRODUTO =1 AND 
A.ID_PEDIDO_ITEM_PAI IS NOT NULL))
          JOIN EST_PRODUTO C ON C.ID_PRODUTO = A.ID_PRODUTO
         WHERE B.DTH_PEDIDO BETWEEN cast('10.12.16 05:00:00' as timestamp) AND 
cast('10.12.16 20:00:00'  as timestamp);

         
         
  
Total records: 107;         


 FB2.5.7 result:       
         
         

Query
------------------------------------------------
   SELECT A.ID_PEDIDO_ITEM,
               C.DESCRICAO
          FROM COM_PEDIDO B
          JOIN COM_PEDIDO_ITEM A ON A.ID_PEDIDO = B.ID_PEDIDO
                             AND (  NOT(A.ID_PRODUTO =1 AND 
A.ID_PEDIDO_ITEM_PAI IS NOT NULL))
          JOIN EST_PRODUTO C ON C.ID_PRODUTO = A.ID_PRODUTO
         WHERE B.DTH_PEDIDO BETWEEN cast('10.12.16 05:00:00' as timestamp) AND 
cast('10.12.16 20:00:00'  as timestamp)


Plan
------------------------------------------------
PLAN JOIN (B INDEX (COM_PEDIDO_IDX1), A INDEX (FK_COM_PEDIDO_ITEM_PEDIDO), C 
INDEX (RDB$PRIMARY1))

Adapted Plan
------------------------------------------------
PLAN JOIN (B INDEX (COM_PEDIDO_IDX1), A INDEX (FK_COM_PEDIDO_ITEM_PEDIDO), C 
INDEX (INTEG_6))

Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 31,00 ms
Avg fetch time: 0,29 ms

Memory
------------------------------------------------
Current: 9.300.768
Max    : 9.371.088
Buffers: 2.048

Operations
------------------------------------------------
Read   : 58
Writes : 0
Fetches: 1.122
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates 
| Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         
|         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|COM_PEDIDO                     |         0 |        58 |           0 |       0 
|       0 |       0 |        0 |        0 |        0 |
|COM_PEDIDO_ITEM                |         0 |       113 |           0 |       0 
|       0 |       0 |        0 |        0 |        0 |
|EST_PRODUTO                    |         0 |       107 |           0 |       0 
|       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+



Firebird 3.0.2 and 3.0.3.32829 result;


Query
------------------------------------------------

    
    SELECT A.ID_PEDIDO_ITEM,
               C.DESCRICAO
          FROM COM_PEDIDO B
          JOIN COM_PEDIDO_ITEM A ON A.ID_PEDIDO = B.ID_PEDIDO
                             AND (  NOT(A.ID_PRODUTO =1 AND 
A.ID_PEDIDO_ITEM_PAI IS NOT NULL))
          JOIN EST_PRODUTO C ON C.ID_PRODUTO = A.ID_PRODUTO
         WHERE B.DTH_PEDIDO BETWEEN cast('10.12.16 05:00:00' as timestamp) AND 
cast('10.12.16 20:00:00'  as timestamp)


Plan
------------------------------------------------
PLAN JOIN (A NATURAL, C INDEX (RDB$PRIMARY1), B INDEX (PK_COM_PEDIDO))

Adapted Plan
------------------------------------------------
PLAN JOIN (A NATURAL, C INDEX (INTEG_6), B INDEX (PK_COM_PEDIDO))

Query Time
------------------------------------------------
Prepare       : 31,00 ms
Execute       : 8.766,00 ms
Avg fetch time: 81,93 ms

Memory
------------------------------------------------
Current: 10.233.800
Max    : 10.506.880
Buffers: 2.048

Operations
------------------------------------------------
Read   : 23.389
Writes : 1
Fetches: 9.867.285
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates 
| Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         
|         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|COM_PEDIDO                     |         0 |    977872 |           0 |       0 
|       0 |       0 |        0 |        0 |        0 |
|COM_PEDIDO_ITEM                |         0 |         0 |      998548 |       0 
|       0 |       0 |        0 |        0 |        0 |
|EST_PRODUTO                    |         0 |    977872 |           0 |       0 
|       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

As you can see, only COM_PEDIDO_ITEM NATURAL was used and the index 
COM_PEDIDO_IDX1 (COM_PEDIDO.DTH_PEDIDO) was not used.

For me to force the access plan on my system is a bit difficult, as I have this 
situation at various points in the system making migration difficult.

what justifies this slower behavior compared to 2.5?

Thanks!! 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to