Привет, народ!
Пусть у нас есть метаданные:
==========================
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