У меня есть сгенерированный SQL-запрос (Entity Framework сгенерировал запрос), который очень медленный, когда у меня есть предложение ORDER BY
. Интересно, что после стольких исследований я обнаружил, что всякий раз, когда у меня есть столбец UserName
в списке столбцов SELECT
, запрос становится очень медленным (55 секунд), но если я выбираю любой столбец из той же таблицы, кроме UserName
, запрос отвечает в миллисекундах.
Это запрос
SELECT
[r].[Amount], [r].[DeductedAmount], [r].[LoyaltyPoints],
[r].[ClientTransactionId], [r].[Quantity], [r].[RechargeTypeId],
[r0].[Name], [r].[ReferenceNo], [r].[TransactionStatusId],
[t].[Name] AS [Name0], [r].[TransactionDateTime], [r].[TransactionDate],
[r].[ResultCode], [u].UserName as username, [r].[ResultMessage],
[r].[Id], [s].[Id] AS [Id0], [u].[Id] AS [Id1], [r0].[Id] AS [Id2],
[t].[Id] AS [Id3]
FROM
[Recharge].[RechargeTransaction] AS [r]
INNER JOIN
[Sales].[SalesPoint] AS [s] ON [r].[SalesPointId] = [s].[Id]
INNER JOIN
[Account].[User] AS [u] ON [s].[UserId] = [u].[Id]
INNER JOIN
[Recharge].[RechargeType] AS [r0] ON [r].[RechargeTypeId] = [r0].[Id]
INNER JOIN
[Recharge].[TransactionStatus] AS [t] ON [r].[TransactionStatusId] = [t].[Id]
WHERE
CHARINDEX(N'sample-username', [u].[UserName]) > 0
ORDER BY
[r].[ReferenceNo]
Следует отметить, что все первичные ключи являются GUID с некластеризованными индексами.
Столбец UserName
равен nvarchar(256)
и имеет уникальный индекс.
после нескольких исследований я обнаружил, что если я уменьшу размер столбца до 100, время отклика станет миллисекундами. Этот подход решил мою проблему, но я до сих пор не знаю, почему размер столбца влияет на время ответа запроса.