Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
TSQL:查看性能问题_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

我对以下查询有问题。它可以工作并提供所需的结果,但速度相当慢,因为我的子选择带有连接。我的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.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。