powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про varchar(n)
173 сообщений из 173, показаны все 7 страниц
Опять про varchar(n)
    #38718228
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PostgreSQL есть тип varchar без указания длины. По производительности он быстрей чем char(n) и равен varchar(n):
http://stackoverflow.com/questions/7320316/why-specify-a-length-for-character-varying-types

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

опять лень думать какую длину указывать?

В FB такой тип есть и называется он BLOB. Производительность при работе с BLOB это уже второй вопрос. Сетевой протокол в FB 3 подкрутят (уж не знаю будут ли блобы быстрее передаваться). А вот с конкатенацией уже сложнее.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718245
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять хочется чтобы было по-человечески.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718251
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nickdee!
You wrote on 12 августа 2014 г. 14:36:53:

Nickdee> Опять хочется чтобы было по-человечески.
понятия человечности "здесь тут" и в "там у ***" очень разные.
Модератор: Предупреждаю о вреде мата. Тем более в связи с опускающимся железным занавесом.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718253
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeхочется чтобы было по-человечески.
Звучит как "без необходимости применять мозг".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718264
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПроизводительность при работе с BLOB это уже второй вопрос.Это делает его использование неприемлимым. Плюс отсутствие индексов по ним.

А вот как хочется:
http://www.postgresql.org/docs/9.3/static/datatype-character.html The storage requirement for a short string (up to 126 bytes) is 1 byte plus the actual string, which
includes the space padding in the case of character. Longer strings have 4 bytes of overhead instead
of 1. Long strings are compressed by the system automatically, so the physical requirement on disk
might be less. Very long values are also stored in background tables so that they do not interfere with
rapid access to shorter column values. In any case, the longest possible character string that can be
stored is about 1 GB. (The maximum value that will be allowed for n in the data type declaration
is less than that. It wouldn’t be useful to change this because with multibyte character encodings
the number of characters and bytes can be quite different. If you desire to store long strings with no
specific upper limit, use text or character varying without a length specifier, rather than making
up an arbitrary length limit.)

Tip: There is no performance difference among these three types, apart from increased storage
space when using the blank-padded type, and a few extra CPU cycles to check the length when
storing into a length-constrained column.
While character(n) has performance advantages in
some other database systems, there is no such advantage in PostgreSQL; in fact character(n)
is usually the slowest of the three because of its additional storage costs. In most situations text
or character varying should be used instead
.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718313
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeTip: There is no performance difference among these three types, apart from increased storage
space when using the blank-padded type, and a few extra CPU cycles to check the length when
storing into a length-constrained column.
Создай две таблицы:
Код: plaintext
1.
2.
create table t1( s varchar(12) );
create table t2( s varchar(126) );
commit;
- и натолкай в них побольше строковых данных с макс. длиной = 12 символов.
Далее сделай какой-нить запрос с сортировкой и натрави его сначала на t1, затем на t2 (по-нескольку раз).
Будет ли разница в произв-сти ?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718314
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeThere is no performance difference among these three types, apart from
increased storage space when using the blank-padded type, and a few extra CPU cycles to
check the length when storing into a length-constrained column.
Маркетинговое враньё. Читать данные, уложенные на отдельных страницах по определению не
может быть так же быстро.

И, кстати, ты уже пробовал построить по нему индекс?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718333
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeхочется чтобы было по-человечески.
Звучит как "без необходимости применять мозг".

Ну допустим для ФИО я знаю что оно в 99.9999% случаев в 100 символов войдёт, GUID стопроцентно войдёт в 32.
А вот во сколько символов уложится число произвольной длины уже не знаю (я понимаю, что хранить числа эффективней в бинарном виде). Возможно хватит varchar(1000), а возможно и varchar(32000) не хватит. Но в 99.9% случаев там будут лежать числа от 1 до 100 цифр. Пользователю предложим смириться с просадкой производительности у FB при работе с длинными варчарами? Или если у него вдруг иногда будут числа под сто тыщ цифр, то предложим ему BLOB? Но тогда он бонусом получит ещё просадку, в том числе и для коротких значений. Или просто предложим ему не хранить в БД длинные числа, чтобы производительность не страдала? :)
Имхо должно быть так, чтобы на одних и тех же данных движок вёл себя одинаково, независимо от того какой там N у варчара прописан, и прописан ли.
Это будет архитектурно-правильная позиция.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718343
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

на кой тебе такие числа? Ты реально оперируешь с числами длинной 1000 цифр?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718345
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПользователю предложим смириться с просадкой производительности у FB при работе с длинными варчарами?В ссылке, которую вы привели разница накладных расходов между "длинными" и "короткими" varchar - три байта.
Есть пример, который демонстрирует значимость этой разницы? Окромя "если три байта умножить на миллиард - будет три гигабайта"?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718349
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

и самое интересное как с такими числами ты будешь производить различные операции (сложение, вычитание, умножение ...). Через ХП? Не боишься просадки производительности?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718375
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВ PostgreSQL есть тип varchar без указания длины. По производительности он быстрей чем char(n) и равен varchar(n):
ты только забыл, что раньше его длина все же была ограничена размером страницы, который у PG был (?) фиксированный, 8к.
Вроде бы в свежих версиях уже это обошли, вопрос в том, как.
В доке по постгресу эта фигня не упоминалась, люди просто напарывались на макс длину "безразмерных строк" в 8к.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718379
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovМаркетинговое враньё. Читать данные, уложенные на отдельных страницах по определению не может быть так же быстро.
кстати, да, к сожалению, дока по PG этим страдает (см выше, и вроде есть другие штуки, которые тупо умалчиваются).
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718408
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvDimitry SibiryakovМаркетинговое враньё. Читать данные, уложенные на отдельных страницах по определению не может быть так же быстро.
кстати, да, к сожалению, дока по PG этим страдает (см выше, и вроде есть другие штуки, которые тупо умалчиваются).
In any case, the longest possible character string that can be stored is about 1 GB.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718433
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeIn any case, the longest possible character string that can be stored is
about 1 GB.
Так ты смог проиндексировать эту гигабайтную строку или нет?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718434
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeесли у него вдруг иногда будут числа под сто тыщ цифр, то предложим ему BLOB? updatable view уже вышли из моды ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
recreate view v_any_nums as select 1 x from rdb$database;
commit;
recreate table t_any_nums(id int primary key,  n varchar(20), b blob);
commit;
recreate view v_any_nums as
select id, cast( coalesce(n, b) as varchar(32760)) as x
from t_any_nums;
commit;
recreate sequence g_any_nums;
commit;

set term ^;
create or alter trigger v_any_nums_biu for v_any_nums  active
before insert or update as
begin
  if (inserting) then new.id = coalesce( new.id, gen_id(g_any_nums,1));
  if ( char_length(new.x) > 20 ) then
    update or insert into t_any_nums(id, n, b)
    values( new.id, null, new.x)
    matching(id);
  else
    update or insert into t_any_nums(id, n, b)
    values( new.id , new.x, null)
    matching(id);

end
^
set term ;^
commit;


insert into v_any_nums(x) values('1234567');
insert into v_any_nums(x) values('-1234567890123456789');
insert into v_any_nums(x) values('12345670123456789012345678906546574678565221365455477');
commit;
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718437
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql.ru рекоммендует text вместо varchar(n).
Короче потестировать нужно. Хотя постгревцы наверняка за 10 лет уже протестировали это. Хотя с другой стороны не факт, может они документации на слово верят, и втихую используют text не зная что он "на самом деле дико медленный, в чём неоднократно убеждались парни из FB-тусовки на примере использования движка FB" :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718458
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

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

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

а ты зачем сделал вид, что ничего не увидел ?
Я увидел :)
Но я с postgreSQL только вчера начал, причём с документации.
Сегодня-завтра может руки дойдут до ознакомления с тулзами и генерации тестовых данных с их помощью. А может и не дойдут так быстро.
Вот тут есть кой-какие бенчмарки: http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/ .
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718497
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nickdee!
You wrote on 12 августа 2014 г. 16:19:30:

Nickdee> Но я с postgreSQL только вчера начал, причём с документации.
> Сегодня-завтра может руки дойдут до ознакомления с тулзами и генерации
> тестовых данных с их помощью. А может и не дойдут так быстро.
с нетерпением ждём очередных "открытий чЮдных" и фичереквестов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718527
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийHello, Nickdee!
You wrote on 12 августа 2014 г. 16:19:30:

с нетерпением ждём очередных "открытий чЮдных" и фичереквестов.


только не это. Как по мне PG свалка всяких фич. Много полезных, но часть (их довольно много) на фиг некому не сдалось, кроме разве что экспериментаторов.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718532
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeDimitry Sibiryakovпропущено...

Звучит как "без необходимости применять мозг".

Ну допустим для ФИО я знаю что оно в 99.9999% случаев в 100 символов войдёт, GUID стопроцентно войдёт в 32.
А вот во сколько символов уложится число произвольной длины уже не знаю (я понимаю, что хранить числа эффективней в бинарном виде). Возможно хватит varchar(1000), а возможно и varchar(32000) не хватит. Но в 99.9% случаев там будут лежать числа от 1 до 100 цифр.что за числа такие, по 100 цифр?

