Search



Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Using Separate Snapshot Tables

One of the points identified in the previous section is that snapshot queries and database views are less likely to perform less as well than as direct access to database tables. As show in  shown in 

Caption reference
CapRefIdtesting-performance-of-queries-on-snapshot-tables-and-snapshot-views
CapRefTypeTable
on the SNOMED CT example database confirm that there is a substantial performance difference between these two approaches.

Caption label
CapIdtesting-performance-of-queries-on-snapshot-tables-and-snapshot-views
CapTypeTable
Testing Performance of Queries on Snapshot Tables and Snapshot Views



Snapshot Table
seconds

Snapshot Views


Footnote Macro

These views are defined using the general form described in

Link to heading
HeadingRepresenting Snapshots as Database Views
Page4.6.2. Versioned Database Table Views
Text4.6.2
.



seconds

Performance Ratio
Read 1 million rows from relationship snapshot1.5211.0615%
Read 1 million rows from description snapshot3.5712.7328%
Read all rows from concept snapshot0.662.4526%
Total time for all operations above5.7525.7422%
Advanced test reading 10,000 relationships and with joins to descriptions and language reference set for the fully specified names of source, type and target concept2.344.7050%



Based on these finding findings the most effective way to optimize access to a snapshot view, is to replace the use of database views with snapshot tables. Representing the a snapshot with tables, rather than using a database view, adds roughly 2.6 Gb to the storage requirements for the example database. 

The current snapshot view is essential and is used for most interactions with the database. Therefore, the performance enhancements justify use of the additional disk space required to store the current snapshot in separate tables. If there are specific reasons for extensive access to one or two retrospective snapshots, it might also be worthwhile representing those snapshots in separate tables. However, it would not be worthwhile to apply the same approach to the full range of less frequently used retrospective snapshots.   Therefore, if the snapshot views defined in 

Link to heading
HeadingRepresenting Snapshots as Database Views
Page4.6.2. Versioned Database Table Views
Text4.6.2
 do not perform sufficiently well, it is worth considering ways to optimize snapshot access.

...

Snapshot Flags Optimization Method

Overview

A columns are column is added to each full release table. This column is used to represent flags that indicate which snapshot views view each row is included in.

Practical Example

...

Code Block
languagesql
titleIllustrative Example of a Flag Setting Query
SET SQL_SAFE_UPDATES=0;
update full_tableName tbl
 set flag=flag | 1
 where tbl.effectiveTime=(select max(sub.effectiveTime) from copy_full_tableName sub where sub.id=tbl.id and sub.effectiveTime<='20190731');
update full_tableName tbl
 set flag=flag | 2
 where tbl.effectiveTime=(select max(sub.effectiveTime) from copy_full_tableName sub where sub.id=tbl.id and sub.effectiveTime<='20190131');
update full_tableName tbl
 set flag=flag | 4
 where tbl.effectiveTime=(select max(sub.effectiveTime) from copy_full_tableName sub where sub.id=tbl.id and sub.effectiveTime<='20180731');
update full_tableName tbl
 set flag=flag | 8
 where tbl.effectiveTime=(select max(sub.effectiveTime) from copy_full_tableName sub where sub.id=tbl.id and sub.effectiveTime<='20180131');
SET SQL_SAFE_UPDATES=1;




Once the flags are set, a query such as the one below can be used to return component versions that are part of a particular snapshot view. The example query returns row in which the flag the second bit (value 2) is set. Based on the settings in the query above this means it would include rows that are part of the 2019-01-31 snapshot view of this table

...

Code Block
languagesql
titleIllustrative Example of Queries Setting the supersededTime Value
-- Create temporary table for the supersededTime values
CREATE TEMPORARY TABLE tmp (id CHAR(36) NOT NULL,effectiveTime DATETIME,supersededTime DATETIME, PRIMARY KEY (id,effectiveTime));

-- Compute the supersededTime values for each combination of id+effectiveTime and add these to the temporary file
INSERT INTO tmp SELECT tbl.id, tbl.effectiveTime, (SELECT IFNULL(MIN(sub.effectiveTime),DATE "99991231") FROM full_tableName sub
    WHERE tbl.id=sub.id AND tbl.effectiveTime<sub.effectiveTime) supersededTime FROM full_tableName tbl;

-- Apply the appropriate supersededTime values to each row in the full table
UPDATE full_tableName tbl
    JOIN tmp
    SET tbl.supersededTime=tmp.supersededTime
        WHERE tmp.id=tbl.id AND tmp.effectiveTime=tbl.effectiveTime;

Once the flags superseded time values are set, a query such as the one below can be used to return component versions that are part of a particular snapshot view. The example query returns row in which the flag the second bit (value 2) is set. Based on the settings in the query above this means it would include rows that are part of the 2019-01-31 snapshot view of this table

...