Влияет ли количество столбцов в представлении на производительность?

У меня есть представление, которое извлекает около 200 столбцов из таблицы, без объединений. Проки, которые используют представление, используют только около 10 столбцов. Влияет ли наличие дополнительных 190 столбцов на производительность при использовании представления?

РЕДАКТИРОВАТЬ: просто чтобы уточнить на основе исходного комментария спрашивающего, запрос в его процедуре использует только 10 столбцов из 200. Вопрос в том, вызывает ли это снижение производительности, поскольку базовое представление содержит 200 столбцов, или оптимизатор знает использовать только 10 столбцов и игнорирует знания представления 190 других?

Спасибо,

Крис

4 голоса | спросил GernBlandston 5 +04002009-10-05T16:45:27+04:00312009bEurope/MoscowMon, 05 Oct 2009 16:45:27 +0400 2009, 16:45:27

4 ответа


0

190 лишних столбцов определенно повлияют на вашу производительность. Адам довольно хорошо объясняет это в своем блоге: http://jahaines.blogspot.com/2009/06/superfluous-columns-more-than-bad-habit.html

ответил rfonn 5 +04002009-10-05T16:53:27+04:00312009bEurope/MoscowMon, 05 Oct 2009 16:53:27 +0400 2009, 16:53:27
0

Прежде всего, если ваше представление ограничивается использованием предложения WHERE, вы, скорее всего, будете страдать от снижения производительности, по крайней мере, из-за невозможности использовать хороший индекс для ваших 10 столбцов, если он конфликтует с собственным используемым индексом представления.

Если представление просто ограничивает столбцы, но не содержит предложения WHERE, это неопределенно - подробности см. ниже:

На основе эта статья а > Я предполагаю, что вы понесете штраф, поскольку представление НЕ обязательно будет скомпилировано с использованием ваших 10 столбцов, и вы можете унаследовать неверный план запроса.

Это очень легко проверить:

  1. Выполнить запрос

    выберите * из myView, где someNonIndexedColumn = someValue

    (убедитесь, что столбца в предложении where нет ни в одном из индексов исходной таблицы).

  2. Запустите приведенный выше запрос с включенным планом запроса и убедитесь, что он выполняет сканирование таблицы.

  3. Теперь выберите пару столбцов, которые находятся в индексе исходной таблицы, например, убедитесь, что запрос по ним должен использовать индекс покрытия. Скажем, C1 и C2 в индексе I1.

  4. Выполнить

    выберите C1, C2 из myTable, где C1 = x и C2 = Y

    включите план запроса и убедитесь, что он использует индекс "I1" в качестве покрывающего индекса.

  5. Выполнить

    выберите C1, C2 в myView, где C1 = x и C2 = Y

    с включенным планом запроса и проверьте, будет ли он выполнять сканирование таблицы или I1 в качестве индекса покрытия.

Я подозреваю, что он выполнит сканирование таблицы, и в этом случае вы ответите: «Extr 190 столбцов - плохая вещь для производительности» - в основном, все негативы в связанной статье Райана Фоннетта применимы к вашему мнению.

Если (маловероятно) он использует индекс покрытия в # 5, то тот факт, что thew имеет 190 columsn, не имеет значения.

ответил DVK 5 +04002009-10-05T17:10:32+04:00312009bEurope/MoscowMon, 05 Oct 2009 17:10:32 +0400 2009, 17:10:32
0

Все зависит, конечно. Это всегда будет иметь влияние. Но если мы говорим о приложении, работающем на том же сервере, что и база данных, и столбцах, каждый из которых содержит несколько байтов, влияние не должно быть важным.

С другой стороны, если мы говорим о клиенте, работающем по сети для доступа к базе данных и извлекающем 190 дополнительных столбцов, таких как (строка * 255), то у вас большие проблемы, если ваш сетевой администратор может поймать вас живым.

В любом случае, не очень элегантно запрашивать столько ненужных столбцов. Почему бы не адаптировать ваш запрос так, чтобы он запрашивал только нужные столбцы. Я предполагаю, что вы используете «select * from ...», что порождает другую проблему: когда кто-то меняет представление (добавляет столбцы или удаляет столбцы), ваша программа блокируется.

ответил 5 +04002009-10-05T17:15:07+04:00312009bEurope/MoscowMon, 05 Oct 2009 17:15:07 +0400 2009, 17:15:07
0

Вместо того, чтобы спрашивать нас, это то, что вы должны проверить сами, поскольку ответ может сильно зависеть от структуры вашей базы данных и вида, а также от структуры вашего запроса и имеющегося у вас оборудования. Протестируйте выбор четырех столбцов в представлении и не выбирайте их непосредственно из соответствующих таблиц, и вы узнаете, есть ли у вас ощутимая разница в производительности. Если у вас есть представления, сложенные в представлениях, я подозреваю, что вы найдете ощутимое различие, это может не иметь большого значения, если существует только одно представление.

ответил HLGEM 5 +04002009-10-05T21:59:23+04:00312009bEurope/MoscowMon, 05 Oct 2009 21:59:23 +0400 2009, 21:59:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132