powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
18 сообщений из 18, страница 1 из 1
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32544905
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерчик для теста - 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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32544956
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может стоит попробовать LOAD TABLE?

...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32545216
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок в этих Базах, имелось в виду это?
Код: 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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32545767
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не совсем правильно понял,
но предложил использовать инструкцию/команду SQL сервера ASA.
Если это разовая операция, то - это самое то.
Если нужно регулярно в процессе работы добавлять столько строк, то может стоит даже задуматься о смене СУБД...
Опишите задачу, так будет легче что-либо советовать

...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546017
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123
Извините, а Вы для какого СУБД вопрос задали ?
...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546074
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для данной БД вопрос задал. Но вообще я ищу БД для системы типа AutoCAD с примерно до миллиона примитивов (точки, полилинии, полигоны-регионы).
Сейчас всё пишется ручками в двоичный файл. Если, например выделить все объекты и сделать масштаб, то до миллиона объектов надо пересчитывать координаты и записыват в БД. предпологаю, что координаты одной фигуры - это массив точек - BLOB поле в БД.
...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546206
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут 3 данных Sybase БД: ASA, ASE и IQ. У каждой свои возможности и характеристики. Я бы порекомендовал Вам в форум "Сравнение СУБД" кинуть сообщение, кто на каких БД реализовывал такие задачи. Во вторых советую посмотреть на Interbase - в нем реализована поддержка полей-массивов, возможно это то, что Вам нужно.
...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546219
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все понятно, вам нужен MySQL. Он вам и синусы с косинусами быстренько посчитает, и все такое...
Я диплом писал (векторная карта) - все объекта города хранились в примерно такой форме и нужно было быстренько масштабировать, искать, указывать... Вот только БЛОБ - не совсем хорошо, лучше сделать "один ко многим", т.е. объект - и его координаты..., дальше думаю понятно
...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546470
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546578
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант еще - подключаете к 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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546630
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Java

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

...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32546817
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32547185
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное но!
При перемещении части кода/бизнес правил на Java или другом языке в сторону БД мы тем самым больше привязываемся к этой самой БД.
Альтернатива может быть в 3х звенке? Но возможно "тяжелее будет перекачивать" данные между сервером приложений (где будут эти самые классы) и РСУБД.
IMHO.
...
Рейтинг: 0 / 0
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32547334
Ggg(old)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вставить пачку (1 млн.) записей из оперативки (массив) бысрее?
    #32547402
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Сработало, а то у меня один раз вылетело сообщение что что-то в синтаксисе не то "нет точки с запятой" и я не пробовал.
Еще помогло

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

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

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


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