Текущий архив: 2005.12.11;
Скачать: CL | DM;
Внизпоследовательная обработка данных Найти похожие ветки
← →
redlord (2005-10-23 23:58) [0]всем привет
имеется таблица размер которой порядка 15 ГГБ составлена не мной и изменить что либо в ее структуре я не могу первичный ключ отсутствует .
а под условие запроса попадает очень много записей которые крайне не желательно засовывать в датасет (прога начинает отжирать оперативки больше чем есть на компе ) как обработать данные последовательно ?
есть ли компонент который позволял обрабатывать записи последовательно ??
← →
Fay © (2005-10-24 01:53) [1]2 redlord (23.10.05 23:58)
ADOQuery.CursorLocation clUseServer
← →
sniknik © (2005-10-24 07:54) [2]> первичный ключ отсутствует
попал студент... %-)
обрабатавать это же значит читать-анализировать-менять-записывать... ???
не получится.
← →
Anatoly Podgoretsky © (2005-10-24 09:11) [3]Расстрелять, я в серьез.
И поднять вопрос, перед тем, кто имеет право изменить.
Если оба варианта не возможны, то стреляться самому.
← →
redlord (2005-10-24 10:25) [4]
> ADOQuery.CursorLocation clUseServer
А мона простенький пример использования?
В этом случае будет действительно построковая обработка или всеже результат запроса будет где то кэшироваться?
Напомню что в результате запроса на выходе очень много строк.
← →
sniknik © (2005-10-24 10:40) [5]redlord (24.10.05 10:25) [4]
всерьез думаеш серверный курсор поможет тебе обойти основы построения баз/принципы sql? т.е. то на чем все базируется? наивный.
а вообще, по серверному курсору ты просто получиш постоянно по мере обращения растуший рекордсет на клиенте. т.е. если обратится сразу в конец например (last) то это сформирует тебе такойже рекордсет как клиентский. и никуда ты не денешся от необходимости перестраивать базу. (если обрабатавать = ....-записывать)
← →
Nikolay M. © (2005-10-24 10:47) [6]1) Сделать правильно, т.е. создать ПК.
2) Сделать левой ногой, например, загнать результат запроса во временную #-таблицу, у которой есть ПК (Identity-поле, к примеру), а уже из нее начитывать на клиента нужные данные.
← →
Nikolay M. © (2005-10-24 10:47) [7]Удалено модератором
← →
Desdechado © (2005-10-24 10:53) [8]создай ХП, в ней по 1 записи обрабатывай
но это припарки мертвой БД и мертсвому изобретателю структуры БД
← →
sniknik © (2005-10-24 12:01) [9]Desdechado © (24.10.05 10:53) [8]
> создай ХП, в ней по 1 записи обрабатывай
не говори ерунды, а то поверит, и придется потом обьяснять как сделать то, что сделать нельзя.
попробуй сам, сделай таблицу без ключа с однородными данными (только поменьше данных а то напряжно) и попробуй обработать в ХП не в ХП неважно.
вот чтобы не мучился выбором
к приеру таблица из двух полей, поле1 Int поле2 тоже Int
наполнение
поле1, поле2
1 1
1 1
1 1
1 1
1 1
2 2
2 2
2 2
2 2
обработай ее в ХП, так, чтобы (к примеру конечно, если сложно можеш любую другую обработку придумать) во втором была сумма предыдуших полей 1+2го.
вот так
поле1, поле2
1 2
1 4
1 6
1 8
1 10
2 14
2 18
2 22
2 26
естественно данные должны обрабатываться последовательно "по 1 записи" и с самой таблице, без переписывания в другую. (этоже только пример. разработка алгоритма под задание... а там это ограничение)
← →
Desdechado © (2005-10-24 12:22) [10]sniknik © (24.10.05 12:01) [9]
> не говори ерунды, а то поверит
во-первых, я сказал не ерунду
во-вторых, у автора не написано ни про какие суммы
в-третьих, я про переписывания тоже ничего не говорил
в-четвертых, автор не указал, что он подразумевает под обработкой
поэтому в ХП можно написать что-нибудь вроде (извиняюсь за оракловский синтаксис):
FOR x IN( SELECT *, rowid FROM tablica ORDER BY rowid ) LOOP
-- здесь собственно обработка: подсчет, статистика и т.п.
END LOOP;
И на клиента ничего тащить не надо, и каждая запись последовательно проходит.
← →
sniknik © (2005-10-24 12:33) [11]Desdechado © (24.10.05 12:22) [10]
именно ерунда
во первых, если не имел в виду запись то так и говори, обработка в твоем понятии = только чтение.
и во вторых с оракловским синтаксисом это "мухлеж", там есть (и ты это использовал) служебное поле по которому однозначно определяется порядковый номер. (фактически служебный ключь) имею ввиду rowid, там по нему и запись возможна (так думаю). но в MSSQL такого поля нет. поэтому для примера дай другой кусок ХП без него.
← →
Nikolay M. © (2005-10-24 13:04) [12]
> попробуй сам, сделай таблицу без ключа с однородными данными
> (только поменьше данных а то напряжно) и попробуй обработать
> в ХП не в ХП неважно.
> вот чтобы не мучился выбором
> к приеру таблица из двух полей, поле1 Int поле2 тоже Int
> наполнение
Например так?CREATE TABLE #t (f1 INT, f2 INT)
DECLARE
@f1 INT,
@f2 INT,
@res INT
INSERT INTO #t
SELECT 1, 1
UNION ALL
SELECT 1, 1
UNION ALL
SELECT 1, 2
UNION ALL
SELECT 2, 2
UNION ALL
SELECT 2, 2
SELECT * FROM #t
SELECT
@res = 0
DECLARE c CURSOR
FOR SELECT f1, f2 FROM #t
FOR UPDATE
OPEN c
FETCH NEXT FROM c INTO @f1, @f2
WHILE (@@fetch_status <> -1)
BEGIN
UPDATE #t SET f2 = f1 + f2 + @res WHERE CURRENT OF c
SELECT @res = @res + @f1 + @f2
FETCH NEXT FROM c INTO @f1, @f2
END
CLOSE c
DEALLOCATE c
SELECT * FROM #t
DROP TABLE #t
← →
Desdechado © (2005-10-24 13:17) [13]2 sniknik © (24.10.05 12:33) [11]
> ты использовал служебное поле
Я его не использовал, я просто показал намек, что даже в безвыходных ситуациях что-то можно сделать. В моем примере rowid 100 лет не нужен.
> в твоем понятии = только чтение.
Я написал, что обработка бывает РАЗНАЯ. Автор же не указал, какая у него. Ты же эту фразу проигнорировал.
← →
sniknik © (2005-10-24 13:30) [14]Nikolay M. © (24.10.05 13:04) [12]
на первый взгляд похоже. осталось проверить как это пойдет на большой таблице. и можно сказать задача решена.
(не думал что без ключа CURRENT будет работать. видать у MSSQL есть всетаки внутренее поле аналогичное оракловскому/ib-шному, только не вынесено.)
ну чтож. сорри ошибался.
← →
sniknik © (2005-10-24 13:35) [15]>> в твоем понятии = только чтение.
> Я написал, что обработка бывает РАЗНАЯ. Автор же не указал, какая у него. Ты же эту фразу проигнорировал.
я не игногировал, я не видел гда ты говориш о раной оббработке. да и сейчас не вижу.
← →
Nikolay M. © (2005-10-24 13:42) [16]
> на первый взгляд похоже. осталось проверить как это пойдет
> на большой таблице
Работает, проверено. Пойдет, но медленно, т.к. используется курсор.
> не думал что без ключа CURRENT будет работать. видать у
> MSSQL есть всетаки внутренее поле аналогичное оракловскому/ib-
> шному, только не вынесено
Будет. Есть внутреннее "полу"-поле, тоже зовется rowid, только, в отличие от Оракла, в public не вынесено.
http://www.sql.ru/articles/mssql/03013101Indexes.shtml
← →
Desdechado © (2005-10-24 13:42) [17]Я думаю, что из фразы "в-четвертых, автор не указал, что он подразумевает под обработкой" очевидны оба утверждения в "Я написал, что обработка бывает РАЗНАЯ. Автор же не указал, какая у него."
Если нет, не буду разжевывать. Я предпочитаю не давать готовых решений, а только направления - это иногда заставляет думать вопрошающих. Если не заставляет, то дальнейшая работа с ними, имхо, бесперспективна.
← →
redlord (2005-10-24 21:30) [18]спасибо всем особенно Nikolay M
за пример по использованию курсоров
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.039 c