pg.ddx.io  pgsql-performance@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Reddygari, Pavan <pkreddy@amazon.com>
To: pgsql-performance@postgresql.org <pgsql-performance@postgresql.org>
Subject: View preformance oracle to postgresql
Date: Tue, 9 Jan 2018 21:32:33 +0000
Message-ID: <9909AFED-314C-4AFE-AF7F-77645E7FAA2F@amazon.com> (raw)

Hi,

A view got converted to postgresql, performance while querying the view in postgresql is 10X longer compared to oracle.
Hardware resources are matching between oracle and postgresql.

Oracle version - Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production (RHEL7)
Postgresql database version - PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit (Amazon RDS)

Following details from oracle database.


SQL> set autot traceonly exp stat
SQL> SELECT IAT_ID, IAT_NAME, IAT_TYPE, IAV_VALUE, IAV_APPROVED FROM V_ITEM_ATTRIBUTEs WHERE IAV_ITM_ID = 2904107;

66 rows selected.

Elapsed: 00:00:00.02

Execution Plan
----------------------------------------------------------
Plan hash value: 1137648293

-------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |     1 |   107 |     8 (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |                |     1 |   107 |     8 (0)| 00:00:01 |
|   2 |   NESTED LOOPS               |                |     1 |   107 |     8 (0)| 00:00:01 |
|   3 |    NESTED LOOPS              |                |     1 |    77 |     7 (0)| 00:00:01 |
|   4 |     VIEW                   | VW_SQ_1          |     1 |    39 |     4 (0)| 00:00:01 |
|   5 |      HASH GROUP BY           |                |     1 |    14 |     4 (0)| 00:00:01 |
|*  6 |       INDEX RANGE SCAN             | UNIQUE_IAV_VERSION   |    23 |   322 |     4     (0)| 00:00:01 |
|   7 |     TABLE ACCESS BY INDEX ROWID| ITEM_ATTRIBUTE_VALUE |     1 |    38 |     3      (0)| 00:00:01 |
|*  8 |      INDEX UNIQUE SCAN             | UNIQUE_IAV_VERSION   |     1 |       |     2     (0)| 00:00:01 |
|*  9 |    INDEX UNIQUE SCAN         | PK_IAT_ID            |     1 |       |     0 (0)| 00:00:01 |
|  10 |   TABLE ACCESS BY INDEX ROWID  | ITEM_ATTRIBUTE       |     1 |    30 |     1      (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   6 - access("B"."IAV_ITM_ID"=2904107)
   8 - access("A"."IAV_ITM_ID"=2904107 AND "ITEM_2"="A"."IAV_IAT_ID" AND
            "A"."IAV_VERSION"="MAX(B.IAV_VERSION)")
   9 - access("A"."IAV_IAT_ID"="IAT_ID")


Statistics
----------------------------------------------------------
        0  recursive calls
        0  db block gets
      10047  consistent gets
        0  physical reads
        0  redo size
       4346  bytes sent via SQL*Net to client
      568  bytes received via SQL*Net from client
        6  SQL*Net roundtrips to/from client
        0  sorts (memory)
        0  sorts (disk)
      66  rows processed



SQL execution details on Postgredql Database.


qpsnap1pg=> explain (analyze on, buffers on, timing on) SELECT IAT_ID, IAT_NAME, IAT_TYPE, IAV_VALUE, IAV_APPROVED FROM V_ITEM_ATTRIBUTEs WHERE IAV_ITM_ID = 2904107;
                                                                                       QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop  (cost=0.84..1282.74 rows=3 width=53) (actual time=0.904..464.233 rows=66 loops=1)
   Buffers: shared hit=65460
   ->  Index Scan using idx_iav_itm_id on item_attribute_value a  (cost=0.57..1275.83 rows=3 width=29) (actual time=0.895..463.787 rows=66 loops=1)
         Index Cond: (iav_itm_id = '2904107'::numeric)
         Filter: (iav_version = (SubPlan 2))
         Rows Removed by Filter: 11931
         Buffers: shared hit=65261
         SubPlan 2
           ->  Result  (cost=1.87..1.88 rows=1 width=32) (actual time=0.036..0.036 rows=1 loops=11997)
                 Buffers: shared hit=59985
                 InitPlan 1 (returns $2)
                   ->  Limit  (cost=0.57..1.87 rows=1 width=5) (actual time=0.034..0.034 rows=1 loops=11997)
                         Buffers: shared hit=59985
                         ->  Index Only Scan Backward using unique_iav_version on item_attribute_value b  (cost=0.57..3.17 rows=2 width=5) (actual time=0.032..0.032 rows=1 loops=11997)
                               Index Cond: ((iav_itm_id = a.iav_itm_id) AND (iav_iat_id = a.iav_iat_id) AND (iav_version IS NOT NULL))
                               Heap Fetches: 11997
                               Buffers: shared hit=59985
   ->  Index Scan using pk_iat_id on item_attribute  (cost=0.28..2.29 rows=1 width=29) (actual time=0.003..0.004 rows=1 loops=66)
         Index Cond: (iat_id = a.iav_iat_id)
         Buffers: shared hit=199
Planning time: 0.554 ms
Execution time: 464.439 ms
(22 rows)

Time: 1616.691 ms
qpsnap1pg=>

V_item_attributes view code as below, same in oracle and postgresql.
-------------------------------------------------------------------------------------
SELECT a.iav_id,
    a.iav_itm_id,
    a.iav_iat_id,
    a.iav_value,
    a.iav_version,
    a.iav_approved,
    a.iav_create_date,
    a.iav_created_by,
    a.iav_modify_date,
    a.iav_modified_by,
    item_attribute.iat_id,
    item_attribute.iat_name,
    item_attribute.iat_type,
    item_attribute.iat_status,
    item_attribute.iat_requires_approval,
    item_attribute.iat_multi_valued,
    item_attribute.iat_inheritable,
    item_attribute.iat_create_date,
    item_attribute.iat_created_by,
    item_attribute.iat_modify_date,
    item_attribute.iat_modified_by,
    item_attribute.iat_translated
   FROM (item_attribute_value a
     JOIN item_attribute ON ((a.iav_iat_id = item_attribute.iat_id)))
  WHERE (a.iav_version = ( SELECT max(b.iav_version) AS max
           FROM item_attribute_value b
          WHERE ((b.iav_itm_id = a.iav_itm_id) AND (b.iav_iat_id = a.iav_iat_id))));


Oracle is using push predicate of IAV_ITM_ID column wherever item_attribute_values table being used.
Any alternatives available to reduce view execution time in postgresql database or any hints, thoughts would be appreciated.

Thanks,
Pavan.



view thread (3+ messages)  latest in thread

Message-ID: <9909AFED-314C-4AFE-AF7F-77645E7FAA2F@amazon.com>
Permalink:  ../9909AFED-314C-4AFE-AF7F-77645E7FAA2F@amazon.com/
Also on:    postgresql.org/message-id/9909AFED-314C-4AFE-AF7F-77645E7FAA2F@amazon.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-performance@postgresql.org
  Cc: pkreddy@amazon.com
  Subject: Re: View preformance oracle to postgresql
  In-Reply-To: <9909AFED-314C-4AFE-AF7F-77645E7FAA2F@amazon.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox