Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.047 c
2-1132841801
Igor_thief
2005-11-24 17:16
2005.12.11
Почему не работает практически идентичный код?


2-1132942763
дурачок
2005-11-25 21:19
2005.12.11
MP3


2-1132769705
Plotnick
2005-11-23 21:15
2005.12.11
FormatFloat


14-1132557356
Ega23
2005-11-21 10:15
2005.12.11
StarCraft еры, отзовитесь!


14-1132149687
Red_imp
2005-11-16 17:01
2005.12.11
Прикольная задачка но может быть и была она тут тогда извините