Вообще-то любая типизация данных (а задать макс. длину стринга - это тоже типизация), это в некотором роде ограничитель ошибок входных данных. Если данные - целое число, то пользователь никак не сможет ввести в БД символы. Если данные - ФИО, то попытка введения более 100 символов, очевидно будет ошибкой.
Если надо ввести *большие* числа, то разработчику надо обязательно узнать, что это за числа, и их максимальный размер. Потому что, вообще говоря, некоторые большие числа нельзя записать не то что в базу данных, но и на существующие носители.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718536
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S.G.что за числа такие, по 100 цифр?расстояние до Марса в миллиметрах.
...
Рейтинг: 0 / 0
Опять про 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
Опять про varchar(n)
    #38718805
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЯ просто представляю себе - мне нужно взять из файла строки и
посортировать... зачем мне делать их паддинг?
А ты возьми да напиши программу для их сортировки. Без паддинга. И посмотри насколько она
будет медленнее работать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718807
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeпри N = 1 он равен 58mb.
при N = 32000 он равен 583mb.
Т.е. одни и те же данные хранятся в БД с разной степенью эффективности. Разница в 10
раз.
И тебя не восхищает, что разница в 10 раз, а не в 32000 раз?.. Ты вообще программист?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718814
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЯ просто представляю себе - мне нужно взять из файла строки и посортировать..
мнэ....
ну взял ты строки. произвольной длины. Как ты их будешь переставлять местами (сортировать)? Известно же, что или ты будешь сортировать указатели на них, или сами строки. Индекс - это и есть отсортированные указатели на строки переменной длины. А по PLAN SORT один вариант - сортировать строки фиксированной (максимально возможной длины).

я фигею, что объясняю как бы прописные алгоритмические истины :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718815
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee6 гигабайт не хватило на сортировку при N=32000. Хорошо что винт SSD, а то бы это получилось не 36 секунд, а минут 5.
При N=2048 на сортировку ушло 4 GB временных файлов, но фетч не прошёл, т.к. IBExpert-у не хватило памяти (он тоже зачем-то отжирает по максимуму памяти, на все N символов, не знаю уж зачем)

Вообще говоря сортировать по строке длинной 32000 символов глупо и здесь вряд ли что-нибудь поможет..

Другое дело что такая ошибка может возникнуть когда сортируется по другому поля, а резалтсет широкий. У ДЕ есть патчик который реализует сортировку иначе, когда сортируются только ключи и для каждого ключа запоминается RDB$DB_KEY, а потом вытаскивается остальной результат. Я пробовал (2.5) ту сборку в некоторых случаях производительность сортировки выросла, в некоторых упала. Если этот патч будет применён к тройке и оптимизатор будет достаточно умён, чтобы понять какой метод сортировки применять, то всё будет гораздо лучше.

kdvя в курсе, вопрос в том, как это обходит постгрес. Вначале вычисляет макс строку, а только потом сортирует?

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

к слову - иногда бывает полезно покодить нечто низкоуровневое, на тему страничного хранения данных. Мне повезло, я когда осваивал Паскаль, была популярной библиотека Borland Database Toolbox . Там было много всякой интересной фигни. А еще была либа BTreeFiler, и вроде там был модуль bigsort, который позволял сортировать наборы данных адских размеров.
Первое, что я сделал, разобравшись в коде - перехерачил индексы из тулбокса на индексы по строкам произвольной длины.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718821
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDeeЯ просто представляю себе - мне нужно взять из файла строки и посортировать..
мнэ....
ну взял ты строки. произвольной длины. Как ты их будешь переставлять местами (сортировать)? Известно же, что или ты будешь сортировать указатели на них, или сами строки. Индекс - это и есть отсортированные указатели на строки переменной длины. А по PLAN SORT один вариант - сортировать строки фиксированной (максимально возможной длины).

я фигею, что объясняю как бы прописные алгоритмические истины :-)
Я тоже фигею, т.к. сортировать я буду не строки, а создам указатели на строки, длина которых 4 байта или 8 байт, в зависимости от архитектуры, и буду оперировать ими. Переставлять местами записи я бы не додумался.
Так что думаю в коде всё-таки поинтеры местами меняются, как в прописных алгоритмических истинах :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718822
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeпри N = 1 он равен 58mb.
при N = 32000 он равен 583mb.
Т.е. одни и те же данные хранятся в БД с разной степенью эффективности. Разница в 10
раз.
И тебя не восхищает, что разница в 10 раз, а не в 32000 раз?.. Ты вообще программист?..

Меня восхищает что разница вообще есть. А тебя не восхищает что есть разница в 10 раз? Ты вообще программист?.. :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718831
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

сортировка в кортежей в памяти это одно. Совсем другое дело когда эти данные в память не умещаются. Если сортировать только ключи, то взамен огребаем рандомные чтения. Тут уже надо оценивать что дешевле.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718834
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeЯ просто представляю себе - мне нужно взять из файла строки и
посортировать... зачем мне делать их паддинг?
А ты возьми да напиши программу для их сортировки. Без паддинга. И посмотри насколько она
будет медленнее работать.

За счёт чего медленней? Что, скорость сравнения S1 > S2 зависит от паддинга? Не зависит.
Так для чего делать им паддинг?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718837
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТаблоидпри сортировках паддинг данных будет до декларированной длины поля
я в курсе, вопрос в том, как это обходит постгрес. Вначале вычисляет макс строку, а только потом сортирует?я так думкаю, что ничего он не вычисляет, а сразу лезет в DDL за декларированной длинной поля. Но лучше ДЕ никто не скажет :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718838
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDee,

сортировка в кортежей в памяти это одно. Совсем другое дело когда эти данные в память не умещаются. Например не умещаются из-за паддинга :)
Я вот думаю что если у меня есть набор данных из миллиона записей для сортировки, и часть из них не входит в память и сливается во временные файлы, то я уж точно буду сортировать поинтеры, а не менять местами записи этого набора данных в оперативке или на диске. И для этого мне паддинг точно не нужен.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718840
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениссортировка в кортежей в памяти это одно. Совсем другое дело когда эти данные в память не умещаются. Если сортировать только ключи, то взамен огребаем рандомные чтения. Тут уже надо оценивать что дешевле.Если данные не умещаются в памяти, то чтения (и записи) будут в любом случае.
Вроде как, при наличии свободного дискового пространства, самым быстрым будет многопутевое слияние со всякими "предсортировками" и балансировками. Дополнение "до максимума" увеличивает и требования к дисковому пространству и ввод-вывод и рабочий набор в памяти. Единственное, что, возможно, имеет смысл - секционирование данных по (байтовой) длине.

P.S. Предоставить рабочий код? Нет, не готов.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718841
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЗа счёт чего медленней? Что, скорость сравнения S1 > S2 зависит от паддинга?
Не зависит. Так для чего делать им паддинг?
Отсортируй десяток гигабайт - узнаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718845
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

ты игнорируешь то что я пишу

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

ну вот ты отсортировал ключи (поинтеры), которые перед этим необходимо было прочитать с диска. Это был шаг 1. А теперь шаг 2, для того чтобы отдать пользователю все запрошенные поля на диск надо слазить ещё раз. Вот здесь чтения будут рандомными.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718862
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeа создам указатели на строки, длина которых 4 байта или 8 байт, в зависимости от архитектуры, и буду оперировать ими. Переставлять местами записи я бы не додумался.
ну и плохо, что не додумался. вот это читал?
http://www.ibaseforum.ru/viewtopic.php?f=4&t=4175

У тебя два варианта
1) отсортировать результат за N секунд, выдать его клиенту.
2) построить индекс по X столбцам за M секунд, получить охрененный random io при выборке результата.

опять я излагаю алгоритмические факты? Типа, код при plan sort дураки делали?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718868
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718883
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как хорошо, что я нетрезв... а то бы поразгонял бы тут вас к чертовой матери :-) Жгите дальше, народ просит...
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718886
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

я вот с завтра буду нетрезв :-) и в силу различия в часовых поясах, прокомментировать смогу только послезавтра :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718896
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvв силу различия в часовых поясах
это в куда тебя занесло? :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718899
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeЗа счёт чего медленней? Что, скорость сравнения S1 > S2 зависит от паддинга?
Не зависит. Так для чего делать им паддинг?
Отсортируй десяток гигабайт - узнаешь.

Хм.
При
Код: sql
1.
select * from T1 order by id

получается вообще сортируются числа, но данные всё-равно паддятся и используются временные файлы. Засада прям :)

Так и не понял зачем паддить. Зафетчили первый блок записей (сколько их там в половину сортировочного кэша входит), создали к записям массив поинтеров, посортировали этот массив. Зафетчили второй блок записей, создали к записям массив поинтеров, посортировали этот массив. Далее создаём на диске файл и, используя информацию из двух массивов поинтеров, сливаем записи из двух блоков в один, как при сортировке слиянием. Получаем на диске файл с отсортированными записями из двух первых отффетченных блоков.
Далее фетчим ещё два блока и проделываем с ними то же самое, т.е. создаём по ним файл с отсортированными записями.
В конце концов получится N файлов, каждый из которых будет содержать отсортированные внутри записи.
И без всякого паддинга.
Дальше попарно сливаем эти файлы, создавая новые (и удаляя при этом те, из которых данные уже были слиты).
В конце останется один большой файл.
Если сортировочный кэш равен 50 мегабайт, а записей на 200 мегабайт, то на первом этапе будет создано 4 файла по 50 мегабайт. Потом 2 по сто (с удалением предудущих четырёх). Потом эти два сольются в один. Хотя тут я не уверен, т.к. зачем нам сливать последние два, когда можно вместо создания последнего файла сразу отдавать записи движку. И даже скажу больше - не факт что будт эффективно даже из четырёх файлов делать два. Возможно проще отдавать записи движку выбирая нужную из 4-х источников, чтобы сэкономить на записи двух файлов по 100 МБ. Хотя возможно это зависит от скорости дисковой системы.
Места паддингу я так и не нашёл :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718902
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrэто в куда тебя занесло? :-)
еще не занесло. Завтра в Брюссель, в логово демократии :-)

NickDeeДалее фетчим ещё два блока и проделываем с ними то же самое, т.е. создаём по ним файл с отсортированными записями.
ну ты хоть бы исходники ФБ почитал...
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38718903
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvdimitrэто в куда тебя занесло? :-)
еще не занесло. Завтра в Брюссель, в логово демократии :-)

