为此需要一个优化查询



下面是我当前的SQL。

Insert into [dbo].[XYZ]
select col1,col2,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col3,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col4,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col5 from [dbo].[ABC]

此语句重复调用parsedData函数。表 ABC 有数百万条记录。

那么是否有任何 SQL 来保存parsedData的结果,因此只调用一次parsedData,而不是多次调用。

您可以执行交叉应用(或外部应用(。

交叉应用是相关子查询的替代方法,也可用于"联接函数"。我手边没有一个好的例子,但这里有一些希望有用的链接:

  • https://blog.sqlauthority.com/2016/09/23/sql-server-join-table-valued-function-database-table/
  • https://www.sqlshack.com/the-difference-between-cross-apply-and-outer-apply-in-sql-server/
  • 现实生活中的例子,什么时候在SQL中使用外部/交叉应用

你可以做:

Insert into [dbo].[XYZ]
select abc.col1, abc.col2, p.col3, p.col4, p.col5
from [dbo].ABC abc outer apply
(select max(case when name = 'value1' then colvalue end) as col3,
max(case when name = 'value2' then colvalue end) as col4,
max(case when name = 'value3' then colvalue end) as col5             
from parsedData(abc.ParameterizedValue) p
) p;

这应该可以节省对相同数据的多次解析。

最新更新