Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

последовательная обработка данных   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.035 c
6-1125054010
Dr.Nemo
2005-08-26 15:00
2005.12.11
Скачка файла с интернета


1-1131697645
rusgl
2005-11-11 11:27
2005.12.11
Excel, Как изменить чего-то в комментариях к ячейке?


2-1132850358
Бандерас
2005-11-24 19:39
2005.12.11
Как завершить обращение к приложению?


2-1132495765
Дева
2005-11-20 17:09
2005.12.11
наследование?


5-1116730644
Cloude
2005-05-22 06:57
2005.12.11
DefineProperties





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский