【发布时间】:2021-11-20 19:06:55
【问题描述】:
此查询用于每晚将大约 600,000 行数据导入数据仓库中的目标表。每次导入前都会截断目标表。
SELECT -- Around 70 fields from MainTable which contains around 600,000 rows
-- Around 150 fields from around 50 various tables, some quite big
-- Around 35 fields from XQuery derived table queries such as dt_EXTERNAL_CODE1
FROM MainTable
LEFT JOIN -- Around 50 tables
LEFT JOIN
(
SELECT df.ParentID,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/A/Number)[1]', 'float'),0) AS a,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/B/Number)[1]', 'float'),0) AS b,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/C/Number)[1]', 'float'),0) AS c,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/D/Number)[1]', 'float'),0) AS d,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/E/Number)[1]', 'float'),0) AS e,
ISNULL(df2.XMLValue.value('(Item/*[local-name()="CustomData"]/root/F/Number)[1]', 'float'),0) AS f
FROM DynamicField df
INNER JOIN DynamicField df1 ON df.DynamicFieldID = df1.DynamicFieldID
INNER JOIN DynamicField df2 ON df1.DynamicFieldID = df2.ParentID
WHERE df2.XMLValue.value('(Item/*[local-name()="ExternalCode"])[1]', 'nvarchar(50)') IN('EXTERNAL_CODE1')
) dt_EXTERNAL_CODE1 ON MainTable.DynamicFieldID = dt_EXTERNAL_CODE1.ParentID
LEFT JOIN -- 6 more like the derived table query above, but with some other external code
SSIS 导入作业大约需要 10 小时才能完成。有关如何优化此查询的任何建议?联接不能是内部联接。
【问题讨论】:
-
trenton 提供了一个深思熟虑的答案,但是,您为什么不先将 XML 暂存到关系表中呢?那必须更快。
-
检查瓶颈在哪里 - 如果在 SSMS 中运行查询,需要 10 个小时吗?接下来,运行包但不要在任何地方插入数据,用派生列或不做任何事情的东西替换目标。让我们知道您发现了什么,瓶颈可能是源查询、打包或插入数据。
标签: sql sql-server ssis query-optimization xquery