我已经为此苦苦挣扎了一段时间。
我有一个包含三个表的数据库(每个表都有数百万个记录),如下所示(为简单起见,删除了一些列:]]
1.[Entity] [Id] UNIQUEIDENTIFIER PK, [EntityLevel_Id] UNIQUEIDENTIFIER NOT NULL FK [EntityLevel] ([Id]) 2.[EntityData] [Id] UNIQUEIDENTIFIER PK, [Entity_Id] UNIQUEIDENTIFIER NOT NULL FK [Entity] ([Id]), [DataLanguage_Id] UNIQUEIDENTIFIER NOT NULL FK [Language] ([Id]), [Code] NVARCHAR (250) NOT NULL 3.[EntityLevel] [Id] UNIQUEIDENTIFIER PK, [Sort] INT NOT NULL
存在索引如下
[IX_Entity_EntityLevelId] ON [Entity] ([EntityLevel_Id]) [IX_EntityData_EntityId] ON [EntityData] ([Entity_Id]) [IX_EntityData_DataLanguageId_Code] ON [EntityData] ([DataLanguage_Id], [Code]) [IX_EntityLevel_Sort] ON [EntityLevel] ([Sort])
为了消除由于选择的列而导致速度变慢的可能性,我仅选择一个固定值
以下查询运行非常快(不到1秒):
SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityData].[DataLanguage_Id] = 'B6930015-F177-4ED3-97B0-AAEF401F9265'
以下查询也非常快地运行:
SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityData].[DataLanguage_Id] = 'B6930015-F177-4ED3-97B0-AAEF401F9265' ORDER BY [EntityData].[Code] ASC
以下内容也可以快速运行:
SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityLevel].[Sort] = 1
但是,以下查询运行非常缓慢(大约10秒):
SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityData].[DataLanguage_Id] = 'B6930015-F177-4ED3-97B0-AAEF401F9265' AND [EntityLevel].[Sort] = 1 ORDER BY [EntityData].[Code]
我不知道原因,而且我找不到任何应用更多索引的方法,因此查询运行更快
感谢您的任何帮助!
编辑:
以下查询也可以快速运行:SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityData].[DataLanguage_Id] = 'B6930015-F177-4ED3-97B0-AAEF401F9265' AND [EntityLevel].[Sort] = 1
和
SELECT TOP 20 1 FROM [Entity] INNER JOIN [EntityData] ON [Entity].[Id] = [EntityData].[Entity_Id] INNER JOIN [EntityLevel] ON [Entity].[EntityLevel_Id] = [EntityLevel].[Id] WHERE [EntityLevel].[Sort] = 1 ORDER BY [EntityData].[Code]
该问题仅在order by和两个过滤器中出现
我已经为此苦苦挣扎了一段时间。我有一个包含三个表的数据库(每个表都有数百万个记录),如下所示(为简单起见,删除了一些列):1. [Entity] [Id] ...
尝试使用索引
您的问题是关于此查询的: