Minimalistic Oracle contains a collection of practical examples from my encounters with Oracle technologies. When relevant, I also write about other technologies, like Linux or PostgreSQL. Many of the posts starts with "how to" since they derive directly from my own personal experience. My goal is to provide simple examples, so that they can be easily adapted to other situations.
Tuesday, March 31, 2020
What is the difference between real-time apply and real-time query?
Real-time apply is the process of applying the redo in the current standby redo log file as it is being filled, in contrast to waiting for the standby redo log to be filled up. By default, apply services will wait for a standby redo log file to be archived, then apply the redo that it contains.
Real-time query is the process of applying redo redo while the physical standby database is open
This allows for read-only usage of the data which is identical to the primary database.
Note: Real-time query is licenced as the "Active Data Guard" option.
Real-time apply is documented here
Real-time query is documented here
Wednesday, March 25, 2020
How to list index subpartitions and their sizes
SELECT IDXSUBPART.INDEX_OWNER, IDXSUBPART.INDEX_NAME, IDXSUBPART.PARTITION_NAME, IDXSUBPART.SUBPARTITION_NAME,IDXSUBPART.TABLESPACE_NAME, ROUND(SUM(BYTES)/1024/1024/1024) "GB" FROM DBA_IND_SUBPARTITIONS IDXSUBPART JOIN DBA_SEGMENTS S ON (IDXSUBPART.SUBPARTITION_NAME = S.PARTITION_NAME ) WHERE IDXSUBPART.INDEX_NAME='SALES' AND IDXSUBPART.TABLESPACE_NAME='SH' AND S.SEGMENT_TYPE='INDEX SUBPARTITION' GROUP BY IDXSUBPART.INDEX_OWNER, IDXSUBPART.INDEX_NAME, IDXSUBPART.PARTITION_NAME, IDXSUBPART.SUBPARTITION_NAME,IDXSUBPART.TABLESPACE_NAME;
Output:
INDEX_OWNER | INDEX_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLESPACE_NAME | GB |
---|---|---|---|---|---|
SH | SALES_IDX_SK1 | SYS_P18153 | SYS_SUBP14709 | DATA1 | 1 |
SH | SALES_IDX_SK1 | SYS_P18157 | SYS_SUBP14831 | DATA1 | 1 |
SH | SALES_IDX_SK1 | SYS_P18158 | SYS_SUBP14862 | DATA2 | 25 |
SH | SALES_IDX_SK1 | SYS_P18157 | SYS_SUBP14832 | DATA1 | 0 |
SH | SALES_IDX_SK1 | SYS_P18142 | SYS_SUBP12409 | DATA2 | 32 |
SH | SALES_IDX_SK1 | SYS_P18139 | SYS_SUBP12414 | DATA1 | 1 |
Tuesday, March 24, 2020
How do you move an index organized table?
The following index needs to be moved from tablespace DATA1 to tablespace DATA2:
select unique segment_name,segment_type,tablespace_name from dba_segments where owner='SCOTT' and tablespace_name = 'DATA1' ;Result:
SEGMENT_NAME | SEGMENT_TYPE | TABLESPACE_NAME |
---|---|---|
COUNTRY_ID_PK | INDEX | DATA1 |
Turns out, the index belongs to an IOT:
select i.owner,i.table_name,i.tablespace_name,i.status, t.iot_type from dba_indexes i join dba_tables t on (i.table_name = t.table_name) and t.table_name ='COUNTRIES' and t.owner=i.owner where i.index_name='COUNTRY_ID_PK' and i.owner='SCOTT';Result in:
OWNER | TABLE_NAME | TABLESPACE_NAME | STATUS | IOT_TYPE |
---|---|---|---|---|
SCOTT | COUNTRIES | DATA1 | VALID | IOT |
If you try to move the index COUNTR_ID_PK with the usual "alter index ... rebuild" clause, it will fail with
ORA-28650: Primary index on an IOT cannot be rebuilt
Instead, move the table. Since it's an IOT, the index will be moved automatically with it:
alter table SCOTT.COUNTRIES move tablespace DATA2 ONLINE;
Verify that the IOT was moved by executing the same query as previously:
OWNER | TABLE_NAME | TABLESPACE_NAME | STATUS | IOT_TYPE |
---|---|---|---|---|
SCOTT | COUNTRIES | DATA2 | VALID | IOT |
Friday, March 20, 2020
A function that shows schema size in PostgreSQL
Thanks to Emanuel Calvo for publishing this procedure.
I put it in a script:
SET search_path TO public; SHOW search_path; CREATE OR REPLACE FUNCTION pg_schema_size(text) RETURNS BIGINT AS $$ SELECT SUM(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename)))::BIGINT FROM pg_tables WHERE schemaname = $1 $$ LANGUAGE SQL;
and then executed it:
]$ psql psql (11.7) Type "help" for help. postgres=# \i cre_funk.sql SET search_path ------------- public (1 row) CREATE FUNCTION
When this is done, it can be executed in any database part of the postgres instance, as long as you connect to the right one first:
postgres=# \connect sales You are now connected to database "sales" as user "postgres". sales=# select pg_size_pretty(pg_schema_size('sales_archive')); pg_size_pretty ---------------- 28 MB (1 row)Av en eller annen grunn får vi nå: HINT: No function matches the given name and argument types. You might need to add explicit type casts. når vi kjører den i postgres versjoner > 11
Comparing users, schemas, instances and databases between Oracle and PostgreSQL
If you have to deal with both Oracle and PostgreSQL databases in your daily work, it can be confusing to deal with terms such as users, schemas and instances, since they mean different things in each software installation.
After discussing the matter with an experienced coworker, I have made the following matrix which may clarify the differences and the similarities between the two:
Oracle | PostgreSQL |
---|---|
One database may contain many schemas | One database may contain many schemas |
A user equals a schema | A user equals a role (with login) |
One instance supports one database * | One instance may support many databases |
One user belongs to one database | One user belongs to the entire instance |
Users belong in a global namespace together with roles and public synonyms | Users does not belong in any namespace |
By default, users can only access objects in their own schema | By default, users can only access objects in the schemas that they own |
For a user to access objects in a different schema, object privileges or the ANY system privilege is required | For a user to access objects in a different schema, in must be granted USAGE on the schema |
A schema has a password | A schema does not have a password |
A schema cannot be owned by a (another) user | A schema is owned by a user, by default the user that created the schema |
A schema may contain up until 3 namespaces: one for indexes, another one for constraints and a final one for tables, views, sequences etc. | A schema is in itself a namespace. This namespace may in turn contain tables, views, indexes etc |
* Exceptions to this rule are 1) Oracle RAC, where multiple instances support one database and 2) Oracle Multitenant, where one instance supports many pluggable databasess
A good tutorial regarding schemas can be found here
Wednesday, March 18, 2020
How to display a run-time parameter in a postgreSQL instance
Like with Oracle, PostgreSQL has an easy way to display run-time parameters:
[postgres@oric-pg01~]$ psql psql (11.7) Type "help" for help. postgres=# show log_min_duration_statement; log_min_duration_statement ---------------------------- -1 (1 row)
the log_min_duration_statement parameter is documented here
Monday, March 16, 2020
How to specifiy default compression for a tablespace
CREATE BIGFILE TABLESPACE star_data DATAFILE
'/oradata/proddb01/star_data.dbf' SIZE 1024M AUTOEXTEND ON NEXT 128M MAXSIZE 12T
LOGGING
DEFAULT
TABLE COMPRESS FOR OLTP
INDEX COMPRESS ADVANCED LOW
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
'/oradata/proddb01/star_data.dbf' SIZE 1024M AUTOEXTEND ON NEXT 128M MAXSIZE 12T
LOGGING
DEFAULT
TABLE COMPRESS FOR OLTP
INDEX COMPRESS ADVANCED LOW
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
Note that the syntax used for tablespaces
TABLE COMPRESS FOR OLTPis equivalent to the ROW STORE COMPRESS ADVANCED clause of CREATE TABLE.
Read more about tablespaces with default compression attributes in the 12.2 documentation
Subscribe to:
Posts (Atom)