У меня возникла проблема со следующим запросом. Он работает и дает мне необходимый результат, но он довольно медленный, из-за моих подзапросов с объединениями. Мои навыки 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.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,
tInstanceConfig
[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,
UPD ATE
Наконец-то, я думаю, что нет возможности получить больше производительности. Я использовал советник по настройке MSSQL, который имел некоторые рекомендации, теперь запрос занял ~ 500 мс. Это хорошо для меня.
Спасибо всем! Я не помогаю в производительности, но я узнал, что классный новый материал tsql :)
Я думаю, что вы можете использовать один 'JOIN' вместо всех внутренних отбирает с использованием' COUNT (DISTINCT случай, когда THEN tiq.Id END) ';). –
Я считаю, что в подзапросе принимается только одно возвращаемое значение :( –
Не могли бы вы добавить, какие планы выполнения это производят? И что такое индексы на вашей таблице? Было бы полезно. –