powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Какой индекс(ы) будет оптимально
25 сообщений из 34, страница 1 из 2
Какой индекс(ы) будет оптимально
    #39802072
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть таблица лиц примерного содержания
Face
idFNMmmddyyyy1ИвановИванИванович010119702ПетровПетрПетрович020219803СергеевСергейСергеевич030319904МарковМаркМаркович01021981

запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure sp_face
  @F varchar(50) = null,
  @N varchar(50) = null,
  @M varchar(50) = null,
  @dd varchar(50) = null,
  @mm varchar(50) = null,
  @yyyy varchar(50) = null
as
begin
SET NOCOUNT ON; 

select *
  from Face 
  where 
   F = isnull(@F, F) and
   N = isnull(@N, N) and
   M = isnull(@M, M) and
   mm = isnull(@mm, mm) and
   dd = isnull(@dd, dd) and
   yyyy = isnull(@yyyy, yyyy)
end


как правильно поступить с индексами?
1. сделать индекс на все поля в разделе where
2. сделать один покрывающий индекс
3. сделать 1. и 2.
?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802145
monsenior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексашаЗдравствуйте.

Есть таблица лиц примерного содержания
Face
idFNMmmddyyyy1ИвановИванИванович010119702ПетровПетрПетрович020219803СергеевСергейСергеевич030319904МарковМаркМаркович01021981

запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure sp_face
  @F varchar(50) = null,
  @N varchar(50) = null,
  @M varchar(50) = null,
  @dd varchar(50) = null,
  @mm varchar(50) = null,
  @yyyy varchar(50) = null
as
begin
SET NOCOUNT ON; 

select *
  from Face 
  where 
   F = isnull(@F, F) and
   N = isnull(@N, N) and
   M = isnull(@M, M) and
   mm = isnull(@mm, mm) and
   dd = isnull(@dd, dd) and
   yyyy = isnull(@yyyy, yyyy)
end


как правильно поступить с индексами?
1. сделать индекс на все поля в разделе where
2. сделать один покрывающий индекс
3. сделать 1. и 2.
?

п.2, т.к. запрос всегда идет по всем полям.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802149
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monseniorАлексашаЗдравствуйте.

Есть таблица лиц примерного содержания
Face
idFNMmmddyyyy1ИвановИванИванович010119702ПетровПетрПетрович020219803СергеевСергейСергеевич030319904МарковМаркМаркович01021981

запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure sp_face
  @F varchar(50) = null,
  @N varchar(50) = null,
  @M varchar(50) = null,
  @dd varchar(50) = null,
  @mm varchar(50) = null,
  @yyyy varchar(50) = null
as
begin
SET NOCOUNT ON; 

select *
  from Face 
  where 
   F = isnull(@F, F) and
   N = isnull(@N, N) and
   M = isnull(@M, M) and
   mm = isnull(@mm, mm) and
   dd = isnull(@dd, dd) and
   yyyy = isnull(@yyyy, yyyy)
end



как правильно поступить с индексами?
1. сделать индекс на все поля в разделе where
2. сделать один покрывающий индекс
3. сделать 1. и 2.
?

п.2, т.к. запрос всегда идет по всем полям.

покрывающий что? все поля из таблицы?
каждый такой запрос будет читать весь этот индекс, чем это лучше скана кластерного индекса или кучи?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802158
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monsenior,

конструкция a = a не делает использование "всех" полей.


Алексаша
если нет обязательных полей, то в общем-то всё без разници, или создать комбинацию на большинство случаев ака
F,N,M
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802159
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция в условиях отбора - это фуллскан, так что пофиг индексы.

Преобразуйте условия в комбинацию (field = @var OR @var IS NULL) , тогда оптимизатор вычислит выражения с константой ещё на стадии анализа, одно из двух условий отбросит, и сможет использовать индекс(ы).

Впрочем, для полной оптимальности тех индексов потребуется штук 20 навскидку...
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802177
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексашаЗдравствуйте.

Есть таблица лиц примерного содержания
Face
idFNMmmddyyyy1ИвановИванИванович010119702ПетровПетрПетрович020219803СергеевСергейСергеевич030319904МарковМаркМаркович01021981

запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure sp_face
  @F varchar(50) = null,
  @N varchar(50) = null,
  @M varchar(50) = null,
  @dd varchar(50) = null,
  @mm varchar(50) = null,
  @yyyy varchar(50) = null
as
begin
SET NOCOUNT ON; 

select *
  from Face 
  where 
   F = isnull(@F, F) and
   N = isnull(@N, N) and
   M = isnull(@M, M) and
   mm = isnull(@mm, mm) and
   dd = isnull(@dd, dd) and
   yyyy = isnull(@yyyy, yyyy)
end



как правильно поступить с индексами?
1. сделать индекс на все поля в разделе where
2. сделать один покрывающий индекс
3. сделать 1. и 2.
?


Если хотите индексированного поиска, то

1. Перепишите isnull на (F = @F or @f is null)
2. Добавьте option(recompile) в конец запроса
3. Самое сложное.
Нужно понять, скорости работы при указании (не null) каких из параметров этой процедуры вы ожидаете.
Какие их комбинации устанавливаются одновременно.
Исходя из этого создать нужные индексы.

Например,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N

2. Дату рождения у вас всегда ищут как день + месяц, иногда уточняют год
Сделали индекс по полям dd, mm, yyy


Серебряной пули (одного индекса) которая решит все возможные кейсы - нет.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802186
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex3. Самое сложное.
Нужно понять, скорости работы при указании (не null) каких из параметров этой процедуры вы ожидаете.
Какие их комбинации устанавливаются одновременно.
Исходя из этого создать нужные индексы.

Например,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N

2. Дату рождения у вас всегда ищут как день + месяц, иногда уточняют год
Сделали индекс по полям dd, mm, yyyПомню, накапливал статистику для подобного случая. Потом сделал несколько индексов, покрывающих 99% запросов.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802193
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgmsLex3. Самое сложное.
Нужно понять, скорости работы при указании (не null) каких из параметров этой процедуры вы ожидаете.
Какие их комбинации устанавливаются одновременно.
Исходя из этого создать нужные индексы.

Например,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N

2. Дату рождения у вас всегда ищут как день + месяц, иногда уточняют год
Сделали индекс по полям dd, mm, yyyПомню, накапливал статистику для подобного случая. Потом сделал несколько индексов, покрывающих 99% запросов.
если объёмы не фантастика, то можно и от обратного, наклепать, через месяц удалить не используемые :)
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802195
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgmsLex3. Самое сложное.
Нужно понять, скорости работы при указании (не null) каких из параметров этой процедуры вы ожидаете.
Какие их комбинации устанавливаются одновременно.
Исходя из этого создать нужные индексы.

Например,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N

2. Дату рождения у вас всегда ищут как день + месяц, иногда уточняют год
Сделали индекс по полям dd, mm, yyyПомню, накапливал статистику для подобного случая. Потом сделал несколько индексов, покрывающих 99% запросов.
Спасибо за пример-подтверждение.
Значит подобный подход к поиску по разным комбинациям фильтров распространен.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802197
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, всем спасибо!
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802199
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,


msLexНапример,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N


Индекс покрывающий т.е. 2 поля? Не два индекса по одному полю в каждом?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802202
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKalexeyvgПомню, накапливал статистику для подобного случая. Потом сделал несколько индексов, покрывающих 99% запросов.
если объёмы не фантастика, то можно и от обратного, наклепать, через месяц удалить не используемые :)Дык сколько их делать, сотню? Комбинаций то много.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802203
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексашаmsLex,


msLexНапример,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N


Индекс покрывающий т.е. 2 поля? Не два индекса по одному полю в каждом?

Для этого примера два поля, и именно в этом порядке
В этом случае, он будет работать как при фильтре только по фамилии так и при фильтре по фамилия + имя

Опять же, вполне может хватить и фильтра просто по фамилии, если она почти уникальна в ваших данных.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802206
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексашаmsLex,


msLexНапример,
1. Вы выяснили, что самым частым случаем является поиск по фамилии, иногда добавляют имя
Сделали индекс по полям F, N


Индекс покрывающий т.е. 2 поля? Не два индекса по одному полю в каждом?Да. Собстьвенно, индекс по мм вряд ли имеет смысл делать отдельно, селективность низкая.
Ну и вообще, индекс на несколько полей всегда лучше, если все эти поля используются в запросе.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802217
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgTaPaKпропущено...

если объёмы не фантастика, то можно и от обратного, наклепать, через месяц удалить не используемые :)Дык сколько их делать, сотню? Комбинаций то много.
ну если не думать то 120
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802225
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, а запрос не кривоватый?
А то ведь отчество иногда пустым бывает. Или там не NULL, а '' в таблице будет?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802235
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexСеребряной пули (одного индекса) которая решит все возможные кейсы - нет.Есть. Полнотекстовый.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802251
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели планируются запросы, возвращающие строки только по первым числам или по декабрям?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802269
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНеужели планируются запросы, возвращающие строки только по первым числам или по декабрям?
Отдельно - вряд ли.
А вот, например, за 1-е декабря, независимо от года, запросто.
Стандартная задача поиск сотрудников, у которых сегодня ДР.

invmЕсть. Полнотекстовый.
Есть еще CS.
Они универсальнее, но обычно проигрывают по скорости специально созданным индексам.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802394
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНеужели планируются запросы, возвращающие строки только по первым числам или по декабрям?Всё правильно, ну вот и нужно понять, какие сочетания обычны, а какие невероятны.
Как понять? Наверное, лучше всего собрать статистику, потому что для каждой предметной области типичны свои сочетания.

По первым числам - например, секретарша смотрит, у кого там день рождения сегодня, 16-го. (ввести 16 апреля, а не просто 16, ей не приходит в голову - она и так увидит в списке, у кого из них в апреле; все бухгалтеры и секретарши прекрасно знают, что проще выгрузить огромную таблицу, правильно отсортировать, и потом пролистать, чем накладывать фильтры) :-)
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802397
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexЕсть еще CS.
Они универсальнее, но обычно проигрывают по скорости специально созданным индексам.Да.

Только я не про вообще, а про конкретную задачу ТС.
Добавляется вычисляемый столбец с, например, таким содержимым
Код: sql
1.
id:1 F:Иванов N:Иван M:Иванович mm:01 dd:01 yyyy:1970

и по нему строится полнотекстовый индекс с отключенным стоп-листом.
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802403
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmДобавляется вычисляемый столбец с, например, таким содержимым
Код: sql
1.
id:1 F:Иванов N:Иван M:Иванович mm:01 dd:01 yyyy:1970


и по нему строится полнотекстовый индекс с отключенным стоп-листом.А чем это будет эффективнее отдельных индексов по полям?
Веть FTS будет искать в индексе наборы про нескольким значениям (словам), и искать пересечение.
И сиквел может искать по нескольким обычным индексам подмножества, и искать пересечение.
Может, в FTS это делается эффективнее, но мне не верится, ядро из 90-х они пока в своих надстройках не превзошли :-)
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802500
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВеть FTS будет искать в индексе наборы про нескольким значениям (словам), и искать пересечение.
И сиквел может искать по нескольким обычным индексам подмножества, и искать пересечение.При использовании множества индексов по столбцам:
- как часто вы наблюдали план, в котором оптимизатор самостоятельно решил строить пересечение более чем двух индексов?
- каким образом обеспечить неизменность запроса при добавлении/удалении/усложнении критериев поиска?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802543
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmalexeyvgВеть FTS будет искать в индексе наборы про нескольким значениям (словам), и искать пересечение.
И сиквел может искать по нескольким обычным индексам подмножества, и искать пересечение.При использовании множества индексов по столбцам:
- как часто вы наблюдали план, в котором оптимизатор самостоятельно решил строить пересечение более чем двух индексов?
- каким образом обеспечить неизменность запроса при добавлении/удалении/усложнении критериев поиска?Более двух не видел, но разве этого мало? Наверное, сервер считает, что быстрее просканировать небольшой результат, чем искать пересечение с третьим огромным подмножеством?
Вот как сервер ищет в FTS? Он точно будет джойнить три независимых поиска, или ограничится двумя, и отфильтрует результат?
Думаю, что оптимальный путь зависит от конкретных данных.

Второй пункт не понял, зачем обеспечивать неизменность?
...
Рейтинг: 0 / 0
Какой индекс(ы) будет оптимально
    #39802570
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgНаверное, сервер считает, что быстрее просканировать небольшой результат, чем искать пересечение с третьим огромным подмножеством?Так вот это и проблема - получить пересечение двух индексов в объеме, достаточном, чтобы потом *Lookup с фильтрацией не убил производительность. Можете такое гарантировать без ручных оптимизаций?
alexeyvgВторой пункт не понял, зачем обеспечивать неизменность?Чтоб не переписывать всякий раз запрос.

К тому же, асинхронно поддерживать один FTI может оказаться банально выгоднее синхронной поддержки N индексов.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Какой индекс(ы) будет оптимально
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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