Advertisement
anchormodeling

Subselect vs Group By

Feb 2nd, 2012
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 4.34 KB | None | 0 0
  1. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
  2.    OBJECT_ID(N'[dbo].[AN_Anchor]') AND type in (N'U'))
  3. DROP TABLE [dbo].[AN_Anchor]
  4.  
  5. CREATE TABLE AN_Anchor (
  6.     AN_ID int NOT NULL,
  7.     PRIMARY KEY(AN_ID)
  8. );
  9.  
  10. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
  11.    OBJECT_ID(N'[dbo].[ANAT1_AnchorAttribute1]') AND type in (N'U'))
  12. DROP TABLE [dbo].[ANAT1_AnchorAttribute1]
  13.  
  14. CREATE TABLE ANAT1_AnchorAttribute1 (
  15.     AN_ID int NOT NULL references [dbo].[AN_Anchor](AN_ID),
  16.     ANAT1_AnchorAttribute1Value char(10) NOT NULL,
  17.     PRIMARY KEY(AN_ID)
  18. );
  19.  
  20. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
  21.    OBJECT_ID(N'[dbo].[ANAT2_AnchorAttribute2]') AND type in (N'U'))
  22. DROP TABLE [dbo].[ANAT2_AnchorAttribute2]
  23.  
  24. CREATE TABLE ANAT2_AnchorAttribute2 (
  25.     AN_ID int NOT NULL references [dbo].[AN_Anchor](AN_ID),
  26.     ANAT2_AnchorAttribute2Value char(10) NOT NULL,
  27.     ANAT2_FromDate date NOT NULL,
  28.     PRIMARY KEY(AN_ID, ANAT2_FromDate)
  29. );
  30.  
  31. IF  EXISTS (SELECT * FROM sys.views WHERE object_id =
  32.    OBJECT_ID(N'[dbo].[lAN_Anchor]'))
  33. DROP VIEW [dbo].[lAN_Anchor]
  34. GO
  35.  
  36. CREATE VIEW lAN_Anchor
  37. AS
  38. SELECT
  39.     AN.AN_ID,
  40.     ANAT1.ANAT1_AnchorAttribute1Value,
  41.     ANAT2.ANAT2_AnchorAttribute2Value,
  42.     ANAT2.ANAT2_FromDate
  43. FROM
  44.     AN_Anchor AN
  45. LEFT JOIN
  46.     ANAT1_AnchorAttribute1 ANAT1
  47. ON
  48.     ANAT1.AN_ID = AN.AN_ID
  49. LEFT JOIN
  50.     ANAT2_AnchorAttribute2 ANAT2
  51. ON
  52.     ANAT2.AN_ID = AN.AN_ID
  53. AND
  54.     ANAT2.ANAT2_FromDate = (
  55.         SELECT
  56.             MAX(sub.ANAT2_FromDate)
  57.         FROM
  58.             ANAT2_AnchorAttribute2 sub
  59.         WHERE
  60.             sub.AN_ID = AN.AN_ID
  61.     );
  62. GO
  63.  
  64.  
  65. CREATE VIEW lAN_Anchor_Alt
  66. AS
  67. SELECT
  68.     AN.AN_ID,
  69.     ANAT1.ANAT1_AnchorAttribute1Value,
  70.     ANAT2.ANAT2_AnchorAttribute2Value,
  71.     ANAT2.ANAT2_FromDate
  72. FROM
  73.     AN_Anchor AN
  74. LEFT JOIN
  75.     ANAT1_AnchorAttribute1 ANAT1
  76. ON
  77.     ANAT1.AN_ID = AN.AN_ID
  78. LEFT JOIN (
  79.     SELECT
  80.         AN_ID,
  81.         MAX(ANAT2_FromDate) as ANAT2_MaxFromDate
  82.     FROM
  83.         ANAT2_AnchorAttribute2
  84.     GROUP BY
  85.         AN_ID
  86. ) ANAT2_max
  87. ON
  88.     ANAT2_max.AN_ID = AN.AN_ID
  89. LEFT JOIN
  90.     ANAT2_AnchorAttribute2 ANAT2
  91. ON
  92.     ANAT2.AN_ID = ANAT2_max.AN_ID
  93. AND
  94.     ANAT2.ANAT2_FromDate = ANAT2_max.ANAT2_MaxFromDate
  95. GO
  96.  
  97.  
  98. INSERT INTO AN_Anchor (
  99.     AN_ID
  100. )
  101. VALUES
  102. (1);
  103.  
  104. INSERT INTO AN_Anchor (
  105.     AN_ID
  106. )
  107. VALUES
  108. (2);
  109.  
  110. INSERT INTO AN_Anchor (
  111.     AN_ID
  112. )
  113. VALUES
  114. (3);
  115.  
  116. update statistics AN_Anchor;
  117.  
  118. INSERT INTO ANAT1_AnchorAttribute1 (
  119.     AN_ID,
  120.     ANAT1_AnchorAttribute1Value
  121. )
  122. VALUES
  123. (1, 'Green');
  124.  
  125. INSERT INTO ANAT1_AnchorAttribute1 (
  126.     AN_ID,
  127.     ANAT1_AnchorAttribute1Value
  128. )
  129. VALUES
  130. (2, 'Blue');
  131.  
  132. INSERT INTO ANAT1_AnchorAttribute1 (
  133.     AN_ID,
  134.     ANAT1_AnchorAttribute1Value
  135. )
  136. VALUES
  137. (3, 'Red');
  138.  
  139. update statistics ANAT1_AnchorAttribute1;
  140.  
  141. INSERT INTO ANAT2_AnchorAttribute2 (
  142.     AN_ID,
  143.     ANAT2_AnchorAttribute2Value,
  144.     ANAT2_FromDate
  145. )
  146. VALUES
  147. (1, 'Car', '2008-01-01');
  148.  
  149. INSERT INTO ANAT2_AnchorAttribute2 (
  150.     AN_ID,
  151.     ANAT2_AnchorAttribute2Value,
  152.     ANAT2_FromDate
  153. )
  154. VALUES
  155. (1, 'Bus', '2008-12-12');
  156.  
  157. INSERT INTO ANAT2_AnchorAttribute2 (
  158.     AN_ID,
  159.     ANAT2_AnchorAttribute2Value,
  160.     ANAT2_FromDate
  161. )
  162. VALUES
  163. (2, 'Train', '2008-01-01');
  164.  
  165. INSERT INTO ANAT2_AnchorAttribute2 (
  166.     AN_ID,
  167.     ANAT2_AnchorAttribute2Value,
  168.     ANAT2_FromDate
  169. )
  170. VALUES
  171. (2, 'Car', '2008-12-12');
  172.  
  173. INSERT INTO ANAT2_AnchorAttribute2 (
  174.     AN_ID,
  175.     ANAT2_AnchorAttribute2Value,
  176.     ANAT2_FromDate
  177. )
  178. VALUES
  179. (3, 'Train', '2008-01-01');
  180.  
  181. INSERT INTO ANAT2_AnchorAttribute2 (
  182.     AN_ID,
  183.     ANAT2_AnchorAttribute2Value,
  184.     ANAT2_FromDate
  185. )
  186. VALUES
  187. (3, 'Bus', '2008-12-12');
  188.  
  189.  
  190. GO
  191. SET STATISTICS PROFILE ON;
  192. GO
  193. SET SHOWPLAN_TEXT ON;
  194. GO
  195.  
  196. -- tests comparing query cost using the two views
  197. -- different execution plans
  198. select * from lAN_Anchor;     -- 43%
  199. select * from lAN_Anchor_Alt; -- 57%
  200.  
  201. -- same execution plan
  202. select ANAT1_AnchorAttribute1Value from lAN_Anchor;     -- 50%
  203. select ANAT1_AnchorAttribute1Value from lAN_Anchor_Alt; -- 50%
  204.  
  205. -- different execution plans
  206. select ANAT2_AnchorAttribute2Value from lAN_Anchor;     -- 40%
  207. select ANAT2_AnchorAttribute2Value from lAN_Anchor_Alt; -- 60%
  208.  
  209. -- same execution plan
  210. select ANAT2_AnchorAttribute2Value from lAN_Anchor     -- 50%
  211. where ANAT2_AnchorAttribute2Value = 'Bus';
  212. select ANAT2_AnchorAttribute2Value from lAN_Anchor_Alt -- 50%
  213. where ANAT2_AnchorAttribute2Value = 'Bus';
  214.  
  215. -- conclusion, in SQL Server, lAN_Anchor wins when no conditions are set
  216. -- and is equally matched with lAN_Anchor_Alt otherwise
  217.  
  218. GO
  219. SET SHOWPLAN_TEXT OFF;
  220. GO
  221. SET STATISTICS PROFILE OFF;
  222. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement