this continues the previous post on the oracle compatibility layer available in ppas. while this previous post introduced some parameters which control the behaviour for dates, strings, object names and transaction isolation this post focusses on some features/helpers that are available in oracle but are not (by default) in plain postgresql. ppas adds these whith the oracle compatibility layer.
dual
as in oracle there is a dual table in ppas:
edb=# select 1+1 from dual; ?column? ---------- 2 (1 row) edb=# \d dual; Table "sys.dual" Column | Type | Modifiers --------+----------------------+----------- dummy | character varying(1) |
synonyms
there are no synonyms available in community postgres. there are in ppas:
edb=# create table t1 ( a int ); CREATE TABLE edb=# insert into t1 values (1); INSERT 0 1 edb=# create synonym s1 for t1; CREATE SYNONYM edb=# create public synonym ps1 for t1; CREATE SYNONYM edb=# select count(*) from s1; count ------- 1 (1 row) edb=# select count(*) from ps1; count ------- 1 (1 row)
for describing synonyms “describe” must be used, the “\d” switch will not work:
edb=# desc ps1 List of synonyms Schema | Synonym | Referenced Schema | Referenced Object | Link | Owner --------+---------+-------------------+-------------------+------+-------------- public | ps1 | enterprisedb | t1 | | enterprisedb (1 row) Table "enterprisedb.t1" Column | Type | Modifiers --------+---------+----------- a | integer | edb=# \d ps1 Did not find any relation named "ps1".
more details here.
rownum
the pseudo column rownum is available in ppas:
edb=# create table t1 ( a int ); CREATE TABLE edb=# insert into t1 values ( generate_series ( 1, 50 ) ); INSERT 0 50 edb=# select a, rownum from t1 where rownum < 5; a | rownum ---+-------- 1 | 1 2 | 2 3 | 3 4 | 4 (4 rows)
more details here.
packages
community postgresql does not know the concept of packages. ppas implements this:
edb=# create package p1 edb-# as edb$# procedure pc1; edb$# end p1; CREATE PACKAGE edb=# create package body p1 edb-# as edb$# procedure pc1 edb$# as edb$# begin edb$# dbms_output.put_line('a'); edb$# end pc1; edb$# begin edb$# null; edb$# end p1; CREATE PACKAGE BODY edb=# exec p1.pc1; a EDB-SPL Procedure successfully completed
more details here.
build-in packages
ppas comes with a set of build-in packages:
edb=# select distinct name from dba_source where type = 'PACKAGE' order by 1; name ---------------- DBMS_ALERT DBMS_CRYPTO DBMS_JOB DBMS_LOB DBMS_LOCK DBMS_MVIEW DBMS_OUTPUT DBMS_PIPE DBMS_PROFILER DBMS_RANDOM DBMS_RLS DBMS_SCHEDULER DBMS_SQL DBMS_UTILITY UTL_ENCODE UTL_FILE UTL_HTTP UTL_MAIL UTL_SMTP UTL_TCP UTL_URL
more details here.
edbplus
if someone prefers to work in a splplus like environment there is edbplus:
pwd /opt/PostgresPlus/9.4AS -bash-4.2$ edbplus/edbplus.sh enterprisedb/admin123 Connected to EnterpriseDB 9.4.1.3 (localhost:5444/edb) AS enterprisedb EDB*Plus: Release 9.4 (Build 33.0.0) Copyright (c) 2008-2015, EnterpriseDB Corporation. All rights reserved. SQL> help index Type 'HELP [topic]' for command line help. @ ACCEPT APPEND CHANGE CLEAR COLUMN CONNECT DEFINE DEL DESCRIBE DISCONNECT EDBPLUS EDIT EXIT GET HELP HOST INDEX INPUT LIST PASSWORD PAUSE PRINT PROMPT QUIT REMARK SAVE SET SHOW SPOOL START UNDEFINE VARIABLE
head over to the documentation to check what is already supported.
Dynamic Runtime Instrumentation Tools Architecture (DRITA)
drita is a kind of perfstat which can be used to analyse performance issues. the usage is straight forward:
as a first step timed_statistics need to be enabled:
edb=# show timed_statistics; timed_statistics ------------------ off (1 row) edb=# alter system set timed_statistics=true; ALTER SYSTEM edb=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) edb=# show timed_statistics; timed_statistics ------------------ on (1 row)
after that lets create a snapshot:
edb=# SELECT * FROM edbsnap(); edbsnap ---------------------- Statement processed. (1 row)
… and generate some load on the system:
edb=# create table t1 ( a int, b int ); CREATE TABLE edb=# create table t2 ( a int, b int ); CREATE TABLE edb=# insert into t1 values ( generate_series ( 1,10000) , generate_series ( 1,10000) ); INSERT 0 10000 edb=# insert into t2 values ( generate_series ( 1,10000) , generate_series ( 1,10000) ); INSERT 0 10000 edb=# select count(*) from t1, t2; count ----------- 100000000 (1 row)
create another snapshot:
edb=# SELECT * FROM edbsnap(); edbsnap ---------------------- Statement processed. (1 row)
as we need the snapshot ids to generate a report lets check what we have available:
edb=# select * from get_snaps(); get_snaps ----------------------------- 1 24-FEB-15 16:21:55.420802 2 24-FEB-15 16:25:16.429357 (2 rows)
now we can generate a report, e.g. the report for system wait information:
edb=# select * from sys_rpt(1,2,10); sys_rpt ----------------------------------------------------------------------------- WAIT NAME COUNT WAIT TIME % WAIT --------------------------------------------------------------------------- autovacuum lock acquire 18 0.040010 73.84 query plan 2 0.011015 20.33 db file read 6 0.003124 5.77 xid gen lock acquire 3 0.000021 0.04 sinval lock acquire 7 0.000006 0.01 buffer free list lock acquire 9 0.000005 0.01 freespace lock acquire 0 0.000001 0.00 wal buffer mapping lock acquire 0 0.000000 0.00 multi xact gen lock acquire 3 0.000000 0.00 wal flush 0 0.000000 0.00 (12 rows)
there are many other reports which can be generated, inluding:
- sess_rpt() for session wait information
- sessid_rpt() for session ID information for a specified backend
- sesshist_rpt() for session wait information for a specified backend
- edbreport() for data from the other reporting functions, plus additional system information
- …
more details here.
oracle like catalog views
various oracle like catalog views (all_*, dba_*, user_*) are available in ppas:
edb=# select schemaname,viewname from pg_views where viewname like 'dba%' order by 1,2 limit 5; schemaname | viewname ------------+------------------ sys | dba_all_tables sys | dba_cons_columns sys | dba_constraints sys | dba_db_links sys | dba_ind_columns (5 rows)
more details here.
summary
enterprise db did a great job making life easier for oracle dbas wanting to learn postgresql. in addition the oracle compatibility layer lowers the burdens of migrating applications from oracle to postgres significantly. you almost can start immediately working on a postgresql database by using your existing oracle skills.
the above is only a sub-set of what the oracle compatibility layer provides. for a complete overview check the official documentation.