T-SQL多选择语句的性能
我需要执行大约20条select语句来获取我的应用程序的信息。我将结果集归为一组,但我不确定是否有更好的方法来解决这个问题(一种更有效的方法) 我遵循这种方法: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
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。你的解决方案看起来不错。