Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. -- Test run on:
  2. -- Oracle Database 11g Express Edition Release 11.2.0.2.0 (2012-02-21)
  3.  
  4. SELECT * FROM v$version;
  5.  
  6. DROP VIEW rowGenerator;
  7. DROP VIEW lAN_Anchor;
  8. DROP VIEW lANAT2_AnchorAttribute2;
  9. DROP TABLE ANAT2_AnchorAttribute2;
  10. DROP TABLE ANAT1_AnchorAttribute1;
  11. DROP TABLE AN_Anchor;
  12.  
  13. CREATE TABLE AN_Anchor (
  14.   AN_ID int NOT NULL,
  15.   CONSTRAINT pk_AN_Anchor PRIMARY KEY(AN_ID)
  16. ) ORGANIZATION INDEX;
  17.  
  18. CREATE TABLE ANAT1_AnchorAttribute1 (
  19.   AN_ID int NOT NULL,
  20.   ANAT1_AnchorAttribute1Value CHAR(10) NOT NULL,
  21.   CONSTRAINT pk_ANAT1_AnchorAttribute1
  22.     PRIMARY KEY(AN_ID),
  23.   CONSTRAINT fk_ANAT1_AnchorAttribute1
  24.     FOREIGN KEY(AN_ID) REFERENCES AN_Anchor(AN_ID)
  25. ) ORGANIZATION INDEX;
  26.  
  27. CREATE TABLE ANAT2_AnchorAttribute2 (
  28.   AN_ID int NOT NULL,
  29.   ANAT2_AnchorAttribute2Value CHAR(10) NOT NULL,
  30.   ANAT2_FromDate DATE NOT NULL,
  31.   CONSTRAINT pk_ANAT2_AnchorAttribute2
  32.     PRIMARY KEY(AN_ID, ANAT2_FromDate),
  33.   CONSTRAINT fk_ANAT2_AnchorAttribute2
  34.     FOREIGN KEY(AN_ID) REFERENCES AN_Anchor(AN_ID)
  35. ) ORGANIZATION INDEX;
  36.  
  37. CREATE VIEW rowGenerator
  38. AS
  39. WITH rowGen(n) AS (
  40.   SELECT
  41.     1 AS n
  42.   FROM
  43.     dual
  44.   UNION ALL
  45.   SELECT
  46.     1 + n AS n
  47.   FROM
  48.     rowGen
  49.   WHERE
  50.     n < 100000
  51. )
  52. SELECT
  53.   *
  54. FROM
  55.   rowGen;
  56.  
  57. INSERT INTO AN_Anchor
  58. SELECT
  59.   n
  60. FROM
  61.   rowGenerator;
  62.  
  63. INSERT INTO ANAT1_AnchorAttribute1
  64. SELECT
  65.   n,
  66.   CASE MOD(n, 3)
  67.     WHEN 0 THEN 'Red'
  68.     WHEN 1 THEN 'Green'
  69.     WHEN 2 THEN 'Blue'
  70.   END
  71. FROM
  72.   rowGenerator;
  73.  
  74. INSERT INTO ANAT2_AnchorAttribute2
  75. SELECT
  76.   n,
  77.   'Car',
  78.   TO_DATE('20120101','yyyymmdd')
  79. FROM
  80.   rowGenerator;
  81.  
  82. INSERT INTO ANAT2_AnchorAttribute2
  83. SELECT
  84.   n,
  85.   'Bus',
  86.   TO_DATE('20120102','yyyymmdd')
  87. FROM
  88.   rowGenerator;
  89.  
  90. INSERT INTO ANAT2_AnchorAttribute2
  91. SELECT
  92.   n,
  93.   'Train',
  94.   TO_DATE('20120103','yyyymmdd')
  95. FROM
  96.   rowGenerator;
  97.  
  98. CREATE VIEW lANAT2_AnchorAttribute2 (
  99.   AN_ID,
  100.   ANAT2_AnchorAttribute2Value,
  101.   ANAT2_FromDate,
  102.   CONSTRAINT pk_lANAT2_AnchorAttribute2
  103.     PRIMARY KEY(AN_ID) DISABLE NOVALIDATE,
  104.   CONSTRAINT fk_lANAT2_AnchorAttribute2
  105.     FOREIGN KEY(AN_ID) REFERENCES AN_Anchor(AN_ID) DISABLE NOVALIDATE
  106. )
  107. AS
  108. SELECT
  109.   AN_ID,
  110.   MAX(ANAT2_AnchorAttribute2Value)
  111.     KEEP (DENSE_RANK LAST ORDER BY ANAT2_FromDate),
  112.   MAX(ANAT2_FromDate)
  113. FROM
  114.   ANAT2_AnchorAttribute2
  115. GROUP BY
  116.   AN_ID;
  117.  
  118. ALTER VIEW lANAT2_AnchorAttribute2
  119. MODIFY CONSTRAINT pk_lANAT2_AnchorAttribute2 RELY;
  120. ALTER VIEW lANAT2_AnchorAttribute2
  121. MODIFY CONSTRAINT fk_lANAT2_AnchorAttribute2 RELY;
  122.  
  123. CREATE VIEW lAN_Anchor
  124. AS
  125. SELECT
  126.   AN.AN_ID,
  127.   ANAT1.ANAT1_AnchorAttribute1Value,
  128.   ANAT2.ANAT2_AnchorAttribute2Value,
  129.   ANAT2.ANAT2_FromDate
  130. FROM
  131.   AN_Anchor AN,
  132.   ANAT1_AnchorAttribute1 ANAT1,
  133.   lANAT2_AnchorAttribute2 ANAT2
  134. WHERE
  135.   ANAT1.AN_ID (+)= AN.AN_ID
  136. AND
  137.   ANAT2.AN_ID (+)= AN.AN_ID;
  138.  
  139. ALTER SESSION SET OPTIMIZER_MODE = ALL_ROWS;
  140. ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;  
  141. ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;  
  142.  
  143. -- still no table elimination on the second (historized) attribute
  144. SET AUTOTRACE ON;
  145. SELECT COUNT(*) FROM lAN_Anchor;
  146.  
  147. SET AUTOTRACE ON;
  148. SELECT COUNT(ANAT1_AnchorAttribute1Value) FROM lAN_Anchor;
  149.  
  150. SET AUTOTRACE ON;
  151. SELECT COUNT(ANAT2_AnchorAttribute2Value) FROM lAN_Anchor;
  152.  
  153. SET AUTOTRACE OFF;