NickDeeДалее фетчим ещё два блока и проделываем с ними то же самое, т.е. создаём по ним файл с отсортированными записями.
ну ты хоть бы исходники ФБ почитал...
Мне проще достать подходящий алгоритм из коллективного бессознательного :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719049
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТак и не понял зачем паддить. Зафетчили ... создали....Самое время запилить свой собственный сервер. Без паддинга и с безразмерным варчаром.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719118
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S.G.Самое время запилить свой собственный сервер. Без паддинга и с безразмерным
варчаром.
Или прислать патч к уже существующему. Если бы такой топик поднял я, Влад уже давно бы
сказал "ну так сделай, а мы посмотрим"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719128
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ЕМНИП, ты ведь пытался что там с сортировкой сделать. Как результаты?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719174
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЕМНИП, ты ведь пытался что там с сортировкой сделать.
Нет, никогда я ничего такого не пытался, просто как-то предлагал простой хак для
использования имеющихся процедур сортировки для HASH GROUP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719180
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гоните его нахер.
это мудозвон пустопорожний.
ибо сказано в писании: "один дурак может задать столько вопросов,
что и 100 мудрецов не ответят"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719245
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
вот здесь это было. Там про уменьшение размеров сортировочных файлов разговор шёл.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38719380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисвот здесь это было.
Экий ты археолог... В плане "сделать" я там никакой активности не проявлял, только
"занести хотелку в трекер". Потом хотелка отсохла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723703
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А всё-таки. Вот есть у нас таблица T(ID integer, S1 varchar(32000), S2 varchar(32000)).
Есть в ней одна запись: insert into T(ID, S1, S2) values(1, 'S1', 'S2').
Вопросы:
1. В чём профит от того, что в БД на эту запись лежат примерно 64000 байт, упакованных RLE?
Почему бы не записать всего пару десятков байт, закоденых RLE?
2. В чём профит от того, что при доставании записи из БД нужно будет выделить примерно 64000 байт, потом распаковать в них RLE-блок?
Почему бы не выделить пару десятков байт и не распаковать туда столько, сколько там реально данных?

Зачем сначала запаковывать, а потом распаковывать пустоту? Ведь при этом перерасходуется память (т.е. в итоге в кэш входит меньше полезных данных) + перерасходуется место на диске (а это лишний ввод-вывод) + впустую тратятся ресурсы процессора на работу с тем, что никогда не будет использоваться.
В чём профит такого подхода? Или это нужно Джима спрашивать почему он так заархитектурил тридцать лет назад? :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723718
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee1. В чём профит от того, что в БД на эту запись лежат примерно 64000 байт,
упакованных RLE?
Почему бы не записать всего пару десятков байт, закоденых RLE?
С какого перепугу ты решил, что в БД лежит 64000 байт? Подикося, слышал об RLE только
название...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723722
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeА всё-таки. Вот есть у нас таблица T(ID integer, S1 varchar(32000), S2 varchar(32000)).
Есть в ней одна запись: insert into T(ID, S1, S2) values(1, 'S1', 'S2').
Вопросы:
1. В чём профит от того, что в БД на эту запись лежат примерно 64000 байт, упакованных RLE?
Почему бы не записать всего пару десятков байт, закоденых RLE?
2. В чём профит от того, что при доставании записи из БД нужно будет выделить примерно 64000 байт, потом распаковать в них RLE-блок?
Почему бы не выделить пару десятков байт и не распаковать туда столько, сколько там реально данных?
1. Потому что запись пакуется целиком, а не по отдельным полям. Одно "длинное" сжатие тупо быстрее десятка "коротких".
2. Чтобы не переаллокировать буфер каждый раз когда последующая запись окажется длиннее.

NickDeeВедь при этом перерасходуется память (т.е. в итоге в кэш входит меньше полезных данных) + перерасходуется место на диске (а это лишний ввод-вывод)
кеш тут вообще не причем, в нем лежат страницы со сжатыми данными. А для экономии места можно сжимать чуть хитрее.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723750
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrА для экономии места можно сжимать чуть хитрее.
ты про это CORE-4401 говоришь?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723758
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

так точно
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723811
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr1. Потому что запись пакуется целиком, а не по отдельным полям. Одно "длинное" сжатие тупо быстрее десятка "коротких".

Запись пакуется целиком и так и так, она же в памяти непрерывно лежит. Просто я предлагаю не хранить хвостовые пробелы варчаров.
dimitr2. Чтобы не переаллокировать буфер каждый раз когда последующая запись окажется длиннее.Вот тесты переаллокации:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
max alloc size: 128
1000000 reallocs: 13 ms
1000000 reallocs: 9 ms
1000000 reallocs: 8 ms
1000000 reallocs: 9 ms
1000000 reallocs: 8 ms
max alloc size: 256
1000000 reallocs: 25 ms
1000000 reallocs: 24 ms
1000000 reallocs: 24 ms
1000000 reallocs: 24 ms
1000000 reallocs: 23 ms
max alloc size: 512
1000000 reallocs: 33 ms
1000000 reallocs: 32 ms
1000000 reallocs: 32 ms
1000000 reallocs: 32 ms
1000000 reallocs: 33 ms
max alloc size: 1024
1000000 reallocs: 44 ms
1000000 reallocs: 43 ms
1000000 reallocs: 42 ms
1000000 reallocs: 42 ms
1000000 reallocs: 45 ms
max alloc size: 2048
1000000 reallocs: 67 ms
1000000 reallocs: 68 ms
1000000 reallocs: 66 ms
1000000 reallocs: 65 ms
1000000 reallocs: 66 ms
max alloc size: 4096
1000000 reallocs: 118 ms
1000000 reallocs: 119 ms
1000000 reallocs: 117 ms
1000000 reallocs: 118 ms
1000000 reallocs: 116 ms
max alloc size: 8192
1000000 reallocs: 253 ms
1000000 reallocs: 253 ms
1000000 reallocs: 255 ms
1000000 reallocs: 252 ms
1000000 reallocs: 252 ms
max alloc size: 16384
1000000 reallocs: 472 ms
1000000 reallocs: 470 ms
1000000 reallocs: 474 ms
1000000 reallocs: 469 ms
1000000 reallocs: 472 ms
max alloc size: 32768
1000000 reallocs: 845 ms
1000000 reallocs: 845 ms
1000000 reallocs: 845 ms
1000000 reallocs: 851 ms
1000000 reallocs: 845 ms
max alloc size: 65536
1000000 reallocs: 1578 ms
1000000 reallocs: 1570 ms
1000000 reallocs: 1572 ms
1000000 reallocs: 1567 ms
1000000 reallocs: 1572 ms
max alloc size: 131072
1000000 reallocs: 2976 ms
1000000 reallocs: 2968 ms
1000000 reallocs: 2958 ms
1000000 reallocs: 2961 ms
1000000 reallocs: 2960 ms


Вот код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
program Project4;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Diagnostics;

var
  // будем переаллоцировать этот буфер из 1000 записей N раз (при N = 1000 получается 1 миллион переаллокаций),
  // с увеличивающимися MaxAllocSize(начиная с MaxAllocSize = 128 байт)
  Recs: array[0..1000-1] of Pointer; //

procedure ReallocRecs(MaxAllocSize: Integer);
var
  I: Integer;
begin
  for I := 0 to High(Recs) do
  begin
    Recs[I] := ReallocMemory(Recs[I], 20 + Random(MaxAllocSize-20));
  end;
end;

procedure ReallocNTimes(N: Integer; MaxAllocSize: Integer);
var
  I: Integer;
begin
  for I := 1 to N do
    ReallocRecs(MaxAllocSize);
end;

var
  I: Integer;
  SW: TStopWatch;
  N: Integer;
  MaxAllocSize: Integer;
begin
  Randomize;
  MaxAllocSize := 128;
  // first fill
  for I := 0 to High(Recs) do
    Recs[I] := GetMemory(20 + Random(MaxAllocSize-20));

  N := 1000;
  while True do
  begin
    Writeln(Format('max alloc size: %d', [MaxAllocSize]));
    for I := 1 to 5 do
    begin
      SW := TStopWatch.StartNew;
      ReallocNTimes(N, MaxAllocSize);
      Writeln(Format('%d reallocs: %d ms', [Length(Recs) * N, SW.ElapsedMilliseconds]));
    end;
    MaxAllocSize := MaxAllocSize * 2;
    if MaxAllocSize > 128 * 1024 then
      Break;
  end;
  Readln;
end.


Возможно в плюсах будет лучше.
dimitrNickDeeВедь при этом перерасходуется память (т.е. в итоге в кэш входит меньше полезных данных) + перерасходуется место на диске (а это лишний ввод-вывод)
кеш тут вообще не причем, в нем лежат страницы со сжатыми данными. А для экономии места можно сжимать чуть хитрее.
Или держать в памяти без хвостовых пробелов и не сжимать лишнего :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723863
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВот тесты переаллокации
это сферический конь в вакууме. Реально будет потери времени выполнения процентов 10-20. Ты уверен, что их сэкономишь за счет сжатия "без хвостов"?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723881
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrNickDeeВот тесты переаллокации
это сферический конь в вакууме. Реально будет потери времени выполнения процентов 10-20. Ты уверен, что их сэкономишь за счет сжатия "без хвостов"?
Не только сжатия, но и копирования. Одно дело копировать миллион блоков по 1000 байт, и совсем другое - миллион по 100.
Выделить миллион по 100 - это примерно 10 ms. Скопировать 100M - это в несколько раз быстрей чем скопировать 1000M. И даже +10 ms к "скопировать 100M" не будут существенны.
Возможно что выделить миллион по 900 + скопировать их будет уже где-то равным по скорости копированию миллиона по 1000.
Ещё нужно учесть что realloc нужно будет делать только если запись больше чем размер блока под неё.
Т.е. при фетче миллиона записей при максимальном размере записи N (что определяется в метаданных) в memory-buffer вмещающий лишь одну запись, мы получим много меньше чем N реаллоков (т.е. совсем даже не миллион).
Итого, нужно реаллоцировать только увеличивая размер буфера под одну запись (не уменьшая если следующая запись меньше), и копировать туда-оттуда только реально используемые байты, без хвоста. И имхо будет профит :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723894
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

