Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Какой индекс(ы) будет оптимально / 25 сообщений из 34, страница 1 из 2
16.04.2019, 13:11
    #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
16.04.2019, 14:18
    #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
16.04.2019, 14:21
    #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
16.04.2019, 14:30
    #39802158
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой индекс(ы) будет оптимально
monsenior,

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


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

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

Впрочем, для полной оптимальности тех индексов потребуется штук 20 навскидку...
...
Рейтинг: 0 / 0
16.04.2019, 14:40
    #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
16.04.2019, 14:43
    #39802186
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой индекс(ы) будет оптимально
msLex3. Самое сложное.
Нужно понять, скорости работы при указании (не null) каких из параметров этой процедуры вы ожидаете.
Какие их комбинации устанавливаются одновременно.
Исходя из этого создать нужные индексы.

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

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

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

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

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

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


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


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


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


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

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

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


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


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

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

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

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

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

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


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

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

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


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