powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование индекса с фильтрацией и сортировкой
7 сообщений из 7, страница 1 из 1
Использование индекса с фильтрацией и сортировкой
    #40105289
absinthe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здрасте!

Прошу помощи или совета.

Есть таблица документов с автором, датой создания, филиалом и кучей других полей.
Документов десятки миллионов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE Documents
(
  Id int primary key,
  CreatedDate DATETIME2 NOT NULL,
  CreatorId int NOT NULL,
  FilialId int NOT NULL,
  ...
)



Для удобства восприятия:

IdCreatedDateCreatorIdFilialId12021-10-19T00:17:281122021-10-19T00:17:281232021-10-19T00:17:291342021-10-19T00:17:3023

Нужно выбрать топ 1000 самых свежих документов для пользователя, если он автор документа или филиал доступен пользователю.

Вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- на входе такие данные
DECLARE @userFilials TABLE (id int);
DECLARE @currentUser int;

-- сам запрос
SELECT TOP 1000 Id
FROM Documents
WHERE FilialId in (select Id from @userFilials) OR CreatorId = @currentUser
ORDER BY CreatedDate DESC, ID DESC




Возможно ли максимально быстрое выполнение запроса без полного перебора всех строк таблицы?
Если нет, какие есть способы решения подобных задач?

Самого быстрого результата удалось добиться только с покрывающим индексом:

Код: sql
1.
2.
3.
CREATE NONCLUSTERED INDEX IX_Documents_For_Users 
ON Documents (CreatedDate DESC, ID DESC)
INCLUDE (FilialId, CreatorId);



Однако время выполнения всё равно ощутимо долго (от 15 секунд).
Хотелось бы получить производительность выполнения в районе 1-2 секунд.

Благодарю за любую помощь.
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105296
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
absinthe,

Код: sql
1.
2.
create nonclustered index ix1 on [Documents] ([CreatorId] ASC) include ([CreatedDate]);
create nonclustered index ix2 on [Documents] ([FilialId] ASC) include ([CreatedDate]);



Код: sql
1.
2.
3.
4.
5.
6.
with x as (
      select [Id], [CreatedDate] from [Documents] where [CreatorId] = @currentUser
      union 
      select [Id], [CreatedDate] from [Documents] d where exists (select 1 from @userFilials f where f.[id] = d.[FilialId])
)
select top(1000) [Id] from x order by [CreatedDate] desc;
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105299
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
absinthe,

Код: sql
1.
2.
create nonclustered index ix1 on [Documents] ([CreatorId] ASC) include ([CreatedDate]);
create nonclustered index ix2 on [Documents] ([FilialId] ASC) include ([CreatedDate]);



Код: sql
1.
2.
3.
4.
5.
6.
with x as (
      select [Id], [CreatedDate] from [Documents] where [CreatorId] = @currentUser
      union 
      select [Id], [CreatedDate] from [Documents] d where exists (select 1 from @userFilials f where f.[id] = d.[FilialId])
)
select top(1000) [Id] from x order by [CreatedDate] desc;


Гм... если документов многа - будет тоскливо. Надо сразу себя ограничивать...

Код: sql
1.
2.
3.
4.
5.
6.
with x as (
      select top(1000) [Id], [CreatedDate] from [Documents] where [CreatorId] = @currentUser order by [CreatedDate] desc
      union 
      select top(1000) [Id], [CreatedDate] from [Documents] d where exists (select 1 from @userFilials f where f.[id] = d.[FilialId]) order by [CreatedDate] desc
)
select top(1000) [Id] from x order by [CreatedDate] desc;

[/
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105300
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже вот так

Код: sql
1.
2.
3.
4.
5.
6.
with x as (
      select top(1000) [Id], [CreatedDate] from [Documents] where [CreatorId] = @currentUser order by [CreatedDate] desc
      union all 
      select top(1000) [Id], [CreatedDate] from [Documents] d where exists (select 1 from @userFilials f where f.[id] = d.[FilialId]) and [CreatorId] <> @currentUser order by [CreatedDate] desc
)
select top(1000) [Id] from x order by [CreatedDate] desc;
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105455
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
absinthe
Здрасте!
Однако время выполнения всё равно ощутимо долго (от 15 секунд).
Благодарю за любую помощь.


Посмотрите в статистику. Может у вас документы очень большие и само чтение 1000 таких документов с диска занимает много времени.

Код: sql
1.
2.
3.
CREATE NONCLUSTERED INDEX IX_Documents_For_Users 
ON Documents (CreatedDate DESC, ID DESC)
INCLUDE (FilialId, CreatorId);



INCLUDE вам тут не помогает. Надо филиал ключом делать и CreatorId тоже. А вот ID не надо, он будет и так в ключе.
(CreatedDate DESC, FilialId, CreatorId)
А лучше два индекса, по филиалу и создателю.
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105473
absinthe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Код: sql
1.
create nonclustered index ix1 on [Documents] ([CreatorId] ASC) include ([CreatedDate]);



Скажите, а в данном случае сортировка будет выполняться по всему отфильтрованному набору?
Нельзя ли избежать этого? У некоторых филиалов миллионы документов :(


felix_ff,
aleks222,

Принцип понял с UNION. Меня только беспокоит полный перебор для сортировки. Но буду пробовать, спасибо!
...
Рейтинг: 0 / 0
Использование индекса с фильтрацией и сортировкой
    #40105497
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
absinthe
felix_ff
Код: sql
1.
create nonclustered index ix1 on [Documents] ([CreatorId] ASC) include ([CreatedDate]);



Принцип понял с UNION. Меня только беспокоит полный перебор для сортировки. Но буду пробовать, спасибо!


Код: sql
1.
create nonclustered index ix1 on [Documents] ([CreatorId], [CreatedDate]) include(id);
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование индекса с фильтрацией и сортировкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]