... |
All internal materialized view refresh and updates happen atomically. Internal materialized views support READ_COMMITTED (used also for READ_UNCOMMITED) and SERIALIZABLE (used also for REPEATABLE_READ) transaction isolation levels. |
A sample Dynamic VDB that defines an internal materialization as defined below: {code:lang=XML} <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <vdb name="sakila" version="1"> <description>Shows how to call JPA entities</description> <model name="pg"> <source name="pg" translator-name="postgresql-override" connection-jndi-name="java:/sakila-ds"/> </model> <model name="sakila" type="VIRTUAL"> <metadata type="DDL"><![CDATA[ CREATE VIEW actor ( actor_id integer, first_name varchar(45) NOT NULL, last_name varchar(45) NOT NULL, last_update timestamp NOT NULL ) OPTIONS ("teiid_rel:MATVIEW_TTL" 120000, "teiid_rel:MATVIEW_PREFER_MEMORY" 'true', "teiid_rel:MATVIEW_UPDATABLE" 'true', "teiid_rel:MATVIEW_SCOPE" 'vdb') AS SELECT actor_id, first_name, last_name, last_update from pg."public".actor; ]]> </metadata> </model> <translator name="postgresql-override" type="postgresql"> <property name="SupportsNativeQueries" value="true"/> </translator> </vdb> {code} |
h1. Loading And Refreshing |
... |
Internal materialization creates Teiid temporary tables to hold the materialized table. While these tables are not fully durable, they perform well in most circumstances and the data is present at each Teiid instance which removes the single point of failure and network overhead of an external database. Internal materialization also provides more built-in facilities for refreshing and monitoring. See Memory Limitations regarding size limitations.
The Cache Hint, when used in the context of an internal materialized view transformation query provides the ability to fine tune the materialized table. The caching options are also settable via extension metadata:
Property Name | Description |
---|---|
teiid_rel:MATVIEW_PREFER_MEMEORY | Same as the pref_mem cache hint option |
teiid_rel:MATVIEW_TTL | Same as the ttl cache hint option |
teiid_rel:MATVIEW_UPDATABLE | Same as the updatable cache hint option |
teiid_rel:MATVIEW_SCOPE | Same as the scope cache hint option |
The pref_mem option also applies to internal materialized views. Internal table index pages already have a memory preference, so the perf_mem option indicates that the data pages should prefer memory as well.
All internal materialized view refresh and updates happen atomically. Internal materialized views support READ_COMMITTED (used also for READ_UNCOMMITED) and SERIALIZABLE (used also for REPEATABLE_READ) transaction isolation levels.
A sample Dynamic VDB that defines an internal materialization as defined below:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <vdb name="sakila" version="1"> <description>Shows how to call JPA entities</description> <model name="pg"> <source name="pg" translator-name="postgresql-override" connection-jndi-name="java:/sakila-ds"/> </model> <model name="sakila" type="VIRTUAL"> <metadata type="DDL"><![CDATA[ CREATE VIEW actor ( actor_id integer, first_name varchar(45) NOT NULL, last_name varchar(45) NOT NULL, last_update timestamp NOT NULL ) OPTIONS ("teiid_rel:MATVIEW_TTL" 120000, "teiid_rel:MATVIEW_PREFER_MEMORY" 'true', "teiid_rel:MATVIEW_UPDATABLE" 'true', "teiid_rel:MATVIEW_SCOPE" 'vdb') AS SELECT actor_id, first_name, last_name, last_update from pg."public".actor; ]]> </metadata> </model> <translator name="postgresql-override" type="postgresql"> <property name="SupportsNativeQueries" value="true"/> </translator> </vdb>
An internal materialized view table is initially in an invalid state (there is no data). The first user query will trigger an implicit loading of the data. All other queries against the materialized view will block until the load completes. In some situations administrators may wish to better control when the cache is loaded with a call to SYSADMIN.refreshMatView. The initial load may itself trigger the initial load of dependent materialized views. After the initial load user queries against the materialized view table will only block if it is in an invalid state. The valid state may also be controlled through the SYSADMIN.refreshMatView procedure.
CALL SYSADMIN.refreshMatView(viewname=>'schema.matview', invalidate=>true)
While the initial load may trigger a transitive loading of dependent materialized views, subsequent refreshes performed with refreshMatView will use dependent materialized view tables if they exist. Only one load may occur at a time. If a load is already in progress when the SYSADMIN.refreshMatView procedure is called, it will return -1 immediately rather than preempting the current load.
The Cache Hint may be used to automatically trigger a full snapshot refresh after a specified time to live (ttl). The ttl starts from the time the table is finished loading. The refresh is equivalent to CALL SYSADMIN.refreshMatView('view name', false), but performed asynchronously so that user queries do not block on the load.
/*+ cache(ttl:3600000) */ select t.col, t1.col from t, t1 where t.id = t1.id
The resulting materialized view will be reloaded every hour (3600000 milliseconds).
By default ttl refreshes are invalidating. That is once the ttl has expired, the next access will be required to refresh the materialized table in a blocking manner. If you would rather that the ttl is enforced lazily, such that the refresh task is performed asynchronously with the current contents not replaced until the refresh completes, set the vdb property lazy-invalidation=true. |
In advanced use-cases the cache hint may also be used to mark an internal materialized view as updatable. An updatable internal materialized view may use the SYSADMIN.refreshMatViewRow procedure to update a single row in the materialized table. If the source row exists, the materialized view table row will be updated. If the source row does not exist, the correpsonding materialized row will be deleted. To be updatable the materialized view must have a single column primary key. Composite keys are not yet supported by SYSADMIN.refreshMatViewRow. Transformation Query:
/*+ cache(updatable) */ select t.col, t1.col from t, t1 where t.id = t1.id
Update SQL:
CALL SYSADMIN.refreshMatViewRow(viewname=>'schema.matview', key=>5)
Given that the schema.matview defines an integer column col as its primary key, the update will check the live source(s) for the row values.
The update query will not use dependent materialized view tables, so care should be taken to ensure that getting a single row from this transformation query performs well. See the Reference Guide for information on controlling dependent joins, which may be applicable to increasing the performance of retrieving a single row. The refresh query does use nested caches, so this refresh method should be used with caution.
When the updatable option is not specified, accessing the materialized view table is more efficient because modifications do not need to be considered. Therefore, only specify the updatable option if row based incremental updates are needed. Even when performing row updates, full snapshot refreshes may be needed to ensure consistency.
The EventDistributor also exposes the updateMatViewRow as a lower level API for Programmatic Control - care should be taken when using this update method.
Internal materialized view tables will automatically create non-unique indexes for each unique constraint and index defined on the materialized view. These indexes are created as non-unique even for unique constraints since the materialized table is not intended as an enforcement point for data integrity and when updatable the table may not be consistent with underlying values and thus unable to satisfy constraints. The primary key (if it exists) of the view will automatically be part of the covered columns for the index.
The secondary indexes are always created as trees - bitmap or hash indexes are not supported. Teiid's metadata for indexes is currently limited. We are not currently able to capture additional information, sort direction, additional columns to cover, etc. You may workaround some of these limitations though.
Each member in a cluster maintains its own copy of each materialized table and associated indexes. An attempt is made to ensure each member receives the same full refresh events as the others. Full consistency for updatable materialized views however is not guaranteed. Periodic full refreshes of updatable materialized view tables helps ensure consistency among members.