2014-12-15 7 views
0

Я запускаю запрос, который содержит несколько объединений и возвращает около 4K записей экземпляра SQL Server, используемого для среды QA. Когда я запускаю запрос на моей локальной машине разработки и на экземпляре SQL Server, используемом для среды DEV через SSMS, запрос возвращается немедленно (0 секунд), но когда тот же запрос запускается в окне запроса SSMS среды QA, он принимает около 50 секунд для возврата. Запрос генерируется из приложения .NET с использованием Entity Framework 6. код, используемый в приложении .NET заключается в следующем:SQL Server: select query timeout

var includes = new List<Expression<Func<TAM, object>>>(); 
includes.Add(t => t.AssetClassModels); 
includes.Add(t => t.AssetClassModels.Select(acm => acm.Allocations)); 
includes.Add(t => t.AssetClassModels.Select(acm => acm.Allocations.Select(a => a.TAMAssetClass))); 
includes.Add(t => t.AssetClassModels.Select(acm => acm.Allocations.Select(a => a.TAMAssetClass.BroadAssetClassType))); 
includes.Add(t => t.AssetClassModels.Select(acm => acm.Allocations.Select(a => a.TAMAssetClass.Correlations))); 
var tam = innerUnitOfWork.Repository<TAM>().Find(x => x.Id == tamResult.TAM.Id, includes); 

SQL-запрос генерируется приведенный выше код является следующее:

exec sp_executesql N'SELECT 
[Project4].[Number] AS [Number], 
[Project4].[Id] AS [Id], 
[Project4].[ProductTypeId] AS [ProductTypeId], 
[Project4].[GlidePathTypeId] AS [GlidePathTypeId], 
[Project4].[CashEquivalentPreferenceId] AS [CashEquivalentPreferenceId], 
[Project4].[TAMClientId] AS [TAMClientId], 
[Project4].[C3] AS [C1], 
[Project4].[Number1] AS [Number1], 
[Project4].[Id1] AS [Id1], 
[Project4].[TAMId] AS [TAMId], 
[Project4].[C2] AS [C2], 
[Project4].[Id3] AS [Id2], 
[Project4].[DisplayOrder] AS [DisplayOrder], 
[Project4].[Id2] AS [Id3], 
[Project4].[TAMAssetClassId] AS [TAMAssetClassId], 
[Project4].[Percentage] AS [Percentage], 
[Project4].[ModelId] AS [ModelId], 
[Project4].[Name] AS [Name], 
[Project4].[IsCore] AS [IsCore], 
[Project4].[ExpectedReturn] AS [ExpectedReturn], 
[Project4].[StandardDeviation] AS [StandardDeviation], 
[Project4].[BroadAssetClassTypeId] AS [BroadAssetClassTypeId], 
[Project4].[Id4] AS [Id4], 
[Project4].[Name1] AS [Name1], 
[Project4].[DisplayOrder1] AS [DisplayOrder1], 
[Project4].[C1] AS [C3], 
[Project4].[Id5] AS [Id5], 
[Project4].[TAMAssetClassXAxisId] AS [TAMAssetClassXAxisId], 
[Project4].[TAMAssetClassYAxisId] AS [TAMAssetClassYAxisId], 
[Project4].[Correlation] AS [Correlation] 
FROM (SELECT 
    [Project3].[Id] AS [Id], 
    [Project3].[Number] AS [Number], 
    [Project3].[ProductTypeId] AS [ProductTypeId], 
    [Project3].[GlidePathTypeId] AS [GlidePathTypeId], 
    [Project3].[CashEquivalentPreferenceId] AS [CashEquivalentPreferenceId], 
    [Project3].[TAMClientId] AS [TAMClientId], 
    [Project3].[Id1] AS [Id1], 
    [Project3].[Number1] AS [Number1], 
    [Project3].[TAMId] AS [TAMId], 
    [Project3].[Id2] AS [Id2], 
    [Project3].[TAMAssetClassId] AS [TAMAssetClassId], 
    [Project3].[Percentage] AS [Percentage], 
    [Project3].[ModelId] AS [ModelId], 
    [Project3].[DisplayOrder] AS [DisplayOrder], 
    [Project3].[Id3] AS [Id3], 
    [Project3].[Name] AS [Name], 
    [Project3].[IsCore] AS [IsCore], 
    [Project3].[ExpectedReturn] AS [ExpectedReturn], 
    [Project3].[StandardDeviation] AS [StandardDeviation], 
    [Project3].[BroadAssetClassTypeId] AS [BroadAssetClassTypeId], 
    [Project3].[Id4] AS [Id4], 
    [Project3].[Name1] AS [Name1], 
    [Project3].[DisplayOrder1] AS [DisplayOrder1], 
    [Project3].[Id5] AS [Id5], 
    [Project3].[TAMAssetClassXAxisId] AS [TAMAssetClassXAxisId], 
    [Project3].[TAMAssetClassYAxisId] AS [TAMAssetClassYAxisId], 
    [Project3].[Correlation] AS [Correlation], 
    CASE WHEN ([Project3].[Id1] IS NULL) THEN CAST(NULL AS int) WHEN ([Project3].[Id2] IS NULL) THEN CAST(NULL AS int) WHEN ([Project3].[Id5] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
    CASE WHEN ([Project3].[Id1] IS NULL) THEN CAST(NULL AS int) WHEN ([Project3].[Id2] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2], 
    CASE WHEN ([Project3].[Id1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C3] 
    FROM (SELECT 
     [Project2].[Id] AS [Id], 
     [Project2].[Number] AS [Number], 
     [Project2].[ProductTypeId] AS [ProductTypeId], 
     [Project2].[GlidePathTypeId] AS [GlidePathTypeId], 
     [Project2].[CashEquivalentPreferenceId] AS [CashEquivalentPreferenceId], 
     [Project2].[TAMClientId] AS [TAMClientId], 
     [Project2].[Id1] AS [Id1], 
     [Project2].[Number1] AS [Number1], 
     [Project2].[TAMId] AS [TAMId], 
     [Project2].[Id2] AS [Id2], 
     [Project2].[TAMAssetClassId] AS [TAMAssetClassId], 
     [Project2].[Percentage] AS [Percentage], 
     [Project2].[ModelId] AS [ModelId], 
     [Project2].[DisplayOrder] AS [DisplayOrder], 
     [Project2].[Id3] AS [Id3], 
     [Project2].[Name] AS [Name], 
     [Project2].[IsCore] AS [IsCore], 
     [Project2].[ExpectedReturn] AS [ExpectedReturn], 
     [Project2].[StandardDeviation] AS [StandardDeviation], 
     [Project2].[BroadAssetClassTypeId] AS [BroadAssetClassTypeId], 
     [Project2].[Id4] AS [Id4], 
     [Project2].[Name1] AS [Name1], 
     [Project2].[DisplayOrder1] AS [DisplayOrder1], 
     [Project2].[Id5] AS [Id5], 
     [Project2].[TAMAssetClassXAxisId] AS [TAMAssetClassXAxisId], 
     [Project2].[TAMAssetClassYAxisId] AS [TAMAssetClassYAxisId], 
     [Project2].[Correlation] AS [Correlation] 
     FROM (SELECT 
      [Limit1].[Id] AS [Id], 
      [Limit1].[Number] AS [Number], 
      [Limit1].[ProductTypeId] AS [ProductTypeId], 
      [Limit1].[GlidePathTypeId] AS [GlidePathTypeId], 
      [Limit1].[CashEquivalentPreferenceId] AS [CashEquivalentPreferenceId], 
      [Limit1].[TAMClientId] AS [TAMClientId], 
      [Join4].[Id1] AS [Id1], 
      [Join4].[Number] AS [Number1], 
      [Join4].[TAMId] AS [TAMId], 
      [Join4].[Id2] AS [Id2], 
      [Join4].[TAMAssetClassId] AS [TAMAssetClassId], 
      [Join4].[Percentage] AS [Percentage], 
      [Join4].[ModelId] AS [ModelId], 
      [Join4].[DisplayOrder1] AS [DisplayOrder], 
      [Join4].[Id3] AS [Id3], 
      [Join4].[Name1] AS [Name], 
      [Join4].[IsCore] AS [IsCore], 
      [Join4].[ExpectedReturn] AS [ExpectedReturn], 
      [Join4].[StandardDeviation] AS [StandardDeviation], 
      [Join4].[BroadAssetClassTypeId] AS [BroadAssetClassTypeId], 
      [Join4].[Id4] AS [Id4], 
      [Join4].[Name2] AS [Name1], 
      [Join4].[DisplayOrder2] AS [DisplayOrder1], 
      [Join4].[Id5] AS [Id5], 
      [Join4].[TAMAssetClassXAxisId] AS [TAMAssetClassXAxisId], 
      [Join4].[TAMAssetClassYAxisId] AS [TAMAssetClassYAxisId], 
      [Join4].[Correlation] AS [Correlation] 
      FROM (SELECT TOP (2) 
       [Extent1].[Id] AS [Id], 
       [Extent1].[Number] AS [Number], 
       [Extent1].[ProductTypeId] AS [ProductTypeId], 
       [Extent1].[GlidePathTypeId] AS [GlidePathTypeId], 
       [Extent1].[CashEquivalentPreferenceId] AS [CashEquivalentPreferenceId], 
       [Extent1].[TAMClientId] AS [TAMClientId] 
       FROM [dbo].[TAM] AS [Extent1] 
       WHERE [Extent1].[Id] = @p__linq__0) AS [Limit1] 
      LEFT OUTER JOIN (SELECT [Extent2].[Id] AS [Id1], [Extent2].[Number] AS [Number], [Extent2].[TAMId] AS [TAMId], [Join3].[Id2], [Join3].[TAMAssetClassId], [Join3].[Percentage], [Join3].[ModelId], [Join3].[DisplayOrder1], [Join3].[Id3], [Join3].[Name1], [Join3].[IsCore], [Join3].[ExpectedReturn], [Join3].[StandardDeviation], [Join3].[BroadAssetClassTypeId], [Join3].[Id4], [Join3].[Name2], [Join3].[DisplayOrder2], [Join3].[Id5], [Join3].[TAMAssetClassXAxisId], [Join3].[TAMAssetClassYAxisId], [Join3].[Correlation] 
       FROM [dbo].[TAMAssetClassModel] AS [Extent2] 
       LEFT OUTER JOIN (SELECT [Extent3].[Id] AS [Id2], [Extent3].[TAMAssetClassId] AS [TAMAssetClassId], [Extent3].[Percentage] AS [Percentage], [Extent3].[ModelId] AS [ModelId], [Extent3].[DisplayOrder] AS [DisplayOrder1], [Extent4].[Id] AS [Id3], [Extent4].[Name] AS [Name1], [Extent4].[IsCore] AS [IsCore], [Extent4].[ExpectedReturn] AS [ExpectedReturn], [Extent4].[StandardDeviation] AS [StandardDeviation], [Extent4].[BroadAssetClassTypeId] AS [BroadAssetClassTypeId], [Extent5].[Id] AS [Id4], [Extent5].[Name] AS [Name2], [Extent5].[DisplayOrder] AS [DisplayOrder2], [Extent6].[Id] AS [Id5], [Extent6].[TAMAssetClassXAxisId] AS [TAMAssetClassXAxisId], [Extent6].[TAMAssetClassYAxisId] AS [TAMAssetClassYAxisId], [Extent6].[Correlation] AS [Correlation] 
        FROM [dbo].[TAMAssetClassAllocation] AS [Extent3] 
        INNER JOIN [dbo].[TAMAssetClass] AS [Extent4] ON [Extent3].[TAMAssetClassId] = [Extent4].[Id] 
        INNER JOIN [dbo].[BroadAssetClassType] AS [Extent5] ON [Extent4].[BroadAssetClassTypeId] = [Extent5].[Id] 
        LEFT OUTER JOIN [dbo].[TAMAssetClassCorrelation] AS [Extent6] ON [Extent3].[TAMAssetClassId] = [Extent6].[TAMAssetClassYAxisId]) AS [Join3] ON [Extent2].[Id] = [Join3].[ModelId]) AS [Join4] ON [Limit1].[Id] = [Join4].[TAMId] 
     ) AS [Project2] 
    ) AS [Project3] 
) AS [Project4] 
ORDER BY [Project4].[Id] ASC, [Project4].[C3] ASC, [Project4].[Id1] ASC, [Project4].[C2] ASC, [Project4].[Id3] ASC, [Project4].[Id2] ASC, [Project4].[Id4] ASC, [Project4].[C1] ASC',N'@p__linq__0 uniqueidentifier',@p__linq__0='63C18415-1101-47A9-9BDE-5950AAACA488' 

Что может быть более вероятной причиной замедления выполнения в среде QA, когда структура (таблицы) базы данных и данные одинаковы во всех локальных, DEV и QA-окружениях? Как я могу ускорить время, затрачиваемое на выполнение этого запроса? Индексы одинаковы во всех трех средах.

+0

Вы проверили (и, возможно, обновили) свою статистику на сервере QA? Возможно, они не синхронизированы после большой загрузки данных или чего-то подобного ... –

+0

как насчет версий sql на серверах? сеансы настройки arithabort? У вас есть проверка с перекомпиляцией? , то в конце мы хотели бы увидеть обе версии планов выполнения для деталей. –

ответ

0

планы Проверка выполнения на обоих серверах и, скорее всего, вы найдете QA-сервер не оптимизирует стыки в плане выполнения

Если это так, то вам нужно будет запустить update statistics на QA сервере, чтобы оптимизировать его выполнение планирует

Here is more info about Update Statistics

0

Как вы говорите, что таблицы и данные и индексы одинаковы в обоих среде. Поэтому единственная причина, по которой я могу думать, - это не обновлять статистику в среде QA. У меня тоже была эта проблема, и обновление статистики разрешило ее.

+0

не могли бы вы объяснить разницу между вашим ответом и моим, который был после 2 часов до вас. Если вы согласны с моим ответом, вы лучше проголосуете за него, чтобы поддержать его, а не дублировать ответ. – Gouda

+0

Я новичок на этом форуме, так что все еще понимаю, как все работает здесь. Подсчитайте это для ошибки новобранец. Я попытался проголосовать за ваш ответ, но это не позволило мне сказать, что мне нужно 15 репутаций. – srh