Статистический анализ для измерения производительности при использовании большего типа данных, где они вообще не требовались - PullRequest
1 голос
/ 08 июня 2010

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

например.

IsActive (0,1,2,3) не более 3 в любой случай.

Я знаю, что должен принять tinyint, но по некоторым причинам считаю его обязательным, я принимаю каждое числовое поле за bigint, а каждое поле character за nVarchar(Max)

Пожалуйста, приведите статистику, если это возможно, чтобы я попытался преодолеть это принуждение.

Мне нужен серьезный анализ, который действительно может заставить кого-то переосмыслить, прежде чем использовать какой-либо тип данных.

EDIT

Скажите, я использую

SELECT * FROM tblXYZ where IsActive=1

Как это повлияет? Считайте, что у меня есть 1 миллион записей Будь то только потеря памяти или потеря производительности. Я знаю больше, нет страниц, требуются дополнительные усилия по индексации, следовательно, производительность также будет затронута. Но мне нужна статистика, если это возможно.

Ответы [ 5 ]

3 голосов
/ 08 июня 2010

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

1 голос
/ 08 июня 2010

Определить это в статистических терминах довольно сложно, вы можете буквально посчитать и вычислить дополнительные затраты ввода-вывода.

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

Учитывая таблицу, размер строки которой составляет 100 байтов, которая содержит 10 крошечных. Количество строк на странице (при условии отсутствия заполнения / фрагментации) составляет 80 (8096/100)

При использовании Bigints к размеру строки будет добавлено в общей сложности 70 байтов (10 полей, каждое на 7 байтов больше), что даст размер строки 170 байтов и уменьшит число строк на странице до 47.

Для 1 миллиона строк это приводит к 12500 страницам для крошечных и 21277 страниц для Bigints.

Если взять один диск с последовательным чтением, мы можем ожидать 300 операций ввода-вывода в секунду при последовательном чтении, и каждое чтение составляет 8 КБ (например, страница).

Соответствующее время чтения данного теоретического диска составляет 41,6 секунды и 70,9 секунды - для очень теоретического сценария составленной таблицы / строки.

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

С точки зрения кэширования памяти каждый потерянный байт на странице на диске - это потерянный байт в памяти, но он применяется только к страницам в памяти - это будет более сложным, так как потеря памяти будет основана на том, сколько страниц находится в пуле буферов, но для приведенного выше примера это будет в целом 97,6 мегабайт данных против 166 мегабайт данных, и при условии, что вся таблица была отсканирована и, таким образом, в пуле буферов, вы бы тратили 78 мегабайт памяти.

1 голос
/ 08 июня 2010

Все «потраченное впустую» пространство также вступает в игру для DR (если ваш размер в 4-6 раз больше из-за плохой конфигурации типа данных, восстановление может быть таким же длительным).

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

1 голос
/ 08 июня 2010

Я бы по крайней мере сократил бы его до int. Бигинт - это слишком много. Но что-то в этой области напоминает мне, что с таблицей тоже что-то не так. Может быть, это просто имя столбца & mdash; IsActive звучит так, как будто это должен быть логический / битовый столбец.

Более того, я беспокоюсь о ваших полях varchar (max). Они будут складываться еще быстрее.

1 голос
/ 08 июня 2010

Многое из этого сводится к космосу.Ваши bigints будут занимать в 8 раз больше места (8 байт против 1 байта для tinyint).Ваш nvarchar собирается взять вдвое больше байтов, чем varchar.Максимальное увеличение значения ни на что не повлияет.

Это действительно вступит в силу, если вы посмотрите на ценности.Индексы, которые вы будете (будем надеяться) применять, будут намного больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...