T-SQL多选语句性能

时间:2015-06-30 18:02:14

标签: sql sql-server performance tsql database-performance

我需要执行大约20个select语句来获取我的应用程序的信息。我正在将结果集分组为一个,但我不确定是否有更好的方法来解决这个问题(更具性能的方式)。

我正在遵循这种方法:

SELECT TB_A.QTD,
TB_B.QTD
FROM
(
    SELECT COUNT(1) AS QTD
    FROM TB_A WITH(NOLOCK)
    WHERE TP = 2
    AND A = 1
    AND N = @N
) TB_A,
(
    SELECT COUNT(1) QTD
    FROM TB_B WITH(NOLOCK)
    WHERE G = @G
    AND U = @U
) TB_B,
...other 18 statements

PS:@n,@ g和@u等变量是用户通知的参数。

4 个答案:

答案 0 :(得分:4)

您的查询没问题(我会使用明确的CROSS JOIN而不是,,因为我在FROM子句中厌恶逗号。

对于性能,两个索引会有所帮助:tb_a(TP, A, N)tb_b(G, U)

答案 1 :(得分:1)

我发现一个巨大的查询通常对性能不利,而将其分解为更易于管理的部分可能有所帮助。在您对各个表进行过滤的内容上添加任何覆盖或过滤索引也应该有所帮助。

Declare @AQTD int,@BQTD int

Select @AQTD=COUNT(1)
FROM TB_A WITH(NOLOCK)
WHERE TP = 2
AND A = 1
AND N = @N

Select @BQTD=COUNT(1) 
FROM TB_B WITH(NOLOCK)
WHERE G = @G
AND U = @U

SELECT @AQTD,@BQTD

答案 2 :(得分:1)

我是第二个@GordonLinoff。 或者,您可以这样写 - 但性能将是相同的。

SELECT 
(
    SELECT COUNT(1) 
    FROM TB_A WITH(NOLOCK)
    WHERE TP = 2
    AND A = 1
    AND N = @N
) QTD_A, 
(
    SELECT COUNT(1) QTD
    FROM TB_B WITH(NOLOCK)
    WHERE G = @G
    AND U = @U
) QTD_B,
...other 18 statements

...注意,没有FROM

答案 3 :(得分:0)

为了减少执行时间,如果所有查询都是独立的,您可以从应用程序并行运行它们,但它会加载更多的服务器。