Published on

January 1, 2019

Выбор правильных типов данных в SQL Server

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

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

Чтобы продемонстрировать это, давайте создадим таблицу с именем Names_Varchar с столбцом VARCHAR(MAX):

CREATE TABLE Names_Varchar
(
    Id INT IDENTITY(1,1),
    Names VARCHAR(MAX) NOT NULL,
    SortValue INT
);

Затем мы вставим некоторые данные из базы данных StackOverflow 2010 и присвоим случайные значения SortValue:

INSERT INTO Names_Varchar (Names)
SELECT DisplayName FROM StackOverflow2010.dbo.Users;

UPDATE Names_Varchar
SET SortValue = Id/100;

Теперь давайте попробуем отсортировать данные:

SELECT Names, SortValue FROM Names_Varchar
ORDER BY SortValue;

Изучив план выполнения, мы замечаем, что SQL Server оценил требования к памяти гораздо выше, чем фактически использовалось. Это расхождение можно объяснить типом данных VARCHAR(MAX).

Чтобы исследовать это дальше, мы определяем максимальную длину столбца Names:

SELECT MAX(LEN(Names)) FROM Names_Varchar;

Результат показывает, что самое длинное имя состоит из 36 символов. Имея эту информацию, мы теперь можем принять обоснованное решение о соответствующем типе данных для столбца Names.

Давайте создадим новую таблицу с именем Names_Varchar_100 с столбцом VARCHAR(100):

CREATE TABLE Names_Varchar_100
(
    Id INT IDENTITY(1,1),
    Names VARCHAR(100) NOT NULL,
    SortValue INT
);

Мы загрузим те же данные в эту новую таблицу:

INSERT INTO Names_Varchar_100 (Names, SortValue)
SELECT Names, SortValue
FROM Names_Varchar;

Теперь давайте повторно выполним запрос с сортировкой и наблюдаем использование памяти:

SELECT Names, SortValue FROM Names_Varchar_100
ORDER BY SortValue;

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

Мораль истории заключается в том, чтобы избегать слепого использования VARCHAR(MAX) для всех столбцов. Вместо этого уделите время анализу ваших данных и выберите соответствующие типы данных. В данном случае переход от VARCHAR(MAX) к VARCHAR(100) привел к значительному снижению использования памяти.

Помните, что принятие обоснованных решений о типах данных может иметь значительное влияние на производительность ваших запросов SQL Server. Выбирайте мудро!

Спасибо за чтение. Следите за новыми советами и трюками по SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.