Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор оптимальной длины строкового поля  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Подскажите, есть ли смысл задавать длину строкового поля (varchar или navarchar) кратной 2 к примеру, или в этом нет смысла?
К примеру стоит ли задать длину поля равной 128, если по моим предположениям длина поля будет порядка 100-110.
2 дек 13, 13:20    [15224637]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимальной длины строкового поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Строки переменной длины занимают столько места, сколько занимают данные в них. А размер оперделяет лишь максимально возможный объем данных.
2 дек 13, 13:27    [15224717]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимальной длины строкового поля  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory,

Спасибо.
2 дек 13, 13:35    [15224829]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимальной длины строкового поля  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
FRoST86,

Ну и еще оценки объема данных при выполнении запроса делаются на основании размера поля. А именно, сервер выделяет память под поля переменной длинны, как длинна поля/2. Поэтому я бы не стал делать все поля, скажем, varchar(8000)
3 дек 13, 03:39    [15229251]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимальной длины строкового поля  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mind,

Откуда дровишки?
Разве этого нет в статистике? (Average Key Length, Average Length) Разве оно не используется?
Оценка плана или выделение реальных буферов (и буферов под что)?
3 дек 13, 04:42    [15229266]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимальной длины строкового поля  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Mnior
Mind,
Разве этого нет в статистике? (Average Key Length, Average Length) Разве оно не используется?
Есть, но почему то вот не используется. Дабы не быть голословным, скрипт:

CREATE TABLE T10 (ID int identity(1,1) PRIMARY KEY, test varchar(10))
CREATE TABLE T1000 (ID int identity(1,1) PRIMARY KEY, test varchar(1000))

INSERT T10(test) VALUES(REPLICATE('X', 10))
INSERT T1000(test) VALUES(REPLICATE('X', 1000))

CREATE STATISTICS stat10 ON T10(test)
CREATE STATISTICS stat1000 ON T1000(test)
GO

SELECT * FROM T10 ORDER BY test       -- Estimated Row Size (on Sort):  20 = 11 + 4 (int) + 5 (varchar(10))
SELECT * FROM T1000 ORDER BY test     -- Estimated Row Size (on Sort): 515 = 11 + 4 (int) + 500 (varchar(1000))
GO

DROP TABLE T10
DROP TABLE T1000

Откуда берется 11 я уже не помню, но 5 и 500 это явно длинна поля деленая пополам.

Mnior
Оценка плана или выделение реальных буферов (и буферов под что)?
Буфера выделяются исключительно на основании оценки плана, так что не совсем понял вопроса. Ну и выделяются конечно же при выполнении запроса, для Sort/Hash операций, в других же случаях разницы не будет, потому что дополнительная память не нужна.
Если размерность поля сильно не совпадает с реальными данными, то будет пере/недо-оценка памяти, ну и как следствие либо слив в tempdb, либо завышенные требования к памяти, что может привести к якобы её нехватке и ожиданиям RESOURCE_SEMAPHORE.
3 дек 13, 21:20    [15235297]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить