powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
9 сообщений из 9, страница 1 из 1
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725716
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Навеяло топиком про сортировку: решил сравнить произв-сть выборки из таблицы и пробегания по некоторой структуре, живущей вегда только в памяти и поддерживаемой автоматом в упорядоченном виде, a'la TreeMap или TreeSet.

Но где взять такую структуру ? Оказалось, что это... mon$context_variables :-)
Если затолкать в неё всяких разных переменных, то select из неё будет выдавать их всегда в отсортированном порядке, т.е. сия таблица есть не что иное, как TreeMap.

К сож-ю, в стандартном билде ФБ можно затолкать только 1000 контекстных переменных, причём длина имени у них ограничена 80 символами. Поэтому эффект можно оценить, только выполняя цикл с достаточным кол-вом сортировок.

Результат: навигация по mon$ быстрее как минимум в несколько раз.
Жаль, что нельзя затолкать длинные строки, да и вообще ограничение в 1000 ctx-переменных - анахронизм какой-то.

DDL:
Код: plaintext
1.
2.
3.
4.
recreate table tmp(s varchar(80) primary key using index tmp_s); commit;
insert into tmp select rpad('', 80, uuid_to_char(gen_uuid()))
from rdb$types,rdb$types
rows 1000;
commit;
Test:
Код: 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.
execute block returns( via_table_sort int, via_plan_order int, via_tree_navigate int )
as
  declare t0 timestamp;
  declare t1 timestamp;
  declare t2 timestamp;
  declare t3 timestamp;
  declare i int;
  declare n int = 1000;
begin
  for select s from tmp as cursor c
  do begin
    execute statement( 'select rdb$set_context(''USER_TRANSACTION'', :ctx_name, :ctx_value) from rdb$database' ) (ctx_name := c.s, ctx_value := 1) into i;
  end
  t0='now';
  i=0;
  while(i<n) do select 0*count(*)+:i+1 from (select s from tmp order by s||'') into i;

  i=0;
  t1='now';
  while(i<n) do select 0*count(*)+:i+1 from (select s from tmp order by s) into i;

  i=0;
  t2='now';
  while(i<n) do select 0*count(*)+:i+1 from ( select c.mon$variable_name from mon$context_variables c where c.mon$transaction_id=current_transaction) into i;
  t3='now';

  via_table_sort = datediff(millisecond from t0 to t1);
  via_plan_order = datediff(millisecond from t1 to t2);
  via_tree_navigate = datediff(millisecond from t2 to t3);
  suspend;
end
Result:
Код: plaintext
1.
2.
VIA_TABLE_SORT VIA_PLAN_ORDER VIA_TREE_NAVIGATE
============== ============== =================
          2251           1717               509

PS. В трейсе, кстати, ссылку на mon$context_variables видно в плане, но в статистике её вообще нет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PLAN (C TMP NATURAL)
PLAN SORT (TMP NATURAL)
PLAN (TMP ORDER TMP_S)
 PLAN (C NATURAL) 
1 records fetched
   4546 ms, 5053067 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$RELATIONS                                     8
TMP                               1001000   1000000
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725720
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. 2 dimitr : а есть ли в планах post-3 создание коннектом или транзакцией таких штучек, как tree-структуры ?
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725744
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ трейсе, кстати, ссылку на mon$context_variables видно в плане, но в статистике её вообще нет
у MON$ таблиц свои методы доступа, они не отражаются в статистике

Таблоидесть ли в планах post-3 создание коннектом или транзакцией таких штучек, как tree-структуры ?
нет. UDR тебе в руки и делай хоть деревья, хоть хеш-таблицы, хоть memcached прикручивай
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725777
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrнет. UDR тебе в рукифигасе... UDR на java уже можно фигачить ? (Адриано мну говорил как-то, что еще не готово)
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725835
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

не на C++
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725896
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

а ты пробовал это дело ?
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725912
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

пробовал как-то на Visual Studio 2012 примеры UDR скомпилировать. Так и не получилось... Там в доке написано что вроде достаточно того что есть в include, но компилятор почему-то говорит что то одного, то другого не хватает. В итоге скачал исходники, но всё равно откомпилировать не удалось. Спроси у Dimitry Sibiryakov'a он вроде сейчас пытается плагины для репликатора писать.
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38725929
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисон вроде сейчас пытается плагины для репликатора писать.
Плагины и UDR это две большие разницы. Больная фантазия Адриано заставляет меня обходить
последние на максимальной дистанции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
    #38726104
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСимонов Денисон вроде сейчас пытается плагины для репликатора писать.
Плагины и UDR это две большие разницы. Больная фантазия Адриано заставляет меня обходить
последние на максимальной дистанции.

Красота же :)

Код: 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.
/***
create procedure gen_rows2 (
    start_n integer not null,
    end_n integer not null
) returns (
    n integer not null
)
    external name 'udrcpp_example!gen_rows2'
    engine udr;
***/
FB_UDR_BEGIN_PROCEDURE(gen_rows2)
	FB_MESSAGE(InMessage,
		(FB_INTEGER, start)
		(FB_INTEGER, end)
	);

	FB_MESSAGE(OutMessage,
		(FB_INTEGER, result)
	);

	FB_UDR_EXECUTE_PROCEDURE
	{
		out->resultNull = FB_FALSE;
		out->result = in->start - 1;
	}

	FB_UDR_FETCH_PROCEDURE
	{
		return out->result++ < in->end;
	}
FB_UDR_END_PROCEDURE


...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Об эффективности сортировки, навигации по индексу и... выборки из аналога TreeSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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