твои умозаключения основываются на какой-то абстрактной фигне. Исходники FB открыты возьми да и проведи эксперимент. Если удастся получить приличный выигрыш тогда можно что-о смело утверждать.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723903
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeнужно реаллоцировать только увеличивая размер буфера под одну запись (не уменьшая если следующая запись меньше), и копировать туда-оттуда только реально используемые байты, без хвоста
тебе осталось додумать, как обращаться к полям, расположенным после урезанного варчара. Сейчас у них фиксированное смещение относительно начала записи. Станет плавающее. Менять еще и дескрипторы формата каждый раз когда читаем запись и когда меняем ее апдейтом в NEW-контексте? Уверен, что еще куча интересных вопросов вылезет, если копнуть поглубже.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723920
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrNickDeeнужно реаллоцировать только увеличивая размер буфера под одну запись (не уменьшая если следующая запись меньше), и копировать туда-оттуда только реально используемые байты, без хвоста
тебе осталось додумать, как обращаться к полям, расположенным после урезанного варчара. Сейчас у них фиксированное смещение относительно начала записи.
Фиксированное смещение... Ну а по этому фиксированному смещению что расположено? Прям весь варчар? Если да, то предлагаю вместо этого разместить там четыре байта: первые два байта - длина варчара, вторые два - поинтер на его данные.
Так обращение будет быстрым.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723921
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТак обращение будет быстрым. И эти четырёхбайтовые описатели будут идти один за другим, т.е. доступ к ним будет индексный.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38723925
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

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

запись у нас расположена непрервыно.
Например есть табличка: int1, int2, int3, varchar1(1000), varchar2(1000), varchar3(1000), int4, varchar4(1000)
Запись в несжатом виде будет иметь вид:
[Header], [int, int, int, int, int, int, int, int], [данные varchar1(5 байт), данные varchar2(10 байт), данные varchar3(20 байт), данные varchar4(3 байта)].
В первых трёх int второго блока лежат значения int1, int2 int3.
В четвёртом int второго блока будет лежать "длина varchar1" и смещение по которому лежат данные этого varchar1(например относительно начала второго блока).
В пятом int второго блока лежит такая же информация про varchar2.
В шестом int второго блока лежит такая же информация про varchar3.
В седьмом int второго блока лежит значение int4.
В восьмом int второго блока лежит такая информация про varchar4.
Все три блока непрерывны внутри и лежат последовательно друг за другом, без разрывов.
Таким образом у нас будет один буфер для сжатия и разжатия.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724043
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

и чем все это (включая переаллокации буфера записи) лучше, чем просто более эффективно сжимать хвосты? Не со степенью 64, а всегда в три-пять байт, например.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724558
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrNickDee,

и чем все это (включая переаллокации буфера записи) лучше, чем просто более эффективно сжимать хвосты? Не со степенью 64, а всегда в три-пять байт, например.
Эффективность сжатия влияет на размер данных в страничном кэше и в БД. А когда запись распаковывается для работы, например для сортировок, то там перерасход памяти: 16433678 .
Есть зависимость скорости создания индекса от объявленной длины поля, при одних и тех же данных (varchar(1) vs varchar(2048)): миллион записей, 1 секунда vs 18 секунд.
Засада везде :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724585
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

объясни две вещи:

1. На фига индекс по длинной предлинной строке
2. На фига сортировать по длинной предлинной строке

Другое дело что при сортировке сам резалтсет может получится широким даже при сортировки по небольшому ключу.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724598
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспри сортировке сам резалтсет может получится широким даже при сортировки по небольшому ключу.Ога. И dimitr пару лет взад давал возможность потестировать некую спецсборку, где сортируются только ключики, а с итоговыми кортежами идёт их соединение по rdb$db_key.
Кому было интересно - тот попробовал, и теперь периодически спамит dimitr'a просьбой втыкнуть это в ФБ-3.х :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724601
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

я тоже её пробовал. Но тогда она во многих случаях промахивалась и весьма сильно. Будем надеется ДЕ доведёт оценку стоимости до ума, чтобы оптимизатор выбирал лучший алгоритм сорировки.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724659
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЭффективность сжатия влияет на размер данных в страничном кэше и в БД.
и она примерно одинакова в обоих случаях

NickDeeА когда запись распаковывается для работы, например для сортировок, то там перерасход памяти
это вопрос к сортировщику, обсуждалось уже
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724666
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денися тоже её пробовал. Но тогда она во многих случаях промахивалась и весьма сильно.
что значит "промахивалась"? Она в той сборке безусловно работала, насколько я помню.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38724716
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

я имел ввиду, что такой способ сортировки не всегда выигрывает у сортировки всего кортежа. Для некоторых случаев результат оказывался хуже по времени. По всей видимости оценки стоимости для выбора когда и какой алгоритм применять в той сборке не было.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725044
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. На фига индекс по длинной предлинной строке
Миллион коротких строк, и одна длинная.
Симонов Денис2. На фига сортировать по длинной предлинной строке
Я не сортирую по длинной. Я сортирую миллион строк по 20-30 символов, и только одна строка там 2000. Не возникает вопроса, нафига движок выделяет по 2000 на все строки? Это между прочим 2GB памяти вместо 30MB. Я, глядя на эти цифры, отнёс бы это к категории "фатальный недостаток" :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725072
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeНе возникает вопроса, нафига движок выделяет по 2000 на все строки?
я ведь тебе уже объяснял. ты не читаешь, или не врубаешься алгоритмически?
16433843 и 16434091
хотя бы второе прочитай. фиксированная сортировка это PLAN SORT. Сортировка "по указателям" - PLAN ORDER. У обоих свои недостатки, противоположные на разных объемах данных и на разной "уникальности" результата.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725081
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDeeНе возникает вопроса, нафига движок выделяет по 2000 на все строки?
я ведь тебе уже объяснял. ты не читаешь, или не врубаешься алгоритмически?
16433843 и 16434091
хотя бы второе прочитай.я ведь уже объяснял это. ты не читаешь, или не врубаешься алгоритмически?
16434256
хотя бы почитай, уже :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725123
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee 16434256
хотя бы почитай, уже :)
читал. в ФБ сортировка и идет блочно, только не строятся пойнтеры, а сразу сортируются блоки. Так что, если я правильно понял твою идею, по реализации она проиграет тому, что есть сейчас.
И, сортировка слиянием тоже используется в ФБ, это когда в плане написано PLAN MERGE (SORT...

http://www.ibase.ru/devinfo/dataaccesspaths.htm#chapter22
Алгоритм сортировки представляет собой многоуровневую быструю сортировку (quick sort). Набор входных записей помещается во внутренний буфер, после чего он сортируется и блок перемещается во внешнюю память. Далее таким же образом заполняется следующий блок и процесс продолжается до окончания записей во входном потоке. После чего заполненные блоки вычитываются и по ним строится бинарное дерево слияния. При чтении из фильтра сортировки происходит разбор дерева и слияние записей в один проход.

или я не понял, и твой метод сильно отличается? я вот пару раз перечитал, и не понял (может, из-за ночного времени), зачем сортировать пойнтеры, а потом переливать записи в их порядке, если в блоке записи и так можно отсортировать.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725130
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvя вот пару раз перечитал, и не понял (может, из-за ночного времени), зачем сортировать пойнтеры, а потом переливать записи в их порядке, если в блоке записи и так можно отсортировать.
Про поинтеры просто. Процессору быстрей поменять местами два четырех-байтных значения(поинтера), чем поменять местами два буфера. Причём разница в скорости пропорциональна размеру буфера, т.е. поменять местами два поинтера будет в ~1000 раз быстрей чем поменять два буфера размером по 4000. Поэтому буфера не перемещают. А раз мы перемещаем только ссылки, тогда допускается разный размер буферов под каждую запись.
Влад говорит что сортируются указатели:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=668484&msg=7253772 Сортировка в FB сделана не совсем так, как описал КДВ. Те, кто в курсе про внешнюю сортировку с многопутевым слиянием на диске, дальше может не читать.

Итак, как оно там внутри (на пальцах) :

Есть буфер сортировки в памяти. В него поступают записи для сортировки. Длина ключа (то, что сравнивается) меньше длины записи сортировки. И длина ключа, и длина записи всегда фиксированного размера. Как только буфер заполнен, его содержимое сортируется quick sort'ом. Перемещаются только указатели на записи.

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

Когда все данные из потока выбраны, мы имеем N упорядоченных блоков во временном файле. Берём из него 8 блоков и сортируем их сортировкой слиянием. Упорядоченный результат пишем в тот-же временный файл. И т.д. В конце получаем тот же файл с N1 = N / 8 блоков бОльшего (в 8 раз) размера. Повторяем до тех пор, пока Ni > 8. После этого можно выдавать записи из оставшихся Ni блоков "наружу", есс-но сортируя их слиянием.


Теперь, куда тут можно попробовать прикрутить компрессию.

Блоки на диске образованы из записей сортировки фиксированной длины. Поэтому работа с такими блоками весьма проста. Я думаю, что вполне можно сжимать эти записи каким-нибудь лёгким алгоритмом, конечно добавив заголовок с длиной записи. При длине записи сортировки в несколько раз превышающей длину ключа вполне можно получить выигрыш в IO, несколько потеряв в CPU.
Из заболденного делаю вывод что внутри блока перемещаются НЕ записи, и таким образом фиксированные буфера нам для сортировки не нужны.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725526
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВлад говорит что сортируются указатели:
значит, сортировка в ФБ работает именно так, как ты и хотел.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38725661
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvзначит, сортировка в ФБ работает именно так, как ты и хотел.Как это ? А вот же, дальше:hvladКогда все данные из потока выбраны, мы имеем N упорядоченных блоков во временном файле. Берём из него 8 блоков и сортируем их сортировкой слиянием. Упорядоченный результат пишем в тот-же временный файл. И т.д. В конце получаем тот же файл с N1 = N / 8 блоков бОльшего (в 8 раз) размера. Повторяем до тех пор, пока Ni > 8. После этого можно выдавать записи из оставшихся Ni блоков "наружу", есс-но сортируя их слиянием.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38726079
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидkdvзначит, сортировка в ФБ работает именно так, как ты и хотел.Как это ? А вот же, дальше:hvladКогда все данные из потока выбраны, мы имеем N упорядоченных блоков во временном файле. Берём из него 8 блоков и сортируем их сортировкой слиянием. Упорядоченный результат пишем в тот-же временный файл. И т.д. В конце получаем тот же файл с N1 = N / 8 блоков бОльшего (в 8 раз) размера. Повторяем до тех пор, пока Ni > 8. После этого можно выдавать записи из оставшихся Ni блоков "наружу", есс-но сортируя их слиянием.
Это не требует фиксированных буферов. Я хотел именно этого.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727082
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати в PostgreSQL есть ещё резиновый NUMERIC:
http://www.postgresql.org/docs/9.3/interactive/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL Both the maximum precision and the maximum scale of a numeric column can be configured. To declare a column of type numeric use the syntax:
NUMERIC(precision, scale)
The precision must be positive, the scale zero or positive. Alternatively:
NUMERIC(precision)
selects a scale of 0. Specifying:
NUMERIC
without any precision or scale creates a column in which numeric values of any precision and scale can be stored, up to the implementation limit on precision. A column of this kind will not coerce input values to any particular scale, whereas numeric columns with a declared scale will coerce input values to that scale. (The SQL standard requires a default scale of 0, i.e., coercion to integer precision. We find this a bit useless. If you're concerned about portability, always specify the precision and scale explicitly.)
Note: The maximum allowed precision when explicitly specified in the type declaration is 1000; NUMERIC without a specified precision is subject to the limits described in Table 8-2 .
В Table 8-2 написано:
range for NUMERIC without a specified precision = up to 131072 digits before the decimal point; up to 16383 digits after the decimal point .Зачем им такие длинные числа? Им наверное они не нужны. Но могут пригодиться некоторым пользователям :)
Нужно ли говорить что для этих чисел доступны все математические операции? Наверняка.
Можно ли говорить что это работает медленней чем у нас? Не факт:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
-- У них:
select sum(11326547676634534576.3123455766578651239876554354::numeric(1000, 500)) from t -- миллион записей
--
1,22 sec

select sum(11326547676634534576.3123455766578651239876554354::numeric) from t
--
1,33 sec

select sum(12345.678::numeric(18, 3)) from t
--
1,01 sec

select sum(12345.678::numeric) from t
--
1,01 sec

-- У нас:
select sum(cast(12345.678 as numeric(18, 3))) from t
--
------ Информация о производительности ------
Время подготовки запроса = 47ms
Время выполнения запроса = 1s 451ms
Среднее время на получение одной записи = 1 451,00 ms
Current memory = 677 102 652
Max memory = 677 400 680
Memory buffers = 40 960
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 6 019 808


Но нам нельзя резиновый NUMERIC, т.к. мы не умеем эффективно хранить и обрабатывать резиновые типы.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727090
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,
(тихим шепотом)
это всё прекрасно, конечно: числа вида power(10, 100500), длинная арифметика, просторы вселенной...
но я на тут на одном заборе прочитал такую злостную клевету, что у них:
1) нет автономных тнранзакций внутри ХП (или как там по-ихнему... "функций" ?);
2) нельзя вытащить данные из другой базы (как в ФБшном ES on ext data source);
3) нет встроенного аудита операций с базой (только сторонние решения)

