0

我只有2个表,产品和图像。在产品中,我只有5万行,图像中有10行。我写了一个非常简单的查询,可以给我十大产品。其实这个查询是由EF生成的。简单查询在SQL Server中缓慢运行?

SELECT TOP (10) 
    [Join1].[Id1] AS [Id], 
    [Join1].[Name] AS [Name], 
    [Join1].[Price] AS [Price], 
    [Join1].[NewPrice] AS [NewPrice], 
    [Join1].[ShortDescription] AS [ShortDescription], 
    [Join1].[SKU] AS [SKU], 
    [Join1].[ProductTypeID] AS [ProductTypeID], 
    [Join1].[ImageID] AS [ImageID], 
    [Join1].[Promotion] AS [Promotion], 
    [Join1].[ParentID] AS [ParentID], 
    [Join1].[Attributes] AS [Attributes], 
    [Join1].[Id2] AS [Id1], 
    [Join1].[Path] AS [Path] 
FROM (
    SELECT [Extent1].[Id] AS [Id1] 
     , [Extent1].[Name] AS [Name] 
     , [Extent1].[Price] AS [Price] 
     , [Extent1].[NewPrice] AS [NewPrice] 
     , [Extent1].[ShortDescription] AS [ShortDescription] 
     , [Extent1].[SKU] AS [SKU] 
     , [Extent1].[ProductTypeID] AS [ProductTypeID] 
     , [Extent1].[ImageID] AS [ImageID] 
     , [Extent1].[Promotion] AS [Promotion] 
     , [Extent1].[ParentID] AS [ParentID] 
     , [Extent1].[Attributes] AS [Attributes] 
     , [Extent2].[Id] AS [Id2] 
     , [Extent2].[Path] AS [Path] 
     , row_number() OVER (ORDER BY [Extent1].[Id] ASC) AS [row_number] 
    FROM [dbo].[Products] AS [Extent1] 
    INNER JOIN [dbo].[Images] AS [Extent2] ON [Extent1].[ImageID] = [Extent2].[Id] 
) AS [Join1] 
WHERE [Join1].[row_number] > 0 
ORDER BY [Join1].[Id1] ASC 

但是这个查询需要3秒钟。我该如何改进这种查询性能。 Id是主键和标识列。

+0

什么是你的代码,你写它输出此查询? – CallumVass

+1

@BiffBaffBoff:如下标签,它必须是生成这个野兽的实体框架6。 –

+0

是的,但显示你正在编写生成此查询的代码..即你的方法 – CallumVass

回答

0

OK我已经加入随后加入,然后开始工作快。

SELECT TOP (10) 
    [Join1].[Id1] AS [Id], 
    [Join1].[Name] AS [Name], 
    [Join1].[Price] AS [Price], 
    [Join1].[NewPrice] AS [NewPrice], 
    [Join1].[ShortDescription] AS [ShortDescription], 
    [Join1].[SKU] AS [SKU], 
    [Join1].[ProductTypeID] AS [ProductTypeID], 
    [Join1].[ImageID] AS [ImageID], 
    [Join1].[Promotion] AS [Promotion], 
    [Join1].[ParentID] AS [ParentID], 
    [Join1].[Attributes] AS [Attributes], 
    [Join2].[Id] AS [Id2], 
    [Join2].[Path] AS [Path] 
FROM (SELECT 
    [Extent1].[Id] AS [Id1], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Price] AS [Price], 
    [Extent1].[NewPrice] AS [NewPrice], 
    [Extent1].[ShortDescription] AS [ShortDescription], 
    [Extent1].[SKU] AS [SKU], 
    [Extent1].[ProductTypeID] AS [ProductTypeID], 
    [Extent1].[ImageID] AS [ImageID], 
    [Extent1].[Promotion] AS [Promotion], 
    [Extent1].[ParentID] AS [ParentID], 
    [Extent1].[Attributes] AS [Attributes], 
    ROW_NUMBER() OVER (ORDER BY [Extent1].[Id] ASC) AS [row_number] 
FROM [dbo].[Products] AS [Extent1]) AS [Join1] 
INNER JOIN [dbo].[Images] AS [Join2] ON [Join1].[ImageID] = [Join2].[Id] 
WHERE [Join1].[row_number] > 0 
ORDER BY [Join1].[Id1] ASC 

但我不明白为什么EF做这些东西。

+0

这不是有效的SQL –

+0

@ElectricLlama,你确定吗?同样的查询在我的SQL Management Studio中 – user960567

+0

它的题干,因为这是适用于它的行号,排序和过滤的相当多的时间运行。行号是一个动态列,它没有任何索引。因此数据库必须做大量的处理(可能访问每一行)来找出你想要的行。你可以通过查看访问的行数来检查执行计划(如果这等于表中所做的所有辛苦工作的行数)。使其更快的方法是找到另一种排序和筛选方式,而不需要row_number。 – sarin