【发布时间】:2016-01-16 11:28:50
【问题描述】:
我在 linq 中创建了一个查询,该查询返回我商店中最活跃的销售人员的表格:
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();
继承的 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.
我想优化生成的 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 时间实际上是 down .... 你看过 查询的实际执行计划创建索引之前,之后呢?查看发生了什么变化 - 它可能会向您展示有关如何进一步改进您的查询的其他提示
-
您的查询有问题。先从为什么加入两个表(将
tblUsers中的记录相乘)然后不使用投影中的第二个表记录。
标签: c# sql sql-server entity-framework linq