Это действительно до сих пор так ?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727106
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидNickDee,
(тихим шепотом)
это всё прекрасно, конечно: числа вида power(10, 100500), длинная арифметика, просторы вселенной...
но я на тут на одном заборе прочитал такую злостную клевету, что у них:
1) нет автономных тнранзакций внутри ХП (или как там по-ихнему... "функций" ?);
2) нельзя вытащить данные из другой базы (как в ФБшном ES on ext data source);
3) нет встроенного аудита операций с базой (только сторонние решения)

Это действительно до сих пор так ?

Я не в курсе про это :) Мне не нравится что там нет Embedded-версии. И что таблицы не в одном файле. Но вот их резиновые типы мне понравились. А у нас мне не нравится 31 символ на имя, и небольшая инертность мышления у передовой части сообщества по некоторым вопросам :) Ну и двойные стандарты ингода: тут действуем по стандарту потому что "это же sql-стандарт!", а тут действуем не по стандарту потому что считаем что так удобно :) Ещё не нравится что кто-то наверху всё время самообманывается по поводу времени выхода тройки, и тем самым вводит сообщество в заблуждение, и тем самым вызывает порцию недоумения и недоверия у ожидающих когда подходит очередной срок.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727126
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как постепенно уходящий от FB в Postgres могу сказать про вытаскивание из другой базы: оно есть.

http://www.postgresql.org/docs/9.2/static/dblink.html dblink is a module which supports connections to other PostgreSQL databases from within a database session.

Что мешает написать свою ХП, которая будет возвращать наборы данных из совсем других баз, не знаю. Там есть полноценные Питон и Перл.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727132
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakКак постепенно уходящий от FB в Postgres...А чего уходите? Не комфортно стало?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727164
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak> Как постепенно уходящий от FB в Postgres

Можно поподробнее на эту тему? Причины, описание самого процесса
(с перечнем технологий и библиотек, если несложно), впечатления и пр.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727253
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИХМО, самый главный недостаток PG в том что в нём функции могут стать инвалидными после изменения метаданных и он никак это не сообщит. Т.е. без труда позволяется такой DDL который делает функции не работоспособными, и в отличии от ORA статусов инвалид/не инвалид нету.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727319
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИХМО, самый главный недостаток PG в том что в нём функции могут стать инвалидными после изменения метаданных и он никак это не сообщит. Т.е. без труда позволяется такой DDL который делает функции не работоспособными, и в отличии от ORA статусов инвалид/не инвалид нету.
Там наверняка есть недостатки, но мы смотрим на других не за тем чтобы тыкать пальцами на их недостатки, а чтобы отмечать явные достоинства и примерять их на себя. Нам ведь именно это нужно, правда? :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727320
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeНам ведь именно это нужно, правда?
Нет, маниловщина нам ни к чему. Нам нужны кодеры, которые смогут влить эти чужие
достоинства в наш код.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727328
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeНам ведь именно это нужно, правда?
Нет, маниловщина нам ни к чему. Нам нужны кодеры, которые смогут влить эти чужие
достоинства в наш код.

Сколько кодеров прошло по этому пути за последние 7 лет?
И где они все сейчас?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727330
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТам наверняка есть недостатки, но мы смотрим на других не за тем чтобы тыкать пальцами на их недостатки, а чтобы отмечать явные достоинства и примерять их на себя. Нам ведь именно это нужно, правда? :)

ИХМО, из всех достоинств PG ты выбрал самые не значимые.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727334
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDeeТам наверняка есть недостатки, но мы смотрим на других не за тем чтобы тыкать пальцами на их недостатки, а чтобы отмечать явные достоинства и примерять их на себя. Нам ведь именно это нужно, правда? :)

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


ИХМО, из всех достоинств PG ты выбрал самые не значимые.
Я выбрал те, где у нас слабости в реализации, в результате чего идёт неоправданный расход ресурсов компа.
Но ещё увидел резиновый numeric, увидел timestamp в utc, увидел многообразие типов индексов, партиции, возможность подключения своих языков, наследование. Наследование - прикольная штука :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727343
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeещё увидел
Повторяю вопрос медленно: кодить всю эту хрень ты будешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727348
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

я чего то тебя не пойму. Ну увидел ты где то фичу новую, ну захотел её - так создай тикет и жди пока реализуют (если конечно реализуют) или сделай сам. Или ты нас пытаешься сейчас убедить, что это архиважные штуки и разработчикам FB надо срочно всё бросить и заниматься этой фигнёй?

P.S. Ты ещё Оракл посмотри. По количеству фич он наверное уделает все вместе взятые СУБД. Давай всё в FB перетащим.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727354
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDee,

я чего то тебя не пойму. Ну увидел ты где то фичу новую, ну захотел её - так создай тикет и жди пока реализуют (если конечно реализуют) или сделай сам. Или ты нас пытаешься сейчас убедить, что это архиважные штуки и разработчикам FB надо срочно всё бросить и заниматься этой фигнёй?
Ты наверное не заметил, но проблема не в том, что нет времени реализовать. А в том, чтобы видеть косяки.
Когда есть проблема реализовать, то говорится что фича хорошая, но нет времени. А у нас это звучит так: "фича пользователям не нужна", и предлагаются пути для обхода. А должно быть так: фича пользователям нужна, но пока нет ресурсов, и вот вам, пользователи, пути для обхода... И без пены у рта. Нефиг в сообществе лукавость разводить и считать пользователей дебилами.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727357
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Я не считаю безразмерный varchar хорошей фичей, но не возражаю против таковой
2. Длинная арифметика нужна (с точностью больше 18), но это не значит, что она будет безразмерной
3. Как оно там сортируется это отдельный вопрос и вообще мало зависит от того есть безразмерные типы или нету
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727360
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeещё увидел
Повторяю вопрос медленно: кодить всю эту хрень ты будешь?

