Advertisement
anchormodeling

MariaDB Table Elimination

Mar 27th, 2011
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 9.04 KB | None | 0 0
  1. -- Test run on MariaDB 5.2.5 (2011 March 26)
  2.  
  3. DROP TABLE IF EXISTS AN_AT1_Anchor_Attribute1;
  4. DROP TABLE IF EXISTS AN_AT2_Anchor_Attribute2;
  5. DROP TABLE IF EXISTS AN_Anchor;
  6.  
  7. CREATE TABLE AN_Anchor (
  8.     AN_ID INT NOT NULL,
  9.     CONSTRAINT pk_AN_Anchor PRIMARY KEY(AN_ID)
  10. ) ENGINE=InnoDB;
  11.  
  12. CREATE TABLE AN_AT1_Anchor_Attribute1 (
  13.     AN_ID INT NOT NULL,
  14.     AN_AT1_Anchor_Attribute1 CHAR(10) NOT NULL,
  15.     CONSTRAINT pk_AN_AT1_Anchor_Attribute1 PRIMARY KEY(AN_ID),
  16.     CONSTRAINT fk_AN_AT1_Anchor_Attribute1 FOREIGN KEY(AN_ID) REFERENCES AN_Anchor(AN_ID) ON DELETE CASCADE
  17. ) ENGINE=InnoDB;
  18.  
  19. CREATE TABLE AN_AT2_Anchor_Attribute2 (
  20.     AN_ID INT NOT NULL,
  21.     AN_AT2_ValidFrom DATE NOT NULL,
  22.     AN_AT2_Anchor_Attribute2 CHAR(10) NOT NULL,
  23.     CONSTRAINT pk_AN_AT2_Anchor_Attribute2 PRIMARY KEY(AN_ID, AN_AT2_ValidFrom),
  24.     CONSTRAINT fk_AN_AT2_Anchor_Attribute2 FOREIGN KEY(AN_ID) REFERENCES AN_Anchor(AN_ID) ON DELETE CASCADE
  25. );
  26.  
  27. DROP VIEW IF EXISTS lAN_Anchor;
  28.  
  29. CREATE VIEW lAN_Anchor
  30. AS
  31. SELECT
  32.     AN.AN_ID,
  33.     AN_AT1.AN_AT1_Anchor_Attribute1,
  34.     AN_AT2.AN_AT2_Anchor_Attribute2,
  35.     AN_AT2.AN_AT2_ValidFrom
  36. FROM
  37.     AN_Anchor AN
  38. LEFT JOIN
  39.     AN_AT1_Anchor_Attribute1 AN_AT1
  40. ON
  41.     AN_AT1.AN_ID = AN.AN_ID
  42. LEFT JOIN
  43.     AN_AT2_Anchor_Attribute2 AN_AT2
  44. ON
  45.     AN_AT2.AN_ID = AN.AN_ID
  46. AND
  47.     AN_AT2.AN_AT2_ValidFrom = (
  48.         SELECT
  49.             MAX(sub.AN_AT2_ValidFrom)
  50.         FROM
  51.             AN_AT2_Anchor_Attribute2 sub
  52.         WHERE
  53.             sub.AN_ID = AN.AN_ID
  54.     );
  55.  
  56. INSERT INTO AN_Anchor (
  57.     AN_ID
  58. )
  59. VALUES
  60. (1),
  61. (2),
  62. (3);
  63.  
  64. ANALYZE TABLE AN_Anchor;
  65.  
  66. INSERT INTO AN_AT1_Anchor_Attribute1 (
  67.     AN_ID,
  68.     AN_AT1_Anchor_Attribute1
  69. )
  70. VALUES
  71. (1, 'Green'),
  72. (2, 'Blue'),
  73. (3, 'Red');
  74.  
  75. ANALYZE TABLE AN_AT1_Anchor_Attribute1;
  76.  
  77. INSERT INTO AN_AT2_Anchor_Attribute2 (
  78.     AN_ID,
  79.     AN_AT2_Anchor_Attribute2,
  80.     AN_AT2_ValidFrom
  81. )
  82. VALUES
  83. (1, 'Car', '2008-01-01'),
  84. (1, 'Bus', '2008-12-12'),
  85. (2, 'Train', '2008-01-01'),
  86. (2, 'Car', '2008-12-12'),
  87. (3, 'Train', '2008-01-01'),
  88. (3, 'Bus', '2008-12-12');
  89.  
  90. ANALYZE TABLE AN_AT2_Anchor_Attribute2;
  91.  
  92. SELECT * FROM lAN_Anchor;
  93.  
  94. /*
  95. +-------+-----------------------------+-----------------------------+----------------+
  96. | AN_ID | ANAT1_AnchorAttribute1Value | ANAT2_AnchorAttribute2Value | ANAT2_FromDate |
  97. +-------+-----------------------------+-----------------------------+----------------+
  98. |     1 | Green                       | Bus                         | 2008-12-12     |
  99. |     2 | Blue                        | Car                         | 2008-12-12     |
  100. |     3 | Red                         | Bus                         | 2008-12-12     |
  101. +-------+-----------------------------+-----------------------------+----------------+
  102. */
  103.  
  104. EXPLAIN extended SELECT * FROM lAN_Anchor;
  105. SHOW warnings;
  106.  
  107. /* No table can be eliminated
  108. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  109. | id | select_type        | table  | type   | possible_keys | key     | key_len | ref                | rows | filtered | Extra       |
  110. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  111. |  1 | PRIMARY            | AN     | index  | NULL          | PRIMARY | 4       | NULL               |    3 |   100.00 | Using index |
  112. |  1 | PRIMARY            | AN_AT1 | eq_ref | PRIMARY       | PRIMARY | 4       | test.AN.AN_ID      |    1 |   100.00 |             |
  113. |  1 | PRIMARY            | AN_AT2 | eq_ref | PRIMARY       | PRIMARY | 7       | test.AN.AN_ID,func |    1 |   100.00 |             |
  114. |  3 | DEPENDENT SUBQUERY | sub    | ref    | PRIMARY       | PRIMARY | 4       | test.AN.AN_ID      |    1 |   100.00 | Using index |
  115. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  116. */
  117.  
  118. SELECT AN_AT1_Anchor_Attribute1 FROM lAN_Anchor;
  119.  
  120. /*
  121. +-----------------------------+
  122. | ANAT1_AnchorAttribute1Value |
  123. +-----------------------------+
  124. | Green                       |
  125. | Blue                        |
  126. | Red                         |
  127. +-----------------------------+
  128. */
  129.  
  130. EXPLAIN extended SELECT AN_AT1_Anchor_Attribute1 FROM lAN_Anchor;
  131. SHOW warnings;
  132.  
  133. /* Table elimination in effect
  134. +----+-------------+--------+--------+---------------+---------+---------+---------------+------+----------+-------------+
  135. | id | select_type | table  | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra       |
  136. +----+-------------+--------+--------+---------------+---------+---------+---------------+------+----------+-------------+
  137. |  1 | PRIMARY     | AN     | index  | NULL          | PRIMARY | 4       | NULL          |    3 |   100.00 | Using index |
  138. |  1 | PRIMARY     | AN_AT1 | eq_ref | PRIMARY       | PRIMARY | 4       | test.AN.AN_ID |    1 |   100.00 |             |
  139. +----+-------------+--------+--------+---------------+---------+---------+---------------+------+----------+-------------+
  140. */
  141.  
  142. SELECT AN_AT1_Anchor_Attribute1 FROM lAN_Anchor WHERE AN_AT1_Anchor_Attribute1 IS NOT NULL;
  143.  
  144. /*
  145. +--------------------------+
  146. | AN_AT1_Anchor_Attribute1 |
  147. +--------------------------+
  148. | Green                    |
  149. | Blue                     |
  150. | Red                      |
  151. +--------------------------+
  152. */
  153.  
  154. EXPLAIN extended SELECT AN_AT1_Anchor_Attribute1 FROM lAN_Anchor WHERE AN_AT1_Anchor_Attribute1 IS NOT NULL;
  155. SHOW warnings;
  156.  
  157. /* Less than optimal plan: the table AN_Anchor can also be eliminated thanks to the declared foreign key
  158. +----+-------------+--------+-------+---------------+---------+---------+------+------+----------+--------------------------------+
  159. | id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                          |
  160. +----+-------------+--------+-------+---------------+---------+---------+------+------+----------+--------------------------------+
  161. |  1 | PRIMARY     | AN     | index | PRIMARY       | PRIMARY | 4       | NULL |    3 |   100.00 | Using index                    |
  162. |  1 | PRIMARY     | AN_AT1 | ALL   | PRIMARY       | NULL    | NULL    | NULL |    3 |   100.00 | Using where; Using join buffer |
  163. +----+-------------+--------+-------+---------------+---------+---------+------+------+----------+--------------------------------+
  164. */
  165.  
  166. SELECT AN_AT2_Anchor_Attribute2 FROM lAN_Anchor;
  167.  
  168. /*
  169. +-----------------------------+
  170. | ANAT2_AnchorAttribute2Value |
  171. +-----------------------------+
  172. | Bus                         |
  173. | Car                         |
  174. | Bus                         |
  175. +-----------------------------+
  176. */
  177.  
  178. EXPLAIN extended SELECT AN_AT2_Anchor_Attribute2 FROM lAN_Anchor;
  179. SHOW warnings;
  180.  
  181. /* Table elimination in effect
  182. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  183. | id | select_type        | table  | type   | possible_keys | key     | key_len | ref                | rows | filtered | Extra       |
  184. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  185. |  1 | PRIMARY            | AN     | index  | NULL          | PRIMARY | 4       | NULL               |    3 |   100.00 | Using index |
  186. |  1 | PRIMARY            | AN_AT2 | eq_ref | PRIMARY       | PRIMARY | 7       | test.AN.AN_ID,func |    1 |   100.00 |             |
  187. |  3 | DEPENDENT SUBQUERY | sub    | ref    | PRIMARY       | PRIMARY | 4       | test.AN.AN_ID      |    1 |   100.00 | Using index |
  188. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  189. */
  190.  
  191. SELECT AN_AT2_Anchor_Attribute2 FROM lAN_Anchor WHERE AN_AT2_Anchor_Attribute2 IS NOT NULL;
  192.  
  193. /*
  194. +--------------------------+
  195. | AN_AT2_Anchor_Attribute2 |
  196. +--------------------------+
  197. | Bus                      |
  198. | Car                      |
  199. | Bus                      |
  200. +--------------------------+
  201. */
  202.  
  203. EXPLAIN extended SELECT AN_AT2_Anchor_Attribute2 FROM lAN_Anchor WHERE AN_AT2_Anchor_Attribute2 IS NOT NULL;
  204. SHOW warnings;
  205.  
  206. /* Less than optimal plan: the table AN_Anchor can also be eliminated thanks to the declared foreign key
  207. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  208. | id | select_type        | table  | type   | possible_keys | key     | key_len | ref                | rows | filtered | Extra       |
  209. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  210. |  1 | PRIMARY            | AN     | index  | PRIMARY       | PRIMARY | 4       | NULL               |    3 |   100.00 | Using index |
  211. |  1 | PRIMARY            | AN_AT2 | eq_ref | PRIMARY       | PRIMARY | 7       | test.AN.AN_ID,func |    1 |   100.00 | Using where |
  212. |  3 | DEPENDENT SUBQUERY | sub    | ref    | PRIMARY       | PRIMARY | 4       | test.AN.AN_ID      |    1 |   100.00 | Using index |
  213. +----+--------------------+--------+--------+---------------+---------+---------+--------------------+------+----------+-------------+
  214. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement