我有大约 150 万条记录。此查询适用于较小的数据,但每几十万条记录就会慢一秒。对于 150 万,查询明显困难。
我模拟了一个全新的 Code First 项目来验证问题与我的实现无关,并提供以下示例查询:
SELECT TOP 1 Widgets.*
FROM [WidgetSandbox].[dbo].[Widgets] Widgets
INNER JOIN [WidgetSandbox].[dbo].[Status] Statuses ON Widgets.StatusId = Statuses.Id
INNER JOIN [WidgetSandbox].[dbo].[Colors] Colors ON Widgets.ColorCode = Colors.ColorCode
INNER JOIN [WidgetSandbox].[dbo].[Sizes] Sizes ON Widgets.SizeId = Sizes.Id
WHERE Statuses.Name = 'Available'
AND Colors.Name = 'Red'
ORDER BY Sizes.DiameterInches
Run Code Online (Sandbox Code Playgroud)
DiameterInches 是一个int
, 作为我实际代码中“PriorityLevel”的隐喻。
如果我注释掉ORDER BY Sizes.DiameterInches
,它会立即返回,但如果我想找到“最小的可用红色小部件”,它就会爬行。
有没有更好的办法?
执行计划 XML:https : //gist.github.com/RobertBaldini/57c8b61d135cc5c84c38b2da243611ad
DDL:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6
回购(数据加载器需要几分钟):https : //github.com/RobertBaldini/WidgetSandbox