Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация индексов в MS SQL  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Добрый день!
Решил заняться оптимизацией БД, начал с индексов, и возникла сразу кучу вопросов и непонимания, помогите с ними разобраться.
Для примера возьмем таблицу PHONE

  [ID] int IDENTITY(1, 1) NOT NULL,
  [COMP_ID] int NOT NULL,
  [CONT_ID] int NOT NULL,
  [PHONE] bigint NULL,
  [PHONE_TYPE] int NULL,
  [additional_PHONE] int CONSTRAINT [DF__PHONE__additiona__1CE72E9F] DEFAULT 0 NULL,
  [AddTime] datetime CONSTRAINT [DF__PHONE__AddTime__72D0F942] DEFAULT getdate() NULL,
  [LAST_CALL] datetime NULL,
 
  CONSTRAINT [PHONE_uq] UNIQUE ([PHONE], [additional_PHONE]),
  CONSTRAINT [PK__PHONE__3214EC276FF48C97] PRIMARY KEY CLUSTERED ([ID])

(еще стоит 2 индекса на COMP_ID и CONT_ID, в таблице 1млн записей)
Вопросы:
1. В индексе есть параметры: блокировка строк, блокировка страниц.
- Правильно ли я понимаю, что если эти два параметра выключить, то даже при апдейте оной строки будет блокироваться вся таблица?
- В каких случаях выгодно оставить включенным только блокировка строк, а в каких выгодно выключать их оба?
2. Очень много вопросов у меня вызывают индексы по нескольким полям.
- К примеру в таблице выше создался некластеризованный индекс PHONE_uq. И у меня есть запрос, где в WHERE используется только поле PHONE. Поможет ли как то мне индекс PHONE_uq? Либо если часто используется только поле PHONE, для него лучше создать отдельный индекс?
- Чем индекс по нескольким полям выгодней, чем если бы я на каждое поле по отдельности вешал индекс?
- У меня на поле COMP_ID и CONT_ID висят индексы, и если распределить все запросы использующие эти поля, то получится так, что 1/3 использует только COMP_ID, 1/3 только CONT_ID, 1/3 их оба. Есть ли смысл создать один индекс в который будет входить сразу два этих поля?
9 июн 13, 15:28    [14411379]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация индексов в MS SQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вы копаете в глубь, а надо вширь.
Эти подробности только ещё больше запутают.
Вы хотите получить набор серебряных пуль не понимая почему и как они работают. Вы не сможете ими воспользоваться по назначению.

Начните с чтения планов. Это основа и первичная часть. Всегда, даже у гуру всё начинается с планов.
Не хотите читать планы - меняйте профессию.

В чём суть индекса, как он работает, каковы преимущества, какие у него атрибуты, когда он используется, почему ...
Вы должны понимать суть.

Оптимизация всегда делаться сверху вниз. Вы находите проблемы от архитектуры, где малое изменение даёт 100500% эффективности, и в самом конце лишь доходите до мелочей, где 100500 изменений почти ничего не дают.

Где у вас проблемные места, с того и начинайте.
9 июн 13, 23:26    [14412467]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация индексов в MS SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Николай Н.
1. В индексе есть параметры: блокировка строк, блокировка страниц.
- Правильно ли я понимаю, что если эти два параметра выключить, то даже при апдейте оной строки будет блокироваться вся таблица?

Да

Николай Н.
- В каких случаях выгодно оставить включенным только блокировка строк, а в каких выгодно выключать их оба?

Выгода от отключения блокировки страниц? Это должен быть какой-то очень специфический случай. Недостаток возникает сразу -- такие индексы нельзя дефрагментировать (ALTER INDEX REORGANIZE).

Оставляйте и блокировку строк, и блокировку страниц. SQL Server сам будет накладывать блокировки на нужном уровне, и он вполне умеет это делать. Не занимайтесь микро-оптимизацией там, где у вас нет чёткого понимания последствий.

Николай Н.
у меня есть запрос, где в WHERE используется только поле PHONE. Поможет ли как то мне индекс PHONE_uq?

Смотря какой запрос. Может, там у вас условие "WHERE PHONE <> @x". Тогда никакой индекс не поможет. План смотрели? Что там используется?

Николай Н.
- У меня на поле COMP_ID и CONT_ID висят индексы, и если распределить все запросы использующие эти поля, то получится так, что 1/3 использует только COMP_ID, 1/3 только CONT_ID, 1/3 их оба. Есть ли смысл создать один индекс в который будет входить сразу два этих поля?

Может, есть смысл, а может, и нет. Не видя запросов (и не зная примерного распределения данных), нельзя сказать ничего определённого.
10 июн 13, 01:53    [14412690]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация индексов в MS SQL  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Николай Н.
- К примеру в таблице выше создался некластеризованный индекс PHONE_uq. И у меня есть запрос, где в WHERE используется только поле PHONE. Поможет ли как то мне индекс PHONE_uq? Либо если часто используется только поле PHONE, для него лучше создать отдельный индекс?
В общем случае, да, поможет, потому что в индексе первое поле - PHONE.
Николай Н.
- Чем индекс по нескольким полям выгодней, чем если бы я на каждое поле по отдельности вешал индекс?
Тем что при поиске по нескольким полям SQL сервер очень редко может использовать поиск сразу по нескольким индексам для доступа к таблице. Тогда нужен композитный индекс.
А в вашем случае, посмотрите внимательно, это не просто индекс, а уникальный constraint.
Николай Н.
- У меня на поле COMP_ID и CONT_ID висят индексы, и если распределить все запросы использующие эти поля, то получится так, что 1/3 использует только COMP_ID, 1/3 только CONT_ID, 1/3 их оба. Есть ли смысл создать один индекс в который будет входить сразу два этих поля?
при любом раскладе 1/3 ваших запросов не сможет использовать поиск по такому индексу.
11 июн 13, 03:14    [14418327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить