让我解释一下我的存储过程的场景:我必须填充一个表,其中列来自几个表。下面是我在查询中使用的几个表中的一个示例表
数据
PrimaryID1 PrimaryID2 KeyID Data
--------------------------------------------------------------
001 0011 1 abc1
001 0011 2 abc2
002 0021 1 xyz1
由于granualar数据位于'PrimaryID1'和'PrimaryID2',我使用基于'KeyID'的相关查询来区分我填充的目标表中的不同字段。我还处理7到8个数据表中的每一个中的大量数据。最初我在一个单独的SQL语句中有所有相关的查询,但这没有用(显然!!)。然后我将每组表分成单独的CTE部分然后尝试插入到最终查询中,后来我才知道CTE绝对不会对查询性能做任何事情,所以我跳到临时表,将每组数据填充到单独的临时表中我在表中使用的每个字段中创建了非聚集索引,最后尝试在最终查询中加入它,但这仍然无法解决。
让我解释一下我在这里写的查询。我从两个表中获取数据,一个恰好是PrimaryTable
,另一个恰好是Secondary
表。 PrimaryTable
的精细数据位于PrimaryID1
和PrimaryID2
,但SecondaryTable
的粒度进一步降至KeyID
及其各自的数据列Data
。因此,我正在处理每个彼此不同的8个辅助表,因此我以每个具有大量列的辅助表的查询结束。这就是我开发的查询的样子。总的来说,我的查询中有大约280个奇数列来自8个不同的辅助表。
查询:
SELECT
PP.PrimaryID1,
PP.PrimaryID2,
(SELECT PPA.Data1
FROM SecondaryTable1 PPA
WHERE PPA.PrimaryID1 = PP.PrimaryID1 AND
PPA.PrimaryID2 = PP.PrimaryID2 AND PPA.KeyID = 1) AS DataField1,
(SELECT PPA.Data2
FROM SecondaryTable1 PPA
WHERE PPA.PrimaryID1 = PP.PrimaryID1 AND
PPA.PrimaryID2 = PP.PrimaryID2 AND PPA.KeyID = 2) AS DataField2,
(SELECT PPA.Data3
FROM SecondaryTable1 PPA
WHERE PPA.PrimaryID1 = PP.PrimaryID1 AND
PPA.PrimaryID2 = PP.PrimaryID2 AND PPA.KeyID = 3) AS DataField3
FROM
PrimaryTable PP
我正在处理8个这样的次要表,其记录数量从2800万到10万不等。我希望这很有帮助。
答案 0 :(得分:0)
对于您的样本,您应该能够使用简单的JOIN。连接通常比嵌套子查询更有效(尽管对索引一无所知,但如果它解决了您的性能问题,很难说确定)
SELECT
PP.PrimaryID1,
PP.PrimaryID2,
PPA1.Data1 AS DataField1,
PPA2.Data2 AS DataField2,
PPA3.Data3 AS DataField3
FROM PrimaryTable PP
JOIN SecondaryTable1 PPA1
ON PPA1.PrimaryID1 = PP.PrimaryID1 AND PPA1.PrimaryID2 = PP.PrimaryID2
AND PPA1.KeyID = 1
JOIN SecondaryTable1 PPA2
ON PPA2.PrimaryID1 = PP.PrimaryID1 AND PPA2.PrimaryID2 = PP.PrimaryID2
AND PPA2.KeyID = 2
JOIN SecondaryTable1 PPA3
ON PPA3.PrimaryID1 = PP.PrimaryID1 AND PPA3.PrimaryID2 = PP.PrimaryID2
AND PPA3.KeyID = 3