T-SQL需要帮助优化表值函数

时间:2013-01-28 12:34:49

标签: tsql function sql-server-2012

我需要帮助来优化我的一个函数中的SQL逻辑。请注意,我无法使用商店程序。

这是我的桌子。它将使用包含大量记录的@MainTable进行初始化。

DECLARE TABLE @ResultTable
(
    ResultValue INT
)

这些是存储一些参数的表 - 它们也可以是emty。

DECLARE TABLE @ParameterOne (ParameterOne INT)
DECLARE TABLE @ParameterTwo (ParameterOne NVARCHAR(100))
...
DECLARE TABLE @ParameterN(ParameterN TINYINT)

现在,我需要将很多表连接到我的@MainTable,以便仅从中选择一些记录。 所选记录取决于参数表中存储的信息。

所以,我目前的解决方案是:

INSERT INTO  ResultTable(ResultValue)
SELECT ResultValue 
FROM MainTable M
INNER JOIN @MainOne MO
    ON M.ID=MO.ID
....
INNER JOIN @MainN MN
    ON M.IDN=MN.ID
WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=MO.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))
       AND 
      ...
       AND
      (EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterN=MN.Name) OR NOT EXISTS (SELECT 1 FROM @ParameterN ))

因此,我们的想法是仅在记录与参数表中的当前条件匹配时才添加记录。

因为我无法使用过程来构建动态查询,所以我将WHERE子句与EXISTS和NOT EXISTS的组合用于每个参数表。

问题是当我添加越来越多的参数表时,它工作得更慢。是否有其他方法可以在不使用大量IF / ELSE语句检查哪些参数表有记录的情况下执行此操作 - 这将使函数更大且难以读取。

欢迎提出意见和建议。

1 个答案:

答案 0 :(得分:1)

好问题。

尝试以下方法:

INSERT INTO  ResultTable(ResultValue)
SELECT ResultValue 
FROM MainTable M
INNER JOIN (SELECT * FROM @MainOne WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=@MainOne.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))) MO
    ON M.ID=MO.ID
....
INNER JOIN (SELECT * FROM @MainN WHERE (EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterOne=@MainN.Name OR NOT EXISTS (SELECT 1 FROM @ParameterN))) MO
    ON M.IDN=MN.ID

优点:

  1. JOIN的结果更快,因为它不处理所有数据(已经过滤)
  2. 调整
  3. 看起来更简单