我有一个查询,看起来像这样:
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有大约5000行数据,A和B各有约4000行。
这个查询的运行时间大约需要10分钟以上。
然而,将它改为以下形式:
SELECT
P.Column1,
P.Column2,
P.Column3,
...
INTO #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')
执行速度大约为4秒。
这似乎不太合理,因为插入到临时表中并执行连接应该默认成本更高。我认为 SQL 正在使用错误类型的子查询“连接”,但也许我错了,因为没有办法指定与相关子查询一起使用的连接类型。
是否有一种方法可以通过索引和/或提示来实现,而不使用 #temp 表/@table 变量呢?
编辑:请注意,dbo.TableReturningFunc1 和 dbo.TableReturningFunc2 是内联 TVF,而不是多语句或“参数化”视图语句。