Archive for May 28th, 2009
Generating XML in subqueries
From Stack Overflow:
I have a query that looks like
SELECT P.Column1, P.Column2, P.Column3, ( SELECT A.ColumnX, A.ColumnY FROM dbo.TableReturningFunc1(@StaticParam1, @StaticParam2) AS A WHERE A.Key = P.Key FOR XML AUTO, TYPE ), ( SELECT B.ColumnX, B.ColumnY, FROM dbo.TableReturningFunc2(@StaticParam1, @StaticParam2) AS B WHERE B.Key = P.Key FOR XML AUTO, TYPE ) FROM ( /* joined tables here */ ) AS P FOR XML AUTO, ROOT('ROOT')
P
has about 5,000 rows.
A
andB
, about 4,000 rows each.This query has a runtime performance of more than 10 minutes.
Changing it to this, however:
SELECT P.Column1, P.Column2, P.Column3 INTO #P FROM ( /* joined tables here ) p SELECT A.ColumnX, A.ColumnY INTO #A FROM dbo.TableReturningFunc1(@StaticParam1, @StaticParam2) AS A SELECT B.ColumnX, B.ColumnY INTO #B FROM dbo.TableReturningFunc2(@StaticParam1, @StaticParam2) AS B SELECT P.Column1, P.Column2, P.Column3, ( SELECT A.ColumnX, A.ColumnY FROM #A AS A WHERE A.Key = P.Key FOR XML AUTO, TYPE ), ( SELECT B.ColumnX, B.ColumnY, FROM #B AS B WHERE B.Key = P.Key FOR XML AUTO, TYPE ) FROM #P AS P FOR XML AUTO, ROOT('ROOT'), has a performance of about 4 seconds.
This makes not a lot of sense, as it would seem the cost to insert into a temp table and then do the join should be higher by default.
My inclination is that SQL is doing the wrong type of "join" with the subquery, but maybe I've missed it, there's no way to specify the join type to use with correlated subqueries.
Is there a way to achieve this without using
#temptable
's or@table_variable
's via indexes and/or hints?
The reason for this is obvious: SQL Server needs to reevaluate the function each time the subquery is called, which is long.
When the subquery result is cached in the temp table, SQL Server will just build an index over this table in an Eager Spool
, and use this index in the joins.
But is it possible to increase performance without using temporary tables?
Let's create sample functions, tables and see:
Read the rest of this entry »