Столкнулся с проблемой быстродействия БД. Было принято решение создавать индексы, но возникли вопросы о их целесообразности.
Первый вопрос: есть таблица, в которую постоянно пишутся и из которой постоянно читаются данные. Соотношение операций 2/3 — чтение, 1/3 запись. Но есть ситуации, когда данные только что записались в базу и через секунду оттуда уже читаются (такова архитектура, я на нее никак повлиять не могу). Процент таких операций около 20%. Насколько оправдано использование индексов в таких случаях?
И второй вопрос: с какой скоростью обновляются индексы и что будет, если данные туда еще не успели попасть? Т.е. интересует краткий обзор «на пальцах», как SQL будет искать данные в базе и заносить их туда.
Индексы будут оправданы уже если чтений больше, чем записи. Индексы обновляются сразу.
Насчет целесообразности создания и какиех именно индексов — поможет DataBase Engine Tuning Advisor
На пальцах: то, колонки, которые есть в запросах с WHERE должны быть в индексе.
Например, Select * from Table WHERE UserId= 1 AND PermissionId = 2
В этом случае уместен индекс по полям UserId, PermissionId.
При этом, стоит учитывать, что чем больше индексов, тем медленнее вставки. Поэтому главное не переборщить :)
Также очень поможет в Management Studio просмотр планов запросов, там показывается, какие индексы используются
Так, насчет обновления индексов — может и соврал :)
Насчет того, ч то дергают таблицу: посмотрите на READ_COMMITTED_SNAPSHOT уровень изоляции. Поможет избежать блокировок таблицы на чтение => ускорит чтение при одновременной записи в разы
Настоятельно советую раздобыть книгу по MS SQL и тщательно изучить вопросы индексов и хранения данных в соотвутствующих версиях. Производительность вставок и чтений может очень сильно зависеть не только от того какие индексы построены но и от того как они построены и как хранятся данные. Т.е. и просто индексы могут сильно вам помочь, но если сделать все правильно (а рычагов за которые можно «покрутить» там достаточно) то можно получить гораздо больше.