从多个辅助表中获取数据时存储过程性能问题

时间:2014-07-23 11:26:21

标签: sql sql-server

让我解释一下我的存储过程的场景:我必须填充一个表,其中列来自几个表。下面是我在查询中使用的几个表中的一个示例表

数据

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的精细数据位于PrimaryID1PrimaryID2,但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万不等。我希望这很有帮助。

1 个答案:

答案 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