SQL:外部查询需要更多时间来获取结果

时间:2019-08-12 18:59:18

标签: sql sql-server entity-framework entity-framework-6

当我运行下面的查询时,它花费了超过一分钟的时间。但是,当我运行内部查询时,它会在一秒钟内执行。订单表中有很多记录 有人可以帮我改善性能。

SELECT TOP (10) 
    [Filter1].[OrderID] AS [OrderID], 
    [Filter1].[ContactName] AS [ContactName]    
    FROM ( 
    SELECT [Extent1].[OrderID] AS [OrderID], 
    [Extent2].[ContactName] AS [ContactName], 
    row_number() OVER (ORDER BY [Extent1].[OrderID] ASC) AS [row_number]
        FROM  [dbo].[Orders] AS [Extent1]
        LEFT OUTER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[CustomerID] = [Extent2].[CustomerID]
        WHERE ( CAST(CHARINDEX(LOWER(N'ma'), LOWER([Extent2].[ContactName])) AS int)) > 0
    )  AS [Filter1]
    WHERE [Filter1].[row_number] > 10
    ORDER BY [Filter1].[OrderID] ASC

2 个答案:

答案 0 :(得分:0)

要提高性能,请在您的订单表上创建index。获取前10位,然后对内部查询结果进行排序将花费一些时间,因为它会通过删除order by或top 10(如果其不是强制性的或最佳选择)使用Orders(orderid)上的索引通过快速索引搜索选择来执行排序,从而使订单时间翻倍

答案 1 :(得分:0)

您尝试过CTE吗?您是否要达到第11至20行?前10行,其中row_number> 10

; WITH ordercte AS
          (

     SELECT  [Extent1].[OrderID] AS [OrderID], 
    [Extent2].[ContactName] AS [ContactName], 
    row_number() OVER (ORDER BY [Extent1].[OrderID] ASC) AS [row_number]
        FROM  [dbo].[Orders] AS [Extent1]
        LEFT OUTER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[CustomerID] = [Extent2].[CustomerID]
        WHERE ( CAST(CHARINDEX(LOWER(N'ma'), LOWER([Extent2].[ContactName])) AS int)) > 0
          )

          SELECT OrderID,ContactName FROM ordercte WHERE row_number > 10 ORDER BY OrderID ASC