Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL多选择语句的性能_Sql_Sql Server_Performance_Tsql_Database Performance - Fatal编程技术网

T-SQL多选择语句的性能

T-SQL多选择语句的性能,sql,sql-server,performance,tsql,database-performance,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

我需要执行大约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等变量是用户通知的参数

您的查询很好(我会使用显式的
交叉连接,而不是
,因为我讨厌
FROM
子句中的逗号)

对于性能,有两个索引会有帮助:
tb_a(TP,a,N)
tb_b(G,U)
您的查询很好(我会使用显式的
交叉连接,而不是
,因为我讨厌
FROM
子句中的逗号)


对于性能,有两个索引会有帮助:
tb_a(TP,a,N)
tb_b(G,U)
我发现单个大型查询通常对性能有害,将其分解为更易于管理的部分会有所帮助。在各个表上添加筛选依据的覆盖索引或筛选索引也会有所帮助

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

我发现单个大型查询通常对性能不利,将其分解为更易于管理的部分会有所帮助。在各个表上添加筛选依据的覆盖索引或筛选索引也会有所帮助

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
我是第二个@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
…注意,
中没有

I second@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


…注意,
中没有

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

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

只是一个警告,NOLOCK会给你带来各种奇怪的问题,比如两次读取同一行或者完全跳过一些数据。有点离题,但这里有一篇文章讨论了NOLOCK。人们经常使用它“因为它使我的查询更快”。我从来没有看到任何可行的证据证明它们更快,但我看到了很多证据证明它们产生了非常奇怪的结果。我还建议删除
NOLOCK
。如果您想要更高的速度,那么您需要创建适当的索引。这可以极大地提高查询速度。除此之外,通常不需要“帮助”优化器。只需一次优化一个选项,nolock不一定是邪恶的。我一直在用nolock。很明显,where上的索引会有所帮助。只是一个警告,NOLOCK可能会给您带来各种奇怪的问题,例如读取同一行两次或完全跳过某些数据。有点离题,但这里有一篇文章讨论NOLOCK。人们经常使用它“因为它使我的查询更快”。我从来没有看到任何可行的证据证明它们更快,但我看到了很多证据证明它们产生了非常奇怪的结果。我还建议删除
NOLOCK
。如果您想要更高的速度,那么您需要创建适当的索引。这可以极大地提高查询速度。除此之外,通常不需要“帮助”优化器。只需一次优化一个选项,nolock不一定是邪恶的。我一直在用nolock。很明显,where上的索引会有所帮助。“我发现单个大型查询通常对性能有害”==>只有在您做错的情况下才会如此。@Thiagocustdio如果您的查询速度慢,则是由于表上缺少索引。“我发现单个大型查询通常对性能有害”==>只有当你做错了。@ThiagoCustodio如果你的查询速度慢,那是因为你的表上缺少索引。我不确定你是否明白我的意思。我把这个问题修改得更清楚了。基本上,我希望避免20个连接/selects@ThiagoCustodio如果您有20个表,您将不可避免地有20个选择。@ThiagoCustodio。你的解决方案看起来不错。我不确定你是否明白我的意思。我把这个问题修改得更清楚了。基本上,我希望避免20个连接/selects@ThiagoCustodio如果您有20个表,您将不可避免地有20个选择。@ThiagoCustodio。你的解决方案看起来不错。