简体   繁体   English

Linq to SQL:查询在SQL Server Management Studio中运行良好,但在应用程序上超时

[英]Linq to SQL: Query runs fine in SQL Server Management Studio, but times out on the application

I'm maintaining the code of a legacy application. 我正在维护旧版应用程序的代码。 It is using Entity Framework 3.5 and updating it to a newer version at the moment is not possible. 它正在使用Entity Framework 3.5,目前无法将其更新为较新版本。

There is a query that lately has started to time out. 最近有一个查询开始超时。 This is the query in LINQ: 这是LINQ中的查询:

var compoQueryResult = (from composition in MyAppDataContext.Compositions
                            join compositionStatus in MyAppDataContext.CompositionStatus on composition.StatusID equals compositionStatus.CompositionStatusID
                            join compoUnit in MyAppDataContext.CompositionUnits on composition.CompositionID equals compoUnit.CompositionID
                            join unit in MyAppDataContext.Units on compoUnit.UnitID equals unit.UnitID
                            join carUnit in MyAppDataContext.Car_Units on unit.UnitID equals carUnit.UnitId
                            join car in MyAppDataContext.Cars on carUnit.CarId equals car.CarID
                            join location in MyAppDataContext.Locations on unit.ParkedLocationID equals location.LocationID
                            from road in MyAppDataContext.Roads.Where(r => r.RoadID == unit.RoadID).DefaultIfEmpty()
                            from ta in MyAppDataContext.Allocations.Where(ta => ta.CompositionId == composition.CompositionID).DefaultIfEmpty()
                            from arrivalLocation in MyAppDataContext.Locations.Where(al => al.LocationID == ta.EndLocationID).DefaultIfEmpty()
                            where (MyApp.IsAdministrator || MyApp.GetLineIds().Contains(car.LineId.Value))
                            && car.LineId.Value == LineId                           
                            && (statusId == null || statusId == compositionStatus.CompositionStatusID)
                            && (locationId == null || unit.ParkedLocationID == locationId)
                            && (!onlyATMS.HasValue
                                 || (onlyATMS == true && composition.CompositionName.Contains(Common.Constants.ATMSSymbol))
                                 || (onlyATMS == false && !composition.CompositionName.Contains(Common.Constants.ATMSSymbol)))
                            select new CompositionQueryResultItem
                            {
                                CompositionId = composition.CompositionID,
                                CompositionName = composition.CompositionName,
                                CompositionNumber = composition.CompositionNumber,
                                DateTimeModified = composition.DataModified,
                                Status = compositionStatus.CompositionStatusDesc,
                                Location = location.LocationName,
                                Road = road.Name,
                                Number = ta.Number,
                                DepartureTime = ta.DepartTime,
                                ArrivalLocation = arrivalLocation.LocationName,
                                ArrivalTime = ta.ArriveTime
                            }).Distinct().ToList();

After debugging the app I can see that the following query is being executed: 调试应用程序后,我可以看到正在执行以下查询:

SELECT DISTINCT [t10].[CompositionID] AS [CompositionId], [t10].[CompositionName], [t10].[CompositionNumber], [t10].[value] AS [DateTimeModified], [t10].[CompositionStatusDesc] AS [Status], [t10].[LocationName] AS [Location], [t10].[value2] AS [Road], [t10].[value3] AS [Number], [t10].[value4] AS [DepartureTime], [t10].[value5] AS [ArrivalLocation], [t10].[value6] AS [ArrivalTime]
FROM (
    SELECT [t0].[CompositionID], [t0].[CompositionName], [t0].[CompositionNumber], [t0].[DataModified] AS [value], [t1].[CompositionStatusDesc], [t6].[LocationName], [t7].[Name] AS [value2], [t8].[Number] AS [value3], [t8].[DepartTime] AS [value4], [t9].[LocationName] AS [value5], [t8].[ArriveTime] AS [value6], [t5].[LineId]
    FROM [dbo].[Composition] AS [t0]
    INNER JOIN [dbo].[CompositionStatus] AS [t1] ON [t0].[StatusID] = [t1].[CompositionStatusID]
    INNER JOIN [dbo].[CompositionUnit] AS [t2] ON [t0].[CompositionID] = [t2].[CompositionID]
    INNER JOIN [dbo].[Unit] AS [t3] ON [t2].[UnitID] = [t3].[UnitID]
    INNER JOIN [dbo].[Car_Unit] AS [t4] ON [t3].[UnitID] = [t4].[UnitId]
    INNER JOIN [dbo].[Car] AS [t5] ON [t4].[CarId] = [t5].[CarID]
    INNER JOIN [dbo].[Location] AS [t6] ON [t3].[ParkedLocationID] = ([t6].[LocationID])
    LEFT OUTER JOIN [dbo].[Road] AS [t7] ON ([t7].[RoadID]) = [t3].[RoadID]
    LEFT OUTER JOIN [dbo].[Allocation] AS [t8] ON [t8].[CompositionId] = ([t0].[CompositionID])
    LEFT OUTER JOIN [dbo].[Location] AS [t9] ON [t9].[LocationID] = [t8].[EndLocationID]
    ) AS [t10]
WHERE ([t10].[LineId]) = @p0

If I execute that query on SQL Server Manager Studio I get no issues at all. 如果我在SQL Server Manager Studio上执行该查询,则不会有任何问题。 It executes in less than one second. 它在不到一秒钟的时间内执行。 However, the application is timing out and I have no idea why. 但是,该应用程序正在超时,我不知道为什么。

I tried doing 我试着做

MyAppDataContext.ObjectTrackingEnabled = false; MyAppDataContext.ObjectTrackingEnabled = false;

but I still get the same error. 但我仍然遇到相同的错误。

I'm about to give up and create an stored procedure instead, but I can't grasp why the timeout is happening. 我将放弃并创建一个存储过程,但是我无法理解为什么会发生超时。

The query execution plan that is being used by the SQL Server can be different when the same query is run through the application. 当通过应用程序运行同一查询时,SQL Server使用的查询执行计划可以不同。 Check your execution plans. 检查您的执行计划。 You can use hints like option(recompile) at the end of the query or you can optimize it for a particular Lineid if for different id's the rows returned are significantly different. 您可以在查询结束时使用诸如option(recompile)之类的提示,也可以针对特定的Lineid优化它(如果对于不同的id,返回的行明显不同)。 Sometimes, using such hints make it slow in SSMS but not in application. 有时,使用此类提示会使SSMS变慢,但在应用程序中却不会变慢。 You can find a solution after some hit and trial. 经过一番尝试后,您可以找到解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在C#Web应用程序中插入查询时间,从SQL Server Management Studio运行正常 - Insert query times out in C# web app, runs fine from SQL Server Management Studio 从C#运行时,SQL查询超时,在SQL Server Management Studio中快速 - SQL query times out when run from C#, fast in SQL Server Management Studio .NET 应用程序中的 SQL 查询速度很慢,但在 SQL Server Management Studio 中是即时的 - SQL Query slow in .NET application but instantaneous in SQL Server Management Studio 优化在Sql server中快速运行的LINQ查询? - Optimize LINQ query that runs fast in Sql server? C#和SQL Server Management Studio中SQL查询的执行时间完全不同 - Very different execution times of SQL query in C# and SQL Server Management Studio SQL Server查询从代码运行的时间比从Management Studio运行的时间更多 - SQL Server query runs more time from code than from Management Studio SELECT在程序中超时,但在SQL Server Management Studio中有效 - SELECT times out from program but works from SQL Server Management Studio SQL查询可在SQL Server Management Studio中使用,但不适用于ASP.Net应用程序 - SQL query works in SQL Server Management Studio but not from ASP.Net application Linq日期比较在SQL Server Management Studio中不起作用 - Linq date comparison does not work like in sql server management studio 存储过程在SQL Management Studio中运行,但不在代码中运行 - Stored Procedure runs in SQL Management Studio but not in Code
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM