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

Откуда:
Сообщений: 554
На основе прочитанного материала остались следующие вопросы - будут ли различия в производительности и занимаемом пространстве на диске в следующих ситуациях:
1) char(50) vs varchar(50) при условии, что 90% данных будут до 50 символов
2) varchar(500) vs varchar(8000) при условии, что 100% данных будут до 500 символов
3) varchar(8000) vs varchar(max) при условии, что 100% данных будут до 8000 символов (не затрагивая ограничения varchar(max) на индексы и некоторые операторы)
29 янв 13, 13:29    [13843982]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Glory
Member

Откуда:
Сообщений: 104760
blest
что 90% данных будут до 50 символов

"до" означаете от 0 до 50 ?
29 янв 13, 13:33    [13844025]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
blest
Member

Откуда:
Сообщений: 554
Glory
blest
что 90% данных будут до 50 символов

"до" означаете от 0 до 50 ?


Извиняюсь, я имел ввиду 90% данных будут ровно 50 символов
29 янв 13, 13:34    [13844033]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Однозначно:
1. varchar(50)
2. varchar(500)
3. varchar(8000)
29 янв 13, 13:36    [13844048]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
BOL
char [ ( n ) ]
Символьные данные фиксированной длины, не в Юникоде, с длиной n байт. Значение n должно находиться в интервале от 1 до 8000. Размер хранения данных этого типа равен n

varchar [ ( n | max ) ]
Символьные данные переменной длины, не в Юникоде. n может иметь значение от 1 до 8 000. max означает, что максимальный размер хранения равен 2^31-1 байт. Размер хранения равен фактической длине данных плюс два байта. Введенные данные могут иметь длину 0 символов. .
параметр ДО так же расплывчив
29 янв 13, 13:36    [13844054]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Glory
Member

Откуда:
Сообщений: 104760
blest
Извиняюсь, я имел ввиду 90% данных будут ровно 50 символов

А остальные 10% будут 49 символов ? 48 ? 1 ?

blest
2) varchar(500) vs varchar(8000) при условии, что 100% данных будут до 500 символов

разницы не будет
Кроме возможных ошибок о превышении общего размера записи
29 янв 13, 13:44    [13844138]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
blest
Member

Откуда:
Сообщений: 554
Glory
blest
Извиняюсь, я имел ввиду 90% данных будут ровно 50 символов

А остальные 10% будут 49 символов ? 48 ? 1 ?


Остальные будут 45-49 символов

Гавриленко Сергей Алексеевич
Однозначно:
1. varchar(50)
2. varchar(500)
3. varchar(8000)


Спасибо за ответ, но для общего понимания я хотел бы узнать будет ли разница между этими вариантами.
29 янв 13, 14:00    [13844244]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Glory
Member

Откуда:
Сообщений: 104760
blest
Glory
пропущено...

А остальные 10% будут 49 символов ? 48 ? 1 ?


Остальные будут 45-49 символов

Тогда на 10 записях разница будет 5байт
на 1000 - 500байт
на 1 000 000 - 500 000 байт
29 янв 13, 14:07    [13844294]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
varchar?
Guest
будут ли апдейтиться записи с изменением в большую сторону длины полей?
29 янв 13, 14:09    [13844313]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
1. Оверхед по хранению пробелов в char скорее всего перекроет все остальные мизерные выигрыши фиксированных типов у нефиксированных.
2. Добавьте два поля varchar(8000) в таблицу, и увидите мерзкий варнинг. Лично мне он не нравится.
3. Varchar(max) настолько другой и настолько предназначен для хранения большего объема данных, что разница в перфомансе будет видна невооруженным взглядом. Ищите поиском по форуму, мусолилось несколько раз.

Сообщение было отредактировано: 29 янв 13, 14:10
29 янв 13, 14:09    [13844315]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
blest
char(50) vs varchar(50)

Можно, конечно, провести расчёт средней длины записи:
1) char(50) = 50 байт
2) varchar(50) = 2 + 0.9 * 50 + 0.02 * 49 + 0.02 * 48 + 0.02 * 47 + 0.02 * 46 + 0.02 * 45 = 51.7 байт.

Ух ты, char(50) выгоднее.

С другой стороны, всегда ли данные будут 50 символов? Не понадобится ли когда-нибудь увеличить длину строки, например, до 60 символов? На большой таблице и загруженной системе при типе char(50) получите танцы с бубном, тогда как при типе varchar(50) — всего лишь изменение в метаданных таблицы.
29 янв 13, 14:14    [13844369]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
blest
Member

Откуда:
Сообщений: 554
Спасибо большое за ответы
29 янв 13, 14:53    [13844759]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
2) varchar(500) vs varchar(8000)

на varchar(8000) индекс навесить - уже веселуха. Потому лучше varchar(500)
29 янв 13, 19:01    [13846802]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
varchar(8000)
Guest
Ivan Durak
2) varchar(500) vs varchar(8000)

на varchar(8000) индекс навесить - уже веселуха. Потому лучше varchar(500)

если хранить в них одинаковые данные - то похер.
29 янв 13, 19:28    [13846956]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Есть еще один момент который тут не упомянули.
Выделение оперативной памяти для запросов оптимизатором.
Оптимизатор пологает что в столбце varchar(100) в серднем храниться по 50 символов, т.е. 1/2 заполнености, исходя из этого выделяет память для запросов.
Соответствено делаем вывод, что оптимальное значение N для varchar(N) должно быть равно средней длине строки в данном столбце умноженое на 2.

select avg(len(VarCharColumn)) * 2
from dbo.Table

Более подробно в блоге Дмитрия Короткевича.
http://aboutsqlserver.com/2010/08/18/what-is-the-optimal-size-for-variable-width-columns/
29 янв 13, 19:30    [13846962]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
avg(len(VarCharColumn)) * 2
Guest
Владимир Затуливетер
select avg(len(VarCharColumn)) * 2
from dbo.Table

среднее может быть более чем в два раза меньше максимального .
29 янв 13, 19:35    [13846989]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владимир Затуливетер
Есть еще один момент который тут не упомянули.
Выделение оперативной памяти для запросов оптимизатором.
Оптимизатор пологает что в столбце varchar(100) в серднем храниться по 50 символов, т.е. 1/2 заполнености, исходя из этого выделяет память для запросов.
Соответствено делаем вывод, что оптимальное значение N для varchar(N) должно быть равно средней длине строки в данном столбце умноженое на 2.

select avg(len(VarCharColumn)) * 2
from dbo.Table

Более подробно в блоге Дмитрия Короткевича.
http://aboutsqlserver.com/2010/08/18/what-is-the-optimal-size-for-variable-width-columns/
На синтетическом примере воспроизводится. В реальной жизни, имхо, применимо в ограниченных сценариях, типа массовой обработки строк во времянках.
29 янв 13, 20:07    [13847140]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Гавриленко Сергей Алексеевич
В реальной жизни

Для реальной жизни можно просто за правило взять varchar(AvgLen*2)
где AvgLen - предпологаемая серденяя длина хранимых строк в столбце.

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

avg(len(VarCharColumn)) * 2
среднее может быть более чем в два раза меньше максимального .

Естествено учесть другие условия, это вроде как отправная точка :)
29 янв 13, 20:26    [13847221]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владимир Затуливетер
Гавриленко Сергей Алексеевич
В реальной жизни

Для реальной жизни можно просто за правило взять varchar(AvgLen*2)
где AvgLen - предпологаемая серденяя длина хранимых строк в столбце.

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

avg(len(VarCharColumn)) * 2
среднее может быть более чем в два раза меньше максимального .

Естествено учесть другие условия, это вроде как отправная точка :)
Я прям сплю и вижу, как я при проектировании для каждого строкового поля буду угадывать среднюю длину.

И потом, я не зря сделал акцент на времянки. Если данные надо вычитывать с диска, вы этого прироста не заметите.
29 янв 13, 20:29    [13847232]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Гавриленко Сергей Алексеевич
Я прям сплю и вижу, как я при проектировании для каждого строкового поля буду угадывать среднюю длину.

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

Гавриленко Сергей Алексеевич
И потом, я не зря сделал акцент на времянки. Если данные надо вычитывать с диска, вы этого прироста не заметите.

У нас в проекте куча подобных запросов (как в посте блога) с сортировкой и без времянок.
А времянки да, там тоже поможет.

Да на одном запросе я разницы не замечу, но таких запросов у меня выполняется куча.
К примеру я в место varchar(50) объявил varchar(4000) так, на будущее, с запасом. Тогда сиквелу для каждого запроса придется выделять больше памяти, но это не основная проблема.
А что если на оборот, я объявлю varchar(500) и у меня большая часть данных по размеру будут приближаться к 500 символов? тогда на каждом запросе с сортировкой по этому полю сиквел будет гадить в tempdb, хотя мог бы все это проделать в памяти? Меня такая перспектива не очень воодушевляет.
29 янв 13, 21:46    [13847491]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владимир Затуливетер
Дело ваше, а мы выжимаем по полной ;)
Т.е. минимум раз в неделю вы проверяете среднюю длину данных в каждом строковом поле и, если нужно, меняете размерность поля? Похвально.
Владимир Затуливетер
тогда на каждом запросе с сортировкой по этому полю сиквел будет гадить в tempdb, хотя мог бы все это проделать в памяти?
Что и, главное, зачем надо гадить в tempdb? O_o
30 янв 13, 01:09    [13848191]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Владимир Затуливетер
У нас в проекте куча подобных запросов (как в посте блога) с сортировкой и без времянок.
Тут есть вот какой ньюанс. Чем больше выбирается несортированных данных, тем больше поможет не увеличение размерности поля для лучшего выделения памяти, а тупое создание индекса по полю сортировки (особенно, если там топы всякие).

Завтра я погоняю примеры из блога по ссылке с индексом и позырим, что к чему.
30 янв 13, 01:35    [13848256]     Ответить | Цитировать Сообщить модератору
 Re: char vs varchar vs varchar(8000) vas varchar(max)  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Гавриленко Сергей Алексеевич
Т.е. минимум раз в неделю вы проверяете среднюю длину данных в каждом строковом поле и, если нужно, меняете размерность поля? Похвально.

Сами придумали, приписали мне и посмеялись :)
Делаем это на этапе разработки - предпологаемые данные в столбце (чем больше информации тем лучше).

Гавриленко Сергей Алексеевич
Что и, главное, зачем надо гадить в tempdb? O_o

Я имел в виду сортировку в tempdb а не в памяти.

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

Давайте позырим :)

Гавриленко Сергей Алексеевич
а тупое создание индекса по полю сортировки (особенно, если там топы всякие)

Такой же тупой оверхед по поддержке индекса (таблицы большие).
30 янв 13, 13:55    [13850554]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить