powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про varchar(n)
25 сообщений из 173, страница 2 из 7
Опять про varchar(n)
    #38718566
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S.G.что за числа такие, по 100 цифр?Факторизацией, наверное, занимаются :-)
Только вопрос: причём тут СУБД.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718610
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterрасстояние до Марса в миллиметрах.
На него хватит 18-ти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718631
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Да и 15 хватит с запасом
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718662
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВот тут есть кой-какие бенчмарки
поскольку там разницы практически нет, мне это напомнило заявление сотрудника российского Оракла на Корпоративных Базах Данных лет 10 назад:
- теперь заливка данных происходит в 10 раз быстрее!

на что я из зала прокомментировал - "значит, до этого момента с заливкой данных было все совсем хреново". Народ поржал.

Из теста по ссылке я делаю примерно аналогичный вывод - раз практически нет разницы между char, varchar и text, при разной фактической длине, то значит, реализация одинаково гове..ая. Ну или тест такой.
Имеет смысл сравнить тот же тест с ФБ.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718668
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залил 10 записей в табличку с полем типа text(varchar без N). По 100 миллионов символов на запись.
При create index была выдана ошибка:
SQL Error: ОШИБКА: строка индекса требует байт: 1144712, при максимуме: 8191
Почему он поломался - я не знаю. Ведь можно было построить индекс по первым N символам (пусть даже по 8191, но я бы лучше задавал это N в create index), а остальные символы добывать из записи при непосредственном сравнении. Никто не хочет делать по-взрослому :) Или просто не придумали ещё... :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718670
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee при максимуме: 8191
а я предупреждал. значит, "безразмерная строка" до сих пор не может превышать размер страницы.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718671
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по крайней мере для индекса.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718673
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDee при максимуме: 8191
а я предупреждал. значит, "безразмерная строка" до сих пор не может превышать размер страницы.
это в индексе. У нас тоже самое.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718674
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

да, облом. причем, у нас ограничение на размер ключа в 1/4 страницы.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718675
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDee при максимуме: 8191
а я предупреждал. значит, "безразмерная строка" до сих пор не может превышать размер страницы.
Я ж туда 100М текста залил в поле.
А если бы заливал туда строки по 100 символов длиной, то и данные бы хранились по-другому и индекс бы создался.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718683
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

гораздо интереснее что будет если ты сначала создашь индекс, а потом попробуешь залить 100М текста
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718700
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDee,

гораздо интереснее что будет если ты сначала создашь индекс, а потом попробуешь залить 100М текста
Фигня получится. Больше 8К не зальёшь.
Я ж говорю, что нужно использовать в ключе индекса только первые N символов, и нет проблем.

А что будет в FB? В FB индекс для varchar(2048) создаётся, а для varchar(4096) уже нет. При пустой таблице.
Если бы даже сейчас сделать в FB возможность создания индексов для полей varchar(32000) и чтобы не получался гигантский расход памяти и просадка по производительности, то будет всем профит. Можно будет спокойно для полей с неизвестным количеством символов ставить 32000.
Т.е. я предлагаю чтобы N в varchar(N) не влияла на производительность и расход памяти, и не влияла на возможность создания индекса. А чтобы стала лишь ограничителем длины.
А то сейчас получается что пользователь указывая N ещё и настраивает производительность, и управляет расходом памяти, причём по неизвестным ему формулам :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718712
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЕсли бы даже сейчас сделать в FB возможность создания индексов для полей
varchar(32000) и чтобы не получался гигантский расход памяти и просадка по
производительности, то будет всем профит.
"И почему люди не летают как птицы?.." (с) Островский.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718715
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЯ ж говорю, что нужно использовать в ключе индекса только первые N символов, и нет проблем.

и выдаст твой индекс фигню. Особенно здорово будет попытаться сделать такой индекс уникальным.

NickDeeА что будет в FB? В FB индекс для varchar(2048) создаётся, а для varchar(4096) уже нет. При пустой таблице.

по крайней мере FB не врёт что для некого безразмерного типа вы получаете только преимущества. В доке честно сказано про максимальный размер ключа индекса.

З.Ы. А то глядишь на поверку окажется, что эффективность супер типа text не такая уж хорошая.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718744
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

в ДИАМС (mumps) "индексировалось" только первые 63 символа. И это было хорошо. С другой стороны, при помещении документов в большой varchar всегда можно выделить какие-то реквизиты документа, которые представляют интерес для поиска, и которые всегда меньше 63 символов.
Я считаю, что индексирование строковых столбцов длиной более 50 символов вообще не имеет смысла. Даже если индексировать 63 символа, глубина такого индекса превышает 3 уже на ощутимых объемах записей, и в результате профит от такого индекса получается только при поиске на равенство. Чего при 63 символах практически не бывает.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718749
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kdv!
You wrote on 12 августа 2014 г. 19:45:29:

Kdv> Я считаю, что индексирование строковых столбцов длиной более 50 символов
> вообще не имеет смысла. Даже если индексировать 63 символа, глубина
> такого индекса превышает 3 уже на ощутимых объемах записей, и в
> результате профит от такого индекса получается только при поиске на
> равенство. Чего при 63 символах практически не бывает.
иногда бывает нужно, при построении UNIQUE CONSTRAINT
для "нечеловеческих" данных.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718751
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDeeЯ ж говорю, что нужно использовать в ключе индекса только первые N символов, и нет проблем.

и выдаст твой индекс фигню. Особенно здорово будет попытаться сделать такой индекс уникальным.

Индекс выдаст всё нормально, просто если он будет не по полной строке, то для таких длинных занчений придётся лезть в данные за окончательным вердиктом (> или < или =).
Уникальность - это про "=".
Симонов ДенисNickDeeА что будет в FB? В FB индекс для varchar(2048) создаётся, а для varchar(4096) уже нет. При пустой таблице.

по крайней мере FB не врёт что для некого безразмерного типа вы получаете только преимущества.Вопрос не в том, врёт или нет. Вопрос в том, что даже если в varchar(32000) лежит 10 символов, то ресурсы от компа часто требуются как на 32000 символа. Т.е. varchar(32000) в большинстве случаев кушает ресурсы примерно так же, как char(32000), независимо от длины строки в данных, т.е. кушает почти всегда по максимуму (на 32000).
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718755
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВопрос в том, что даже если в varchar(32000) лежит 10 символов, то ресурсы от компа часто требуются как на 32000 символа.Это вы прямо сейчас придумали?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718756
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee Т.е. varchar(32000) в большинстве случаев кушает ресурсы примерно так же, как char(32000), независимо от длины строки в данных
в смысле?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718759
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvв смысле?при сортировках паддинг данных будет до декларированной длины поля, а не до "самой длинной непустой строки".
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718761
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидпри сортировках паддинг данных будет до декларированной длины поля, а не до "самой длинной непустой строки".Это вопрос реализации , которая является внутренним делом SQL-сервера.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718782
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидпри сортировках паддинг данных будет до декларированной длины поля
я в курсе, вопрос в том, как это обходит постгрес. Вначале вычисляет макс строку, а только потом сортирует?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718791
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDee Т.е. varchar(32000) в большинстве случаев кушает ресурсы примерно так же, как char(32000), независимо от длины строки в данных
в смысле?
Размеры буферов, их обнуление и заполнение данными.

БД с page_size 16k.
Есть табличка:
Код: sql
1.
create table T1 (Id Integer, S varchar(N))

, без индексов.
В ней миллион записей. В каждой записи поле S = 'A';
Какой размер БД?
при N = 1 он равен 58mb.
при N = 32000 он равен 583mb.
Т.е. одни и те же данные хранятся в БД с разной степенью эффективности. Разница в 10 раз. Т.е. на такую БД нужно в 10 раз больше оперативки чтобы свопа не было. При одних и тех же данных.

Код: sql
1.
select * from T1 order by S

execute and fetch all:
Для N = 1:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Время подготовки запроса = 15ms
Время выполнения запроса = 5s 86ms
Среднее время на получение одной записи = 0,01 ms
Current memory = 9 042 996
Max memory = 59 338 876
Memory buffers = 2 048
Reads from disk to cache = 13 344
Writes from cache to disk = 0
Fetches from cache = 2 026 685

Для N = 32000:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
sort error.
No free space found in temporary directories.
operating system directive WriteFile failed.
Недостаточно места на диске. .

------ Информация о производительности ------
Время подготовки запроса = 31ms
Время выполнения запроса = 36s 910ms
Current memory = 34 362 880
Max memory = 102 555 736
Memory buffers = 2 048
Reads from disk to cache = 3 601
Writes from cache to disk = 0
Fetches from cache = 216 103

6 гигабайт не хватило на сортировку при N=32000. Хорошо что винт SSD, а то бы это получилось не 36 секунд, а минут 5.
При N=2048 на сортировку ушло 4 GB временных файлов, но фетч не прошёл, т.к. IBExpert-у не хватило памяти (он тоже зачем-то отжирает по максимуму памяти, на все N символов, не знаю уж зачем)

Короче вот :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718798
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeselect * from T1 order by S
я на курсах это объясняю, популярно. Вообще серебряной пули нет (как и полного счастья в жизни).
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718800
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТаблоидпри сортировках паддинг данных будет до декларированной длины поля
я в курсе, вопрос в том, как это обходит постгрес. Вначале вычисляет макс строку, а только потом сортирует?
А зачем вычислять макс строку? И зачем нужен паддинг? Я просто представляю себе - мне нужно взять из файла строки и посортировать... зачем мне делать их паддинг? Или при записи отсортированных строк в другой текстовый файл...
Я максимум готов записать длину строки и её бинарное представление. Паддить её перед записью не готов. То же и с чтением: читать, а потом избавляться от паддинга, который был сделан предыдущим записывающим... уж лучше договориться с записывающим чтобы не паддил :)
...
Рейтинг: 0 / 0
25 сообщений из 173, страница 2 из 7
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про varchar(n)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]