Я боролся с этим некоторое время.
У меня есть база данных с тремя таблицами (каждая из которых имеет миллионы записей) следующим образом (для простоты удалены некоторые столбцы):
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]
Проблема появляется только при заказе по двум фильтрам