我創建LINQ查詢返回最活躍的推銷員的表在我店:如何優化由SQL Server Management Studio中的實體框架生成的SQL查詢?
ProjectDB3Context db = new ProjectDB3Context();
db.Database.Log = message => Trace.WriteLine(message);
var result = db.tblUsers.Join(db.tblSales,
u => u.ID,
sl => sl.tblUserId,
(u, sl) => new { u, sl })
.Select(o => new
{
UserId = o.u.ID,
Login = o.u.UserLogin,
FullName = o.u.Name + " " + o.u.Surname,
ItemsToSell = db.tblSales.Where(x => x.tblUserId == o.u.ID).Count()
})
.Distinct()
.OrderByDescending(x => x.ItemsToSell)
.ToList();
的henerated SQL查詢看起來像:
SELECT
[Distinct1].[C1] AS [C1],
[Distinct1].[ID] AS [ID],
[Distinct1].[UserLogin] AS [UserLogin],
[Distinct1].[C2] AS [C2],
[Distinct1].[C3] AS [C3]
FROM (SELECT DISTINCT
[Project1].[ID] AS [ID],
[Project1].[UserLogin] AS [UserLogin],
1 AS [C1],
[Project1].[Name] + N' ' + [Project1].[Surname] AS [C2],
[Project1].[C1] AS [C3]
FROM (SELECT
[Extent1].[ID] AS [ID],
[Extent1].[UserLogin] AS [UserLogin],
[Extent1].[Name] AS [Name],
[Extent1].[Surname] AS [Surname],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[tblSale] AS [Extent3]
WHERE [Extent3].[tblUserId] = [Extent1].[ID]) AS [C1]
FROM [dbo].[tblUser] AS [Extent1]
INNER JOIN [dbo].[tblSale] AS [Extent2] ON [Extent1].[ID] = [Extent2].[tblUserId]
) AS [Project1]
) AS [Distinct1]
ORDER BY [Distinct1].[C3] DESC
統計:
SQL Server Execution Times:
CPU time = 359 ms, elapsed time = 529 ms.
我想優化gen erated SQL查詢並將優化後的查詢插入到存儲過程中。 SQL Server Management Studio爲我提供了一個技巧,可以在tblSale上創建非聚集索引(tblUserId)(您可以在包含的圖像中看到此提示)。
當我創建使用命令它:
CREATE NONCLUSTERED INDEX IX_ProductVendor_tblUserId
ON tblSale (tblUserId);
,然後運行在SQL Server Management Studio中的SQL查詢,我得到:
SQL Server Execution Times:
CPU time = 328 ms, elapsed time = 631 ms.
所以需要更長的時間我使用的索引後優化我的SQL查詢。
任何人都可以幫助我在SQL Server中使用索引優化此查詢嗎?
創建索引後,它不需要太長的時間* CPU時間實際上是**下降** ....您是否在*創建之前查看了**實際執行計劃**索引和之後?看看有什麼變化 - 它可能會告訴你關於如何進一步改善您的查詢的其他技巧 –
您的查詢有問題。首先介紹爲什麼要加入兩個表(它將'tblUsers'中的記錄相乘),然後不在投影中使用第二個表記錄。 –