TSQL:查看性能问题
我对以下查询有问题。它可以工作并提供所需的结果,但速度相当慢,因为我的子选择带有连接。我的TSQL技能不足以优化此查询。也许你们中的一些人可以帮忙TSQL:查看性能问题,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我对以下查询有问题。它可以工作并提供所需的结果,但速度相当慢,因为我的子选择带有连接。我的TSQL技能不足以优化此查询。也许你们中的一些人可以帮忙 SELECT Id AS InstanceId, (SELECT COUNT(DISTINCT tiq.Id) AS Expr1 FROM dbo.tInputQueueEntry AS tiq INNER JOIN dbo.tProcessLog AS tpr ON tpr.InstanceCo
SELECT
Id AS InstanceId,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tpr.ProcessResultId = 32)) AS Received,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tiq.InMsgStateFlags = 1)) AS Queued,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tiq.InMsgStateFlags = 2)) AS Processed,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tiq.InMsgStateFlags = 128)) AS Error,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tiq.InMsgStateFlags = 256)) AS Rejected,
(SELECT COUNT(tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tpr.ProcessResultId = 16)) AS Duplicates,
(SELECT COUNT(DISTINCT tiq.Id) AS Expr1
FROM dbo.tInputQueueEntry AS tiq INNER JOIN
dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
WHERE (tpr.ProcessResultId = 2)) AS Nack
FROM
dbo.tInstanceConfig AS tic
WHERE
(InstanceGroupId = 1)
此查询作为视图运行
如果你需要进一步的信息,请告诉我
这是表格信息
tProcessLog
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[InstanceConfigId] [int] NOT NULL,
[InputQueueEntryId] [bigint] NOT NULL,
[OutputQueueEntryId] [bigint] NULL,
[ProcessingDtm] [datetime] NOT NULL,
[ProcessResultId] [int] NOT NULL,
[SeverityId] [int] NOT NULL,
[LogText] [varchar](max) NOT NULL,
[IsHidden] [bit] NOT NULL,
[ReceiverId] [int] NOT NULL,
tInputQueueEntry
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Created] [datetime] NOT NULL,
[DataTypeId] [int] NOT NULL,
[CodePage] [int] NOT NULL,
[InMsgStateFlags] [int] NOT NULL,
[ContentData] [nvarchar](max) NOT NULL,
[ContentHash] [nvarchar](32) NOT NULL,
罐头盒
[Id] [int] IDENTITY(1,1) NOT NULL,
[IsActive] [bit] NOT NULL,
[Type] [varchar](50) NOT NULL,
[Description] [varchar](50) NOT NULL,
[ComponentConfig] [xml] NOT NULL,
[InstanceGroupId] [int] NOT NULL,
更新
最后,我认为没有办法获得更高的性能。我使用了MSSQL调优顾问,它提供了一些建议,现在查询速度达到500毫秒。对我来说没关系
感谢所有的答案!我没有帮助解决性能问题,但我学到了很酷的tsql新东西:)像这样
SELECT
tic.Id AS InstanceId,
count.*
FROM
dbo.tInstanceConfig AS tic
OUTER APPLY
(
SELECT
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 32 THEN tiq.Id END) AS Received,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 1 THEN tiq.Id END) AS Queued,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 2 THEN tiq.Id END) AS Processed,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 128 THEN tiq.Id END) AS Error,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 256 THEN tiq.Id END) AS Rejected,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 16 THEN tiq.Id END) AS Duplicates,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 2 THEN tiq.Id END) AS Nack
FROM
dbo.tInputQueueEntry AS tiq
INNER JOIN dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
) count
WHERE
(InstanceGroupId = 1)
像这样
SELECT
tic.Id AS InstanceId,
count.*
FROM
dbo.tInstanceConfig AS tic
OUTER APPLY
(
SELECT
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 32 THEN tiq.Id END) AS Received,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 1 THEN tiq.Id END) AS Queued,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 2 THEN tiq.Id END) AS Processed,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 128 THEN tiq.Id END) AS Error,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 256 THEN tiq.Id END) AS Rejected,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 16 THEN tiq.Id END) AS Duplicates,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 2 THEN tiq.Id END) AS Nack
FROM
dbo.tInputQueueEntry AS tiq
INNER JOIN dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
) count
WHERE
(InstanceGroupId = 1)
像这样
SELECT
tic.Id AS InstanceId,
count.*
FROM
dbo.tInstanceConfig AS tic
OUTER APPLY
(
SELECT
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 32 THEN tiq.Id END) AS Received,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 1 THEN tiq.Id END) AS Queued,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 2 THEN tiq.Id END) AS Processed,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 128 THEN tiq.Id END) AS Error,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 256 THEN tiq.Id END) AS Rejected,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 16 THEN tiq.Id END) AS Duplicates,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 2 THEN tiq.Id END) AS Nack
FROM
dbo.tInputQueueEntry AS tiq
INNER JOIN dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
) count
WHERE
(InstanceGroupId = 1)
像这样
SELECT
tic.Id AS InstanceId,
count.*
FROM
dbo.tInstanceConfig AS tic
OUTER APPLY
(
SELECT
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 32 THEN tiq.Id END) AS Received,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 1 THEN tiq.Id END) AS Queued,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 2 THEN tiq.Id END) AS Processed,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 128 THEN tiq.Id END) AS Error,
COUNT(DISTINCT CASE WHEN tiq.InMsgStateFlags = 256 THEN tiq.Id END) AS Rejected,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 16 THEN tiq.Id END) AS Duplicates,
COUNT(DISTINCT CASE WHEN tpr.ProcessResultId = 2 THEN tiq.Id END) AS Nack
FROM
dbo.tInputQueueEntry AS tiq
INNER JOIN dbo.tProcessLog AS tpr ON tpr.InstanceConfigId = tic.Id AND tpr.InputQueueEntryId = tiq.Id
) count
WHERE
(InstanceGroupId = 1)
由于其他条件相同,您不能使用
InMsgStateFlags
按分组并获取计数(1)
值吗?只需编写一个SELECT
语句。由于其他条件相同,您能否使用InMsgStateFlags
按分组并获得计数(1)
值?只需编写一个SELECT
语句。由于其他条件相同,您能否使用InMsgStateFlags
按分组并获得计数(1)
值?只需编写一个SELECT
语句。由于其他条件相同,您能否使用InMsgStateFlags
按分组并获得计数(1)
值?只需写一条选择语句。
声明@Received INT、@Queued INT、@Processed INT、@Error INT、@Rejected INT、@Duplicates INT、@Nack INT
将@Received=选择计数(不同的tiq.Id)设置为Expr1
从…起
dbo.tInputQueueEntry作为tiq
内连接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tpr.ProcessResultId=32)
将@Queued=SELECT COUNT(DISTINCT tiq.Id)设置为Expr1
从…起
dbo.tInputQueueEntry作为tiq
内连接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=1)
将@Processed=选择计数(不同的tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=2)
将@Error=选择计数(不同的tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=128)
设置@Rejected=选择计数(不同的tiq.Id)为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tic tpr.instanceconfig=tic.Id
其中(tiq.InMsgStateFlags=256)
将@Duplicates=选择计数(tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tpr.ProcessResultId=16)
将@Nack=SELECT COUNT(DISTINCT tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tpr.ProcessResultId=2)
挑选
Id作为实例Id,
@收到,收到,
@以排队的方式排队,
@加工成加工,
@错误作为错误,
@被拒绝为被拒绝,
@复制品作为复制品,
@Nack作为Nack
从…起
dbo.tInstanceConfig作为tic
哪里
(InstanceGroupId=1)
声明@Received INT、@Queued INT、@Processed INT、@Error INT、@Rejected INT、@Duplicates INT、@Nack INT
将@Received=选择计数(不同的tiq.Id)设置为Expr1
从…起
dbo.tInputQueueEntry作为tiq
内连接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tpr.ProcessResultId=32)
将@Queued=SELECT COUNT(DISTINCT tiq.Id)设置为Expr1
从…起
dbo.tInputQueueEntry作为tiq
内连接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=1)
将@Processed=选择计数(不同的tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=2)
将@Error=选择计数(不同的tiq.Id)设置为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部联接dbo.tInstanceConfig作为tpr.instanceconfig=tic.Id上的tic
其中(tiq.InMsgStateFlags=128)
设置@Rejected=选择计数(不同的tiq.Id)为Expr1
从dbo.tInputQueueEntry作为tiq内部联接
dbo.tProcessLog作为tpr.InputQueueEntryId=tiq.Id上的tpr
内部连接dbo。