for (int i = ...) или IN (1, 2, ...) - что лучше?
От: last shinji  
Дата: 18.07.04 11:26
Оценка:
вопрос к знатокам.
Необходимо обрабатывать рекурсивную структуру данных, хранящуюся в БД. Использую mdb & ADO + MS Jet 4.0 + С++ #import. ТК попытки создать рекурсивный запрос оказались безуспешными, для обработки поддререва складываю все идентификаторы его узлов во временную таблицу и обрабатываю каждый отдельный узел в цикле с помощью параметризованного объекта Command. Есть, однако идея создать запрос с условием вида "IN (ID1, ID2, ...)" (здесь без цикла, правда тоже не выйдет) — где IDn — идентификаторы узлов, и обработать все выбранные узлы через 1 запрос.


while (!pRecordset->ADOEOF) {
    pCommand->GetParameters()->GetItem(0L)->Value = 
       (long)pRecordset->GetFields()->GetItem(0L)->Value;
    pCommand->Execute(NULL, NULL, adCmdText);
    pRecordset->MoveNext();
}


VS

CString qstr, tmpstr;
while (!pRecordset->ADOEOF) {
    tmpstr.Format(_T("%d, "), (long)pRecordset->GetFields()->GetItem(0L)->Value); // вместо Format можно и _ltot
    qstr += tmpstr;
    pRecordset->MoveNext();
}

qstr.Format(_T("UPDATE ... WHERE ID IN (%s);"), qstr.Left(qstr.GetLength() - 2)); // убираем лишнюю запятую
pCommand->CommandText = _bstr_t(qstr);
pCommand->Execute(NULL, NULL, adCmdText);


Что из этого лучше с позиций перфоманса?
Носок исчез в гильбертовом пространстве. Туда ему и дорога.
Re: for (int i = ...) или IN (1, 2, ...) - что лучше?
От: Lexey Россия  
Дата: 18.07.04 17:52
Оценка:
Здравствуйте, last shinji, Вы писали:

LS>Что из этого лучше с позиций перфоманса?


Есть подозрение, что лучше всего тебе поменять структуру базы. Если insert'ы новых узлов редки, то стоит использовать представление дерева в виде nested sets (его тут уже описывали не раз). Если апдейты могут быть частыми, то стоит хранить matherialized paths, т.е. полный путь от корня до конечного узла. В обоих случаях выборка поддерева выполняется одним запросом.
... << RSDN@Home 1.1.4 beta 1 >>
Re[2]: for (int i = ...) или IN (1, 2, ...) - что лучше?
От: last shinji  
Дата: 19.07.04 09:56
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Есть подозрение, что лучше всего тебе поменять структуру базы. Если insert'ы новых узлов редки, то стоит использовать представление дерева в виде nested sets <cut, cut, cut>...


А можно по подробнее про эти nested sets (желательно ссылки), поиск по сайту выдает, не то, что хотелось бы.
Носок исчез в гильбертовом пространстве. Туда ему и дорога.
Re[3]: for (int i = ...) или IN (1, 2, ...) - что лучше?
От: Lexey Россия  
Дата: 19.07.04 20:05
Оценка: 1 (1)
Здравствуйте, last shinji, Вы писали:

L>>Есть подозрение, что лучше всего тебе поменять структуру базы. Если insert'ы новых узлов редки, то стоит использовать представление дерева в виде nested sets <cut, cut, cut>...


LS>А можно по подробнее про эти nested sets (желательно ссылки), поиск по сайту выдает, не то, что хотелось бы.


http://www.dbazine.com/tropashko4.shtml
... << RSDN@Home 1.1.4 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.