Я ж тебе ответил вопросом на вопрос. Какие проблемы с новыми разработчиками?
Они приходят но отбриваются?
Они не приходят?
Почему разработчиков всего пять?
Спонсоры дают мало денег?
Или ты мне предлагаешь пройти этот путь и на себе понять что там не так, кто виноват и что делать с упырями? :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727369
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис2. Длинная арифметика нужна (с точностью больше 18), но это не значит, что она будет безразмернойЕсли бы был "выход в яву" из хранимок ФБ, то все вопросы по длинной арифметике ушли бы в небытиё. В том числе и про размеры.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727377
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeИли ты мне предлагаешь пройти этот путь и на себе понять что там не так, кто
виноват и что делать
Ага, именно так. Тогда мы и увидим что эти твои "увиденные косяки" могут принести
хорошего, а что - плохого. А Таблоид позаботится чтобы продемонстрировать с цифрами в
руках насколько твои "безразмерные типы" будут тормозить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727379
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА Таблоид позаботится чтобы продемонстрировать с цифрами в руках насколько твои "безразмерные типы" будут тормозить.я в упор не понимаю, для чего нужна сортировка сверхдлинных строк. Кто будет глаза ломать об них, да еще учитывая, что на мониторах они всё равно не отобразятся даже в 1% своей длины ?
Сами по себе длинные строки (большие числа ?) - может, и нужны где-то. В криптиграфии с открытым ключём, например. Но это не СУБДшная задача таки. Совсем.
ЗЫ. И даже если представить, что сортировка таких строк позарез нужна, что мешает сделать таблицу со 100 полями varchar(100), в которых эти строки будут в "раздробленном виде", и выполнять из неё 100 раз заливку в GTT1 с order by F_01, затем из GTT1 в GTT2 с order by F_02, затем обратно - из GTT2 в GTT1 с order by F_03 и т.д. до 100-го поля ? Может, и выглядит как бред, но эти 100 заливок-сортировок если и будут во что-то упираться, то точно не в размер памяти. В эффективность нынешнего доступа к GTT "почти как" к FIXED-таблицам - да, будут. Но ежели ФБ-светила когда-нибудь подправят GTT-консерваторию, или вообще сделают таблицы в памяти (a'la mon$), то проблема вообще исчезнет.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727389
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидDimitry SibiryakovА Таблоид позаботится чтобы продемонстрировать с цифрами в руках насколько твои "безразмерные типы" будут тормозить.я в упор не понимаю, для чего нужна сортировка сверхдлинных строк. Кто будет глаза ломать об них, да еще учитывая, что на мониторах они всё равно не отобразятся даже в 1% своей длины ?
Так без разницы по чему сортировать, хоть по ID, всё-равно запись в памяти хранится по объявленной в метаданных длине.
Попробуй написать функцию, которая аппит варчар:
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION UpperStr
    VARCHAR(32000)
RETURNS VARCHAR(32000) FREE_IT
ENTRY_POINT 'UpperStr' MODULE_NAME 'str_module';


а дальше попробуй иcпользовать её:
Код: sql
1.
2.
create table T(Id integer, Name varchar(20), CreationTime timestamp); -- 1 000 000 записей
select Id, UpperStr(Name) from T order by CreationTime;


Размер одной записи выборки около 32 килобайт. Чтобы посортировать миллион таких в памяти, нужно около 32ГБ памяти.
Как решить проблему? Да элементарно, нужно объявить функцию:
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION UpperStr20
    VARCHAR(20)
RETURNS VARCHAR(20) FREE_IT
ENTRY_POINT 'UpperStr20' MODULE_NAME 'str_module';


И писать
Код: sql
1.
select Id, UpperStr20(Name) from T order by CreationTime;


А как же быть если нужно такое делать и для других таблиц, где размер варчара например 100?
Да элементарно, нужно объявить функцию:
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION UpperStr100
    VARCHAR(100)
RETURNS VARCHAR(100) FREE_IT
ENTRY_POINT 'UpperStr100' MODULE_NAME 'str_module';


И писать
Код: sql
1.
select Id, UpperStr100(Name) from T1 order by CreationTime;


А как же быть если варчаров много разных? Да элементарно, нужно объявить много функций, по количеству варчаров, по шаблону:
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION UpperStrN
    VARCHAR(N)
RETURNS VARCHAR(N) FREE_IT
ENTRY_POINT 'UpperStrN' MODULE_NAME 'str_module';


И писать
Код: sql
1.
select Id, UpperStrN(Name) from TN order by CreationTime;


*ботня, не правда ли? :)
Это то, на что обрекает пользователей текущая реализация VARCHAR(N).

Кстати в Firebird есть системная функция Upper, которая удивительным образом возвращает не varchar(32000), а varchar(длина параметра). А ка же быть не системным функциям?
Кстати, а если бы была системная функция Str2Hex, то варчар какой ширины она бы возвращала? длина_параметра * 2? А обратная бы делила на два? :) А как написать такую функцию используя механизм UDR? Входной параметр блоб и выходной блоб?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727392
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

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

гнусный ты провокатор.
Да просто с такими удобствами вы весь userbase растеряете. Попробуй в Delphi закодить бизнес-логику на процедурах с параметрами типа string[n]. Понравится тебе?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727432
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

ты вообще читаешь чужие сообщения. Сортировка широких выборок может делаться по другому. Читай и пробуй 13198664 .

P.S. Что ещё кто-нибудь пользуется UDFкой переводящей строку в верхний регистр?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727433
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeДа просто с такими удобствами вы весь userbase растеряете. Попробуй в Delphi закодить бизнес-логику на процедурах с параметрами типа string[n]. Понравится тебе?
ты действительно думаешь, что все прогрессивное человечество крутящее базы на ораклах, мссклях, мускулях и постгресах уже давно отказалось от ограничений на длину строки и юзают исключительно безразмерные типы? Смею тебя заверить, все с точностью до наоборот.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727436
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee
Код: sql
1.
select Id, UpperStr(Name) from T order by CreationTime;

Размер одной записи выборки около 32 килобайт. Чтобы посортировать миллион таких в памяти, нужно около 32ГБ памяти.Ты бы проверил вот это:
Код: sql
1.
select id from (select id from t order by creationtime) x join t on x.id=t.id;

Ну да, тут будет два раза обращение к `t`, но тем не менее сортировка потребует (20+4+4)*1'000'000 байт - 20=заголовок записи, 4 байта на id, 4 байта на timestamp (или 3 ?).

ЗЫ. Ну и про спецбилд от ДЕ, где сортировка делается примерно так, как показано, но только соединение там идёт по rdb$db_key, - ты в курсах, конечно, и тестировал его ?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727438
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Код: sql
1.
select id, UpperStr(Name) from (select id from t order by creationtime) x join t on x.id=t.id;


поправил.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727439
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Так что мешает?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727442
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeekdvNickDee,

гнусный ты провокатор.
Да просто с такими удобствами вы весь userbase растеряете.Здесь на скуле, Джудж не хочет новый раздел создавать, пока не соберется определенное минимальное количество тем или желающих. (А уж создать раздел в тыщи раз легче, чем новый функционал сервера.) И ничего, не уменьшаются юзеры.

Да, в принципе, чем больше возможностей, тем лучше. Только совершенно очевидно, что сначала надо делать более востребованные возможности, а потом - менее. А твоем случае, например насчет безрармерного varchar-a я не вижу каких-то особых причин его вводить, кроме банального "мне лень подумать, какие варчары будут тут и там, и легче лепить везде одно и то же. А потом поныть про проседание производительности".
То же и со сверхдлинными числами. Неплохо бы привести пример, в какой области они будут использоваться (именно сверхдлинные, а не, скажем, длиной в 36 позиций). А то я например знаю только одну область, и там базы данных - нечто совсем постороннее.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727444
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

здравый смысл. Ограничение длины - это констрейнт, который в большинстве случаев вполне успешно завязывается на бизнес-логику. Исключения бывают, конечно же, но раздувать из этого истерику в стиле "шеф, все пропало!" глупо.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727453
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПопробуй в Delphi закодить бизнес-логику на процедурах с параметрами типа
string[n].
Молодой, длинные строки появились впервые в Delphi 2. До этого весь мир десятилетиями жил
на строках с ограничением размера и не жужжал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727477
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Засрали тему, ироды.

Скопипастю, чтобы не затерялось:

Гаджимурадов Рустам> Alexander A. Sak> Как постепенно уходящий от FB в Postgres

Можно поподробнее на эту тему? Причины, описание самого процесса
(с перечнем технологий и библиотек, если несложно), впечатления и пр.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727611
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я помню. Времени не было подумать. Ну вот подумал.

Основной мотив -- попробовать новенького. Остальное, наверное, вторично.

Как это было у меня. Клуб анонимных отказников от Firebird.
Начиналось все лет 13-15 назад. Основная БД была Оракл, разработка клиента -- Delphi. Попутно был левый проект -- приемная комиссия ОмГПУ. Программа выросла из штанишек Клариона, потом из штанишек Парадокса. На что переходить? Вариантов при тотальной Win98 не было: только Firebird. Пару лет даже жили с сервером на Win98.
Клиента, которого делал на основной работе адаптировал под Firebird. Пошел мегапрофит: для левого проекта писать на Delphi не надо, все решалось исключительно настройками и хранимыми процедурами. Если возникали какие-то потребности, дорабатывался клиент на основной работе. Начальство было в курсе и было совсем не против.
Потом появился второй левый проект: СПИД-Центр. Там все аналогично: клиент все тот же, системная серверная часть перекочевала из приемной комиссии.

В 2006 уволился с основной работы. На новой -- все тот же Оракл и ничего кроме него. Левые проекты продолжались, но уже вяло. Потом на основной работе начался проект на джаве, началось погружение в JEE. Delphi совсем ушел на задний план. Года с 2009 в моем окружении стал пропадать Виндовс. В 2011 закончился СПИД-Центр: их возможности совсем перестали пересекаться с моими желаниями. В 2013 закончилась приемная комиссия ОмГПУ: начальство решило, что 1С -- решение всех проблем. В 2013 же взялся за замену 1С в магазине, занимающимся мебельной фурнитурой. Почему так -- тема другого поста, наверное.

Итак 2013 год. Винды нет нигде, даже в магазине мебельной фурнитуры. Там везде Убунта. Я уже лет 7 не занимаюсь Delphi. Новый проект. Чем в такой ситуации Firebird лучше, чем Postgres? Был дан ответ: ничем. Оба устанавливаются одним чекбоксом, заказчику PG даже кажется более правильным выбором, у меня есть желание покачать скилл по новой БД. Плюс на основной работе начальство озаботилось стоимостью лицензий на Оракл и решило часть нагрузки перенести на PG. Тоже в кассу оказалось. Вот так я и очутился в стане пользователей Постгреса.

Стоит отметить, что в выборе PG<=>FB еще повлияло наше сообщество FB. Какое-то оно повышенно снобистское что ли. Единственный человек, кого это утверждение на 100% не касается -- Дима Еманов. Такое впечатление сложилось еще со времен NNTP-рассылки. Не помню уже даже где она была. На Epsilon? Google? Помню, ловил себя несколько раз на мысли, что если бы знал, что завсегдатаи такие грубияны, поискал бы что-нибудь другое. Просто из вредности. Когда пришлось выбирать, это тоже сыграло какую-то роль.

Спасибо за внимание.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727649
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeПопробуй в Delphi закодить бизнес-логику на процедурах с параметрами типа
string[n].
Молодой, длинные строки появились впервые в Delphi 2. До этого весь мир десятилетиями жил
на строках с ограничением размера и не жужжал.

Двести лет назад электричества не было. И "удобства" были во дворе, когда там минус 40. Кто-то жужжал? И без компов обходились.

Скажи лучше как мне универсально для строк задекларировать функцию Quote(S), которая бы квотила мне S. Сейчас получается вот такая гадость:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
create table TT(Id integer, S varchar(10));

-- 1M записей
insert into TT select row_number()over(), rpad('',10, uuid_to_char(gen_uuid())) from rdb$types,rdb$types,(select 1 i from rdb$types rows 20) rows 1000000; 

create or alter function QUOTEB (
    S blob sub_type text)
returns blob sub_type text
AS
begin
  return '"' || S || '"';
end

create or alter function QUOTE (
    S varchar(8000)) -- 8000 потому что база UTF8
returns varchar(8002)
AS
begin
  return '"' || S || '"';
end

create or alter function QUOTE253 (
    S varchar(253))
returns varchar(255)
AS
begin
  return '"' || S || '"';
end

create or alter function QUOTE10 (
    S varchar(10))
returns varchar(12)
AS
begin
  return '"' || S || '"';
end

select list(S) from TT -- 920ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 31ms
Время выполнения запроса = 920ms
Среднее время на получение одной записи = 920,00 ms
Current memory = 36 929 376
Max memory = 104 864 496
Memory buffers = 2 048
Reads from disk to cache = 3 790
Writes from cache to disk = 545
Fetches from cache = 2 009 416

select list('"' || S || '"') from TT -- 1s 482ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 1s 482ms
Среднее время на получение одной записи = 1 482,00 ms
Current memory = 37 214 384
Max memory = 104 864 496
Memory buffers = 2 048
Reads from disk to cache = 3 789
Writes from cache to disk = 846
Fetches from cache = 2 009 660

select list(QuoteB(S)) from TT -- 29s 750ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 29s 750ms
Среднее время на получение одной записи = 29 750,00 ms
Current memory = 475 539 568
Max memory = 606 101 632
Memory buffers = 2 048
Reads from disk to cache = 3 789
Writes from cache to disk = 868
Fetches from cache = 2 009 660

select list(Quote(S)) from TT -- 15s 850ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 47ms
Время выполнения запроса = 15s 850ms
Среднее время на получение одной записи = 15 850,00 ms
Current memory = 37 003 592
Max memory = 104 864 496
Memory buffers = 2 048
Reads from disk to cache = 3 789
Writes from cache to disk = 865
Fetches from cache = 2 009 660

select list(QUOTE253(S)) from TT -- 5s 179ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 5s 179ms
Среднее время на получение одной записи = 5 179,00 ms
Current memory = 37 198 640
Max memory = 104 864 496
Memory buffers = 2 048
Reads from disk to cache = 3 789
Writes from cache to disk = 618
Fetches from cache = 2 009 660

select list(Quote10(S)) from TT -- 4s 696ms
--
PLAN (TT NATURAL)
------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 4s 696ms
Среднее время на получение одной записи = 4 696,00 ms
Current memory = 36 948 184
Max memory = 104 864 496
Memory buffers = 2 048
Reads from disk to cache = 3 789
Writes from cache to disk = 849
Fetches from cache = 2 009 660


Зы: понятно что правильный квотинг должен быть не просто слева и справа, но и с задваиванием символа " внутри строки. Но это уже к сути не относится.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeкак мне универсально для строк задекларировать функцию Quote(S), которая бы
квотила мне S.
Вопросы "как мне правильно вырвать гланды через задницу" должны оставаться без ответа.
Дабы не поощрять.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727659
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak> Я помню. Времени не было подумать. Ну вот подумал.
>
> Основной мотив -- попробовать новенького. Остальное, наверное, вторично.

Спасибо. Хотя это вовсе не то, что интересно было услышать...

> Там везде Убунта. Новый проект. Чем в такой ситуации Firebird
> лучше, чем Postgres? Был дан ответ: ничем.

Т.е. никакого выбора, фактически, не было, сменили даже не на
"новенькое", а на "другое". Желание изучить новую тенологию,
продукт и пр. похвально, конечно, но не как аргумент выбора.

> Стоит отметить, что в выборе PG<=>FB еще повлияло наше сообщество FB.

Есть такое дело, хотя преувеличивать нет смысла, да и вряд
ли у PG c этим лучше (особенно по некоторым критериям).
В любом случае, на фидбек и работу с СУБД это мало влияет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727660
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

такую функцию не стоит объявлять, проще прям в запросе присоединить кавычки. Даже если не думать о том что строки как то там заполняются, то на просто на вызовах функций всё равно потеряешь производительность.

В принципе я согласен с тобой в том что для процедур и функций длина строки могла бы вычисляться, в прочем как и точность numeric. Но ещё раз повторяю это задача не самая приоритетная.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727667
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистакую функцию не стоит объявлять, проще прям в запросе присоединить кавычки.
Попобуй заквотить строку: А","B
Должно получиться "А"",""B", а не "А","B".
Так что универсально только функцией.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727673
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeкак мне универсально для строк задекларировать функцию Quote(S), которая бы
квотила мне S.
Вопросы "как мне правильно вырвать гланды через задницу" должны оставаться без ответа.
Дабы не поощрять.

По существу говори :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727683
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПо существу говори :)
Прикреплённая тема, ссылка дохлая, но всё же копий в сети как грязи:
http://segfault.kiev.ua/smart-questions-ru.html#goal
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727712
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeПо существу говори :)
Прикреплённая тема, ссылка дохлая, но всё же копий в сети как грязи:
http://segfault.kiev.ua/smart-questions-ru.html#goal

Я вопрос задал именно тот, который интересен.
Применить этот Quote можно например если хочется быстро закачивать большие датасеты на клиента, если не по локалке работать.
Код: sql
1.
select Id, Client, Address, DocNum, DocDate, Phones, Description from Documents where...

Это может быть драматически медленно :)
Заменяем на:
Код: sql
1.
select list(id), list(Quote(Address, '"')), list(DocNum), list(DocDate), list(Quote(Phones, '"'), list(Quote(Description, '"')) from Documents where...

Получаем профит.
На клиент придёт одна запись из 7 блобов, без большого кол-ва "туда-сюда пакетов". Нужно будет извлечь данные полей, что даже для миллиона записей будет менее одной секунды.
В полях Address, Phones и Description могут быть как запятые, так и кавычки. Поэтому в запросе мы используем функцию Quote, мегасупербыструю и универсальную (о ней я тебя и спрашиваю).
Код на клиенте примерно такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
type
  TStringArray = array of string;
  TRecords = array of TStringArray;

// на скорую руку
function ExtractFieldData(const Data: string): TStringArray;
var
  Count: Integer;
begin
  Count := 0;
  SetLength(Result, GetCharCount(Data, ',') + 1);
  // Идём по Data и заполняем Result, постепенно увеличавая Count
  ...

  SetLength(Result, Count);
end;

function ExtractData(Ds: TDataSet): TRecords; 
var
  I: Integer;
begin
  SetLength(Result, Ds.Fields.Count);
  for I := 0 to High(Result) do
    Result[I] := ExtractFieldData(Ds.Fields[I].AsString);
end;

var
  Recs: TRecords;
  Ds: TDataSet;
begin
  Ds := OpenDataSet('select list(id), list(Quote(Address, ''"'')), list(DocNum), list(DocDate), list(Quote(Phones, ''"''), list(Quote(Description, ''"'')) from Documents where...');
  Recs := ExtractData(Ds);
  // дальше работаем с массивом записей как угодно.
  ...
end;


Ещё его можно применить когда нужно выгрузить данные для экспорта куда-нибудь.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727718
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeНа клиент придёт одна запись из 7 блобов, без большого кол-ва "туда-сюда
пакетов".
Вот только 7 блобов это и есть "большое количество туда-сюда пакетов". Гораздо быстрее
будет на той стороне выгрузить все данные в файл и уже этот файл упаковать и передавать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727726
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeНа клиент придёт одна запись из 7 блобов, без большого кол-ва "туда-сюда
пакетов".
Вот только 7 блобов это и есть "большое количество туда-сюда пакетов". Гораздо быстрее
будет на той стороне выгрузить все данные в файл и уже этот файл упаковать и передавать.

если между list поставить "|| ASCII_CHAR(13) || ASCII_CHAR(10) ||", то получится один блоб. Разве один блоб тоже будет неэффективно передан?
Про упаковать согласен. Ещё функцию Pack в select добавить, и чтобы возвращала бинарный блоб.
Вот кстати для выгрузки в csv:
Код: sql
1.
2.
3.
select 
  list(Quote(Id) ||',' || Quote(Client) ||',' Quote(DocNum) ||',' || Quote(DocDate), ASCII_CHAR(13) || ASCII_CHAR(10)) 
from Documents where...


Поэтому вынь да положь нам быстрый Quote :) Или ещё примеров накидать? :) Это уже тогда троллинг будет :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727728
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeРазве один блоб тоже будет неэффективно передан?
Да, он будет передан менее эффективно чем упакованный файл по HTTP протоколу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727729
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeРазве один блоб тоже будет неэффективно передан?
Да, он будет передан менее эффективно чем упакованный файл по HTTP протоколу.
А если блоб тоже будет упакован?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeА если блоб тоже будет упакован?
Закачка в несколько потоков, восстановление при разрыве - всё это умеет HTTP, но не Firebird.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727731
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeА если блоб тоже будет упакован?
Закачка в несколько потоков, восстановление при разрыве - всё это умеет HTTP, но не Firebird.

Но ведь сервер может положить блоб в табличку. А клиент может скачать этот блоб из таблички в несколько потоков, разве нет? И при разрыве связи продолжить скачивать с нужного места... раз уж мы начали мыслить широко :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727732
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeА клиент может скачать этот блоб из таблички в несколько потоков, разве нет?

Нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727733
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> Заменяем на:

Ты умудрился исгадить насущную, в общем-то, необходимость
совершенно идиотским примером. Именно в таких случаях и
говорят, что нефиг, ибо голову расшибёте. (с)

> На клиент придёт одна запись из 7 блобов, без большого кол-ва "туда-сюда пакетов"

Как уже сказали - ошибаешься. Ещё интересно, зачем решать
несколько другую задачу такими непредназначенными для
неё методами, вместо накопления блобов/бинарников/ХМЛ
и пр., поклонниками которых ты являешься.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727734
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> А клиент может скачать этот блоб из таблички в несколько потоков, разве нет?

Точно нет.

NickDee> И при разрыве связи продолжить скачивать с нужного места

Тоже нет. Вернее, это зависит не совсем от FB, а скорее от сетевой
подсистемы, настроек и пр.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727735
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТы умудрился исгадить насущную, в общем-то, необходимость
совершенно идиотским примером.
Вот же хороший пример про экспорт: 16486456
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727737
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамNickDee> А клиент может скачать этот блоб из таблички в несколько потоков, разве нет?

Точно нет.

NickDee> И при разрыве связи продолжить скачивать с нужного места

Тоже нет. Вернее, это зависит не совсем от FB, а скорее от сетевой
подсистемы, настроек и пр.

Т.е. я не смогу создать 10 коннектов и утянуть в каждом по 1/10 блоба?
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727740
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeГаджимурадов РустамТы умудрился исгадить насущную, в общем-то, необходимость
совершенно идиотским примером.
Вот же хороший пример про экспорт: 16486456
Да и не думаю я что насущность может быть изгажена неудачным примером. Насущность никуда не делась. Или ты всё-таки чувствуешь что "всё, пипец, не надо. Говнопример всё испортил"? :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727743
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeНасущность никуда не делась.
Она давно уже не существует. С появления утильки под названием FBExport.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727745
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeНасущность никуда не делась.
Она давно уже не существует. С появления утильки под названием FBExport.

ты уже троллишь.
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727749
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> Вот же хороший пример про экспорт: 16486456

Я его видел. Та же чепуха.

NickDee> Т.е. я не смогу создать 10 коннектов и утянуть в каждом по 1/10 блоба?


Ааа, ты таким макаром имел в виду. ХитрО, в твоём стиле.
Но нет, сегментированные точно не получится, а потоковые -
не знаю, ими вроде итак никто не пользуется (это надо уже
у Влада/ДЕ уточнять - можно ли расшарить БЛОБ или читать
кусками с указанием нужного смещения, думаю что нельзя).

NickDee> Или ты всё-таки чувствуешь

Нет, я сказал то, что сказал - не каждой обезьяне
можно доверить гранату. Даже игрушечную. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38727753
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНет, я сказал то, что сказал - не каждой обезьяне
можно доверить гранату. Даже игрушечную. :)
Тролльнуть решил напоследок? :) Что за ночь блин :)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38729092
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeбез разницы по чему сортировать, хоть по ID, всё-равно запись в памяти хранится по объявленной в метаданных длине.В общем, это... товарищ NickDee!
Уламывай как сможешь dimitr'a, чтобы он портировал фикс к CORE-4528 в 2.5.

Вот тебе достаточно широкая таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
recreate table t(id int primary key, x int, y int, s1 varchar(10000), s2 varchar(10000), s3 varchar(10000)); commit;
insert into t
select
row_number()over()
,rand()*100
,rand()*100
,rpad('',10000, uuid_to_char(gen_uuid()))
,rpad('',10000, uuid_to_char(gen_uuid()))
,rpad('',10000, uuid_to_char(gen_uuid()))
from rdb$types,rdb$types,(select 1 i from rdb$types) rows 100000;
commit;

И вот два варианта получения из неё кортежей, упорядоченных по полю `y`:

var-1. Революцьонная сортировка с join'ом по rdb$db_key:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
commit; select mon$stat_id si,mon$stat_group sg,mon$max_memory_used mmu,mon$max_memory_allocated mma from mon$memory_usage order by sg,si;
out /dev/null;
set stat on;

select y.x, y.s1, y.s2, y.s3
from(
  select rdb$db_key k from t  order by y 
) x
left join t y on  x.k=y.rdb$db_key ;

set stat off;
out;
commit; select mon$stat_id si,mon$stat_group sg,mon$max_memory_used mmu,mon$max_memory_allocated mma from mon$memory_usage order by sg,si;

var-2. Обычный стиральный порошок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
commit; select mon$stat_id si,mon$stat_group sg,mon$max_memory_used mmu,mon$max_memory_allocated mma from mon$memory_usage order by sg,si;
out /dev/null;
set stat on;
select x,s1,s2,s3 from t order by y;
set stat off;
out;
commit; select mon$stat_id si,mon$stat_group sg,mon$max_memory_used mmu,mon$max_memory_allocated mma from mon$memory_usage order by sg,si;

И получаем:

trace для var-1 :
4942 ms, без всякого превышения TempCacheLimit'a
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Statement 58:
-------------------------------------------------------------
select y.x, y.s1, y.s2, y.s3
from(
  select rdb$db_key k from t order by y
) x
left join t y on x.k=y.rdb$db_key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Select Expression
    ->  Nested Loop Join (outer)
        -> Sort (record length: 24, key length: 8)
            -> Table "T" as "X T" Full Scan
        -> Filter
            -> Table "T" as "Y" Access By ID
                -> DBKEY
100000 records fetched
   4942 ms, 1245290 read(s), 4 write(s), 1900056 fetch(es)

Table                             Natural     Index    Update
*************************************************************
T                                  100000    100000
trace для var-2 :
8073 ms, общий расход TempSpace - около 3 Гб
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Statement 61:
----------------------------------------------------
select x,s1,s2,s3 from t order by y
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Select Expression
    -> Sort (record length: 30040, key length: 8)
        -> Table "T" Full Scan
100000 records fetched
   8073 ms, 497974 read(s), 1000056 fetch(es)

Table                             Natural     Index 
****************************************************
T                                  100000


Ну, и напоследок - результаты в isql (mon$memory_usage.max_memory_xxx):

var-1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SI      SG                   MMU                   MMA
== ======= ===================== =====================
 1       0            2452776928            2458869616  -- before query
 2       1               2269456               5177344  -- before query
. . .
SI      SG                   MMU                   MMA
== ======= ===================== =====================
 1       0            2457418568            2463690464 -- after query
 2       1               6840984               9801584 -- after query

var-2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SI      SG                   MMU                   MMA
== ======= ===================== =====================
 1       0            2457418568            2463690464  -- before query
 2       1               6840984               9801584  -- before query
. . .
SI      SG                   MMU                   MMA
== ======= ===================== =====================
 1       0            4541590608            4547998760  -- after query
 2       1            2091013024            2094108672  -- after query

Как говорится: кому надо - сам поймёт, куда дальше строчить письмена... ;-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38729396
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидУламывай как сможешь dimitr'a, чтобы он портировал фикс к CORE-4528 в 2.5.Кажись, не надо уламывать :-)
Судя по SF.net SVN: firebird:[59999] firebird/branches/B2_5_Release:
автор+ 2014-08-25 13:40 dimitr
+ M src/jrd/Optimizer.cpp
+Fixed CORE-4530: DB_KEY based join of two tables may be ineffective.- всё теперь там будет хорошо, заживём по-новому! :-)
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38729406
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидзаживём по-новому
это только тебя, извращенца, интересуют обходные пути. Все остальные в этом топике хотят, чтобы летало "искаропки".
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38729422
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dimitr!
You wrote on 26 августа 2014 г. 19:04:49:

DimitrТаблоид> заживём по-новому
> это только тебя, извращенца, интересуют обходные пути. Все остальные в
> этом топике хотят, чтобы летало "искаропки".
я даже больше скажу.
восходит на востоке, заходит на западе - НИЧЕГО НЕ НАДО ТРОГАТЬ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38731026
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: NickDee
>
> Т.е. я не смогу создать 10 коннектов и утянуть в каждом по 1/10 блоба?
>

substring ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Опять про varchar(n)
    #38731058
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич> substring ?

Это будут 10 отдельных разных БЛОБов, а не оригинальный.
Хотя технически - да, на клиенте их можно будет склеить и
получить идентичный (по содержимому) с оригиналом
(но всё равно другой).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
173 сообщений из 173, показаны все 7 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про varchar(n)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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