Привет, народ!

Пусть у нас есть метаданные:

==========================
CREATE TABLE MASTER (
    ID  INTEGER NOT NULL
);
ALTER TABLE MASTER ADD CONSTRAINT PK_MASTER PRIMARY KEY (ID);

CREATE TABLE DETAIL (
    ID         INTEGER NOT NULL,
    ID_MASTER  INTEGER NOT NULL,
    FIELD_20   VARCHAR(20) NOT NULL COLLATE PXW_CYRL
);
ALTER TABLE DETAIL ADD CONSTRAINT PK_DETAIL PRIMARY KEY (ID);
ALTER TABLE DETAIL ADD CONSTRAINT FK_DETAIL_ID_MASTER FOREIGN KEY
(ID_MASTER) REFERENCES MASTER (ID);
==========================

Генерим данные в обе талицы по 50.000 записей:
MASTER.ID - автоинкремент (0-49.999)
DETAIL.ID - автоинкремент (0-49.999)
DETAIL.ID_MASTER - случайное в интервале 0-49.999
DETAIL.FIELD_20 - случайное (только цифры) с длинное не более 15
символов

При фетче из запроса
==========
select M.ID,
       (select list(D.FIELD_20)
        from DETAIL D
        where D.ID_MASTER = M.ID
       ) FIELD_LIST
from MASTER M
order by M.ID
==========
имеем немеренноей отжирание памяти процессом сервера.
Пара таких запросов в незакомиченной транзакции и Out of Memory
гарантирован.

Аналогичная ситуация воспроизводится и на запросах вида
==========
select M.ID,
       (select cast(list(D.FIELD_20) as varchar(150))
        from DETAIL D
        where D.ID_MASTER = M.ID
       ) FIELD_LIST
from MASTER M
order by M.ID
==========
select V1.ID, cast(V1.FIELD_LIST as varchar(150))
from
  (
    select M.ID,
           (select list(D.FIELD_20)
            from DETAIL D
            where D.ID_MASTER = M.ID
           ) FIELD_LIST
    from MASTER M
    order by M.ID
  ) V1
==========
select M.ID, cast(list(D.FIELD_20) as varchar(150))
from MASTER M
  inner join DETAIL D on (D.ID_MASTER = M.ID)
group by M.ID
==========

Запросы протестированы на Super'е и Classic'е снапшота WI-T2.1.0.17834

Вопрос скорее к разработчикам: это у меня руки кривые и использование
list на больших выборках недопустимо? Или все таки бага?

--
WBR, Широбоков Николай
www.armax.ru

Ответить