Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее? / 18 сообщений из 18, страница 1 из 1
02.06.2004, 15:08
    #32544905
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Примерчик для теста - 10000 записей за 30 секунд.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  ADOQselest := TADOQuery.Create(nil);

  ADOQselest.Connection := DataModule2.ADOConnection1;

    for i :=  1  to CountMax do
    begin
      value := i;
      ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (1, 2, 3, 4, 5)');
      ADOQselest.ExecSQL;
      ADOQselest.SQL.Clear;
    end;
...
Рейтинг: 0 / 0
02.06.2004, 15:27
    #32544956
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
А может стоит попробовать LOAD TABLE?

...
Рейтинг: 0 / 0
02.06.2004, 17:16
    #32545216
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Новичок в этих Базах, имелось в виду это?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
load. Загрузка таблицы с диска или HTTP-сервера
^table::load[имя файла] 
^table::load[имя файла;опции загрузки] 
^table::load[nameless;имя файла]
^table::load[nameless;имя файла;опции загрузки]

Конструктор создает объект, используя таблицу, определенную в некотором файле или документе на HTTP-сервере. Данные должны быть представлены в формате tab-delimited (см. table::create).

Имя файла - имя файла с путем или URL документа на HTTP-сервере.

Опции загрузки - об основных опция см. раздел «Работа с HTTP-серверами», также доступны дополнительные опции, см. «Опции формата файла».

Использование параметра nameless такое же, как и в конструкторе table::create.

Пример загрузки таблицы с диска
$loaded_table[^table::load[/addresses.cfg]]

Пример создает объект класса table, содержащий именованную таблицу, определенную в файле addresses.cfg, который находится в корневом каталоге веб-сайта.

Пример загрузки таблицы с HTTP-сервера
$table[^table::load[nameless;http://www.parser.ru/;
    $.USER-AGENT[table load example]
]]
Количество строк: ^table.count[]
<hr>
<pre>$table. 0 </pre>
Тогда пока непонятно.
Пробую вариант с хранимой процедурой, но непонятно как проще передавать в неё параметры - массив из миллиона значений. Он подготовлен в клиенте. Опять вопрос - разве передача по сети или локально в виде SELECT....., SELECT....., SELECT....., SELECT....., SELECT....., выгоднее передачи массива. В Т-SQL есть параметр массив? А указатель на массив нельзя передать если это локальные 2 процесса?
В общем мешмнина технологий. Какая быстрее?
...
Рейтинг: 0 / 0
03.06.2004, 08:28
    #32545767
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Может я не совсем правильно понял,
но предложил использовать инструкцию/команду SQL сервера ASA.
Если это разовая операция, то - это самое то.
Если нужно регулярно в процессе работы добавлять столько строк, то может стоит даже задуматься о смене СУБД...
Опишите задачу, так будет легче что-либо советовать

...
Рейтинг: 0 / 0
03.06.2004, 10:41
    #32546017
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Petro123
Извините, а Вы для какого СУБД вопрос задали ?
...
Рейтинг: 0 / 0
03.06.2004, 11:01
    #32546074
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Для данной БД вопрос задал. Но вообще я ищу БД для системы типа AutoCAD с примерно до миллиона примитивов (точки, полилинии, полигоны-регионы).
Сейчас всё пишется ручками в двоичный файл. Если, например выделить все объекты и сделать масштаб, то до миллиона объектов надо пересчитывать координаты и записыват в БД. предпологаю, что координаты одной фигуры - это массив точек - BLOB поле в БД.
...
Рейтинг: 0 / 0
03.06.2004, 11:44
    #32546206
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Тут 3 данных Sybase БД: ASA, ASE и IQ. У каждой свои возможности и характеристики. Я бы порекомендовал Вам в форум "Сравнение СУБД" кинуть сообщение, кто на каких БД реализовывал такие задачи. Во вторых советую посмотреть на Interbase - в нем реализована поддержка полей-массивов, возможно это то, что Вам нужно.
...
Рейтинг: 0 / 0
03.06.2004, 11:47
    #32546219
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
все понятно, вам нужен MySQL. Он вам и синусы с косинусами быстренько посчитает, и все такое...
Я диплом писал (векторная карта) - все объекта города хранились в примерно такой форме и нужно было быстренько масштабировать, искать, указывать... Вот только БЛОБ - не совсем хорошо, лучше сделать "один ко многим", т.е. объект - и его координаты..., дальше думаю понятно
...
Рейтинг: 0 / 0
03.06.2004, 13:13
    #32546470
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
ASCRUSТут 3 данных Sybase БД: ASA, ASE и IQ. У каждой свои возможности и характеристики. Я бы порекомендовал Вам в форум "Сравнение СУБД" кинуть сообщение, кто на каких БД реализовывал такие задачи. Во вторых советую посмотреть на Interbase - в нем реализована поддержка полей-массивов, возможно это то, что Вам нужно.
1. Да, я пробую сейчас ASA для этих целей. Поэтому интересно решение на Sybase.
2. Поля - массивы почитаю, но ещё интереснее DB2 и информих "Spatial" - хранение объектов - точка, полигон, линия... Но там никто не знает про это и молчок.

Рыжий Котвсе понятно, вам нужен MySQL. Он вам и синусы с косинусами быстренько посчитает, и все такое...
Я диплом писал (векторная карта) - все объекта города хранились в примерно такой форме и нужно было быстренько масштабировать, искать, указывать... Вот только БЛОБ - не совсем хорошо, лучше сделать "один ко многим", т.е. объект - и его координаты..., дальше думаю понятно
1. Чем My лучше ASA? И где в SQL у него косинусы?
2. Один ко многим это миллион объектов, у каждого может быть 500 000 ТОЧЕК!!!! Многовато, чтобы хранить в таблице точки (1 млн. Х 500000)
...
Рейтинг: 0 / 0
03.06.2004, 13:54
    #32546578
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Как вариант еще - подключаете к ASA Java, разрабатываете на ней соотвествующие классы (точка, полигон, линия и т.д.). На свои таблицы вешаете поля с этим типом классов. В итоге с одной стороны ООП Java позволяет полноценно описать нужный обьект, сделать нужные свойства и методы, с другой стороны ASA будет автоматом хранить такие обьекты в таблице, беря на себя всю работу по их сериализации и десериализации, но в то же время позволяя через SQL и в ХП образаться к свойствам и методам таких обьектов. Например есть класс, реализующий обьект для хранения и обработки информации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class Invoice {

  // Fields
  public String lineItem1Description;
  public double lineItem1Cost;

  public String lineItem2Description;
  public double lineItem2Cost;

  // An instance method
  public double totalSum() {
    double runningsum;
    double taxfactor =  1  + Invoice.rateOfTaxation();

    runningsum = lineItem1Cost + lineItem2Cost;
    runningsum = runningsum * taxfactor;

    return runningsum;
  }

  // A class method
  public static double rateOfTaxation() {
    double rate;
    rate = . 15 ;

    return rate;
  }
}
Теперь с этим классом в ASA можно полноценно работать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
 -- Create an instance of the Invoice class as a SQL variable 
 
CREATE VARIABLE Inv Invoice
go
SET Inv = NEW Invoice()
go

 -- Check the value of the Inv variable.
 
SELECT IFNULL(Inv,
    'No object referenced',
    'Variable not null: contains object reference')
go

 -- Set values of the Invoice members
 
SET Inv.lineItem1Description = 'Work boots'
go
SET Inv.lineItem1Cost = '79.99'
go
SET Inv.lineItem2Description = 'Hay fork'
go
SET Inv.lineItem2Cost = '37.49'
go

 -- Retrieve values of the Invoice members
 
SELECT Inv.lineItem1Description;
output to 'report.txt'
go
SELECT Inv.lineItem1Cost;
output to 'report.txt'
append
go
SELECT Inv.lineItem2Description;
output to 'report.txt'
append
go
SELECT Inv.lineItem2Cost;
output to 'report.txt'
append
go

 -- Use a member of the Invoice class as a value in a query
 
SELECT * FROM PRODUCT
WHERE unit_price < Inv.lineItem2Cost;
output to 'report.txt'
append
go

 -- Invoke a method of the Invoice class using the SQL variable
 
SELECT Inv.totalSum();
output to 'report.txt'
append
go

 -- Address the class directly, instead of through the SQL variable
 
SELECT Invoice.rateOfTaxation();
output to 'report.txt'
append
go

if ( select count(*) 
     from SYSCATALOG 
     where tname = 'T1' 
     and creator = 'DBA' ) =  1  then
  drop table t1
end if
go

CREATE TABLE T1 (
    ID int,
    JCol Invoice
)
go

INSERT INTO T1
VALUES(  1 , Inv )
go

SELECT ID, JCol.lineItem1Description
FROM T1;
output to 'report.txt'
append
go

INSERT INTO T1
VALUES (  2 , NEW Invoice() )
go

SELECT ID, JCol.totalSum()
FROM t1;
output to 'report.txt'
append
go

CREATE VARIABLE Inv2 Invoice
go
SET Inv2 = (select JCol from T1 where ID =  2 )
go
SET Inv2.lineItem1Description = 'Sweet feed'
go
SET Inv2.lineItem2Description = 'Drive belt'
go

Думаю Java в ASA идеальное решения для разных специфических вариантов хранения и обработки информации, когда обычным SQL и средствами СУБД это трудно реализовать. Вариантов применения найти можно много - от расширенных ХП проверки текстов, нейросеток, до хранения сложно формализуемых обьектов с встроенной сложной обработкой.
...
Рейтинг: 0 / 0
03.06.2004, 14:09
    #32546630
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
ASCRUS
Java

Очень интересно. Спасибо! Жалко, что с Java я не дружу. Знаю Delphi и С++ поменьше.
Не для флейма. Как обстоят дела с этими языками?
ASA почему дружит именно с Java? И расширенные хранимые процедуры на Delphi в DLL это не то? А то мне кто-то их советовал.
...
Рейтинг: 0 / 0
03.06.2004, 14:30
    #32546699
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Тут надо выяснить одну немаловажную вещь: скорость...
500 тыс. точек на объект... сколько времени это займет.
Скажем, нужно отодвинуть объект, повернуть или еще что с ним сделать.
Тут уже вопрос не в СУБД.
Знаю точно, что My очень быстро посчитает вам синус для нескольких сот тысяч точек. Я не знаю всей специфики вашей задачи. Но задав что-то вроде UPDATE temp_coords set x = SIN(x)...*radius... where idojbject = ...(формула может достаточно сложной), почти сразу получите результат.
Кстати, используя БЛОБ вы будете его парсить, тянуть на клиента, считать и т.д.? Будет медленно, проверено. Нужно чтобы все вычисления пачкой выполнялись в БД на сервере.

...
Рейтинг: 0 / 0
03.06.2004, 15:01
    #32546817
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Код: plaintext
ASA почему дружит именно с Java? И расширенные хранимые процедуры на Delphi в DLL это не то? А то мне кто-то их советовал.
ASA дружит именно с Java из за того, что обе являются кроссплатформенными и в области реализации чистых обьектов без всяких GUI и наворотов Java является довольно высокоскоростным и удобным средством с большим базовым набором готовых решений на все случаи жизни. Расширенные хранимые процедуры для ASA конечно же можно писать и на Си, но тут вся прелесть Java именно в способности хранения ее обьектов в таблицах. В таком случае мы с одной стороны на Java делаем полноценный обьект с массивом-свойством набор точек и реализацией того же метода маштабирования, который изменяет координаты точек обьекта в его массиве. С другой стороны мы не заботимся о хранении таких обьектов - ASA это берет на себя. С третьей стороны мы получаем возможность обработки множества таких обьектов посредством стандартного SQL. Например, если в обьекте реализована функция, которая определяет на заданную координату точки ее вхождение в фигуру, то мы элементарным запросом можем выбрать все обьекты, в которые входит заданная нами точка. И так далее ... насколько хватает фантазии и насколько для этого существует необходимость.

Код: plaintext
Жалко, что с Java я не дружу. Знаю Delphi и С++ поменьше.
С Delphi на Java перескакивается на ура. Семантика языка у нее строгая, все хорошо продуманно, особых сложностей при переходе не возникает. Я бы даже сказал наоборот - Сишникам гораздо сложнее на нее перейти из за его нестрогости, чем дельфийцам с своим любимым более строгим Object Pascal. При чем если взять Borland JBuilder, то он еще больше облегчает изучение Java хотя бы привычной для дельфийцев средой IDE. Кстати в области графики Java гораздо выгоднее Delphi и под нее огромное кол-во решений, библиотек и компонент для 2D и 3D графики. Достаточно зайти в интернет и покопать :)
...
Рейтинг: 0 / 0
03.06.2004, 16:49
    #32547185
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Единственное но!
При перемещении части кода/бизнес правил на Java или другом языке в сторону БД мы тем самым больше привязываемся к этой самой БД.
Альтернатива может быть в 3х звенке? Но возможно "тяжелее будет перекачивать" данные между сервером приложений (где будут эти самые классы) и РСУБД.
IMHO.
...
Рейтинг: 0 / 0
03.06.2004, 17:38
    #32547334
Ggg(old)
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
2Petro123
При вставке большого объема данных в независимочти от СУБД, если варинт с LOAD TABLE не подходит, то можно делать так:
Убить индексы на таблицу
Закачивать данные в цикле не по одной записи, а одним батчем на несколько строчек. Приблизительно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for i := 1 to CountMax do
    begin
      value := i;
ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (1, 2, 3, 4, 5)');
ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (1, 2, 3, 4, 5)');
...
ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (1, 2, 3, 4, 5)');
      ADOQselest.ExecSQL;
      ADOQselest.SQL.Clear;
    end;
Кол-во строк в одном батче определяем экспериментально. Скорость закачки поднимется ЗАМЕТНО!!!
...
Рейтинг: 0 / 0
03.06.2004, 18:14
    #32547402
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Спасибо! Сработало, а то у меня один раз вылетело сообщение что что-то в синтаксисе не то "нет точки с запятой" и я не пробовал.
Еще помогло

Код: plaintext
1.
2.
3.
4.
5.
       ADOQselest.Connection := DataModule2.ADOConnection1;
        DataModule2.ADOConnection1.BeginTrans; !!!!!!!!!
        ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (11, 2, 3, 4, 5)');
        ADOQselest.SQL.Add('INSERT INTO tabl_name (numid, Xmin, Ymin, Xmax, Ymax) VALUES (11, 2, 3, 4, 5)');
        ADOQselest.ExecSQL;
        DataModule2.ADOConnection1.CommitTrans;!!!!!!!!!!!!!!

Ещё бы узнать специфику для SQL MS 2000 Server.

К сожалению доступ к форуму будет только в понедельник :( Пока.
...
Рейтинг: 0 / 0
03.06.2004, 18:30
    #32547442
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
И все таки мне кажется легче эти точки выгружать в файл и подгружать его оператором LOAD TABLE, чем генерить в цикле операторы вставки. Скорость явно будет быстрее.
...
Рейтинг: 0 / 0
03.06.2004, 20:42
    #32547571
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
Вы извините, но боюсь именно с этим вопросом Вы не туда направились. Здесь лично я не советовал бы городить огород, а действительно воспользоваться Spatial картриджем оракла или DB2 (что тут народ уже советовал).

Лично мое небольшое знакомство со Spatial показало, что в нем есть уже сделанные и проверенные примитивы и все необходимые функции (вплоть до определения пересечения, наложения и прочих операций с группами объектов), причем с хорошей скоростью. На этих картриджах работают многие ГИСы,а они содержат немало объектов, можете сами убедится. Посему не вижу причины городить огород на яве или чем еще.

К моему огромному огорчению такое расширение отсутствует у сайбеса. А было бы весьма полезно иметь.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]