【发布时间】:2023-04-05 23:34:01
【问题描述】:
我有这个问题
SELECT [f].[Id], [f].[Code], [f0].[Path]
FROM [FunctionalAssets] AS [f]
INNER JOIN FunctionalAssetStructurePath AS [f0] ON f.Id = f0.FunctionalAssetId
WHERE [f0].[StructureConfigurationId] = 'A8A41B14-0A35-45D3-2A2B-08D904A3CD0B'
ORDER BY [f0].[Path], [f0].[Name]
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
我在表 FunctionalAssetStructurePath 上创建了一个索引,其中包含以下列:结构配置 ID、路径和名称。 这个查询很快(100ms),没问题。
但是当我有这个查询时:
SELECT [f].[Id], [f].[Code], [f0].[Path]
FROM [FunctionalAssets] AS [f]
INNER JOIN FunctionalAssetStructurePath AS [f0] ON f.Id = f0.FunctionalAssetId
INNER JOIN FunctionalAssetStructure AS [f1] ON f.Id = f1.FunctionalAssetId
WHERE [f0].[StructureConfigurationId] = 'A8A41B14-0A35-45D3-2A2B-08D904A3CD0B'
AND [f1].[StructureId] = 'ec40fc59-13e3-4e32-7290-08d90639e607'
ORDER BY [f0].[Path], [f0].[Name]
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
查询非常慢(+2000 毫秒)。
如果我删除索引,第一个查询很慢(+2000 毫秒),但第二个查询很快(200 毫秒)。
我觉得这很奇怪。你知道为什么吗 ?又该如何解决呢?
更新 1
谢谢
【问题讨论】:
-
您使用的是什么 DBMS?执行计划向您展示了什么? (顺便说一句,您应该花更多的精力来选择表别名;
f和f0在您尝试阅读代码时是不好的选择,尤其是当您像这里的读者一样不熟悉它时。) -
另外,第二个查询在两个单独的表(
f0和f1)中包含两个匹配条件,其中第一个查询只需匹配单个表中的一个条件。第二个显然需要做更多的工作。 -
@KenWhite 我从实体框架复制了查询,这就是为什么我有别名 f 和 f0。问题出在过滤器上。在第一个查询中,我有 2M+ 项需要排序,而且速度很快(感谢索引)。在第二个查询中,过滤器返回 70 000 个项目并且速度很慢(但如果我删除索引它很快)。在这两种情况下,如果我将“order by path, name”更改为“order by (select 1)”,查询速度很快。所以问题是(我认为)的顺序。
标签: sql sql-order-by where-clause non-clustered-index