Skip to content

Query memory grants. Часть 2: Varchar и сортировка

Пересказ статьи Arthur Daniels. Query memory grants part 2: Varchars and sorting


Какого черта мы сделали все наши столбцы varchar? Это гипотетический вопрос, извините.

И теперь мы должны заплатить за наши решения. Рассмотрим запрос, который должен выполнить некоторую сортировку. Давайте возьмем таблицу, которую нужно отсортировать.

Сортировка varchar


CREATE TABLE Names_Varchar
(Id INT IDENTITY(1,1),
Names VARCHAR(MAX) NOT NULL,
SortValue int);
CREATE CLUSTERED INDEX cx_Names_Varchar on Names_Varchar(Id);

Добавим в таблицу данные из базы StackOverflow 2010.

INSERT INTO Names_Varchar (Names)
SELECT DisplayName FROM StackOverflow2010.dbo.Users
--(обработано 299611 строк)


Следующий запрос

UPDATE Names_Varchar
SET SortValue = Id/100;
позволяет мне иметь несколько вариаций SortValues на каждое значение DisplayName. Имена не следуют какому-либо конкретному порядку, поэтому это привносит элемент случайности. Теперь мы готовы к сортировке и обслуживанию нашего запроса.

SELECT Names,SortValue FROM Names_Varchar
ORDER BY SortValue;

А вот план выполнения, который вы просили.



Тут много требуемой памяти, 1493120 Кб или 1,4 Гб, но только 25 Мб использовалось для сортировки. Итак, почему SQL Server был так далек от правильной оценки? Это типы данных, которые мы выбрали.

Обвиняем типы данных


Какое максимальное значение в столбце Names?

SELECT MAX(LEN(Names)) FROM Names_Varchar;
--36

Запомним это и попробуем еще раз.

Имена с varchar(100)


CREATE TABLE Names_Varchar_100
(Id INT IDENTITY(1,1),
Names varchar(100) NOT NULL,
SortValue int);
CREATE CLUSTERED INDEX cx_Names_Varchar_100 on Names_Varchar_100(Id);

Загрузим те же данные и т.д.

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

Отправили и отсортировали опять. Посмотрим, сколько памяти было выделено.



Желаемая и выделенная память около 38 Мб, а используемая память ~ 18 Мб. Это намного ближе.

Мораль


Я не рекомендую слепо менять ваши максимальные значения varchar. Я хотел показать, что имеются лучшие способы выбирать типы данных. Разница между max и 100 в данном случае весьма драматична - более 1 Гб лишней памяти.

Просто принимайте правильные решения относительно типов ваших данных.

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.