Подтвердить что ты не робот

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

CASE 1: У меня есть таблица с 30 столбцами, и я запрашиваю, используя 4 столбца в предложении where.

CASE 2: У меня есть таблица с 6 столбцами, и я запрашиваю, используя 4 столбца в предложении where.

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

Например, у меня есть таблица

table A
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10),
  g varchar(10),
  h varchar(10)

}

SELECT b,c,d
FROM A
WHERE f='foo'

create table B
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10)

}

SELECT b,c,d
FROM B
WHERE f='foo'

Обе таблицы A и B имеют одинаковую структуру, это означает только разницу в количестве столбцов и столбцов, используемых в том случае, когда условие тоже одно и то же, что и столбец в select. разница в том, что таблица B имеет только неиспользуемый столбец, которые не используются в select и где условие в этом случае есть ли разница в производительности обоих запросов?

4b9b3361

Ответ 1

Преимущество main для возврата меньше столбцов в SELECT заключается в том, что SQL может избежать чтения из таблицы/кластера, а вместо этого, если он может получить все данные selected от индекса (как индексированные столбцы, так и/или включенные столбцы в случае индекса покрытия). Столбцы, используемые в предикате, т.е. f в вашем примере, ДОЛЖНЫ быть в индексированных столбцах индекса.

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

Изменить. В ответ на обновленное сообщение OP:

Без индексов вообще оба запроса будут выполнять сканирование таблиц. Учитывая, что Table B имеет меньшее количество столбцов, чем Table A, строки на странице (плотность) будут выше на B, и поэтому B будет немного быстрее, поскольку SQL потребуется выборка на меньшее количество страниц.

Однако с показателями ниже

  • Индекс на A(f) INCLUDE (b,c,d)
  • Индекс на B(f) INCLUDE (b,c,d)

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

Изменить

Некоторые другие планы:

  • Индекс на B(f) без каких-либо других клавиш или столбцов INCLUDE или с неполным набором столбцов INCLUDE (то есть один или несколько из b, c or d):

SQL Server, вероятно, потребуется сделать Key или RID Lookup, так как даже если используется индекс, будет необходимо "присоединиться" к таблице, чтобы получить недостающие столбцы в предложении select. (Тип поиска зависит от того, имеет ли таблица кластерный ПК или нет)

  • Прямой некрупный индекс на B(f,b,c,d)

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

Ответ 2

Проверьте это и посмотрите!

Будет разница в производительности, но в 99% случаев вы ее не заметите - обычно вы даже не сможете ее обнаружить!

Вы даже не можете гарантировать, что таблица с меньшим количеством столбцов будет быстрее - если это вас беспокоит, попробуйте и посмотрите.

Технический мусор: (с точки зрения Microsoft SQL Server)

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

SQL-сервер только пытается прочитать данные, которые он абсолютно требует, однако он всегда будет загружать целую страницу за раз (8 КБ). Даже если в качестве результата для запроса требуется точная информация о том же объеме, если эти данные распространяются на большее количество страниц, требуется больше ввода-вывода.

Тем не менее, SQL-сервер невероятно эффективен с доступом к данным, поэтому вы вряд ли увидите заметное влияние на производительность, за исключением чрезвычайных ситуаций.

Кроме того, также вероятно, что ваш запрос будет выполняться с индексом, а не с таблицей, и так с индексами точно такого же размера изменение, вероятно, будет 0.

Ответ 3

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

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

Ответ 4

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

  • Получите то, что вам нужно.
  • избежать второго запроса базы данных в той же таблице для тех же строк
  • используйте индекс в столбцах выбора (ограничитель предложения WHERE)
  • ограничить столбцы, если они вам не нужны, чтобы повысить эффективность/пейджинг памяти сервера данных.

Ответ 5

Зависит от ширины таблицы (байты на строку), количества строк в таблице и наличия индексов в столбцах, используемых в запросе. Никакой окончательный ответ без этой информации. Однако, чем больше столбцов в таблице, тем больше шансов. Но эффект правильного индекса гораздо более значителен, чем эффект размера таблицы.