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