Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 20 21 22 23 24 [25] 26 27 28 29 .. 34   вперед  Ctrl
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Dimonische
Member

Откуда:
Сообщений: 137
Увидел количество различных count, и жизнь показалась не мила. Вот что такое серьезная теоретическая подготовка :)

Относительно того что я использовал:

count(a.b.c) - a.b.c - возвращяет массив (коллекцию) объектов, поэтому тут это количество объектов

sum(a.b.c) - возвращает коллецию объектов типа Integer, поэтому к ним применима операция суммирования.

Относительно других возможных count, просто не знаю. Не достаточно подкован по этому поводу. Лезть же в спеки Versantа считаю идиотизмом, если сам не пробовал.

Возможно, Алексею будет не лениво добавить у его приложению все варианты count.

Вообще, мне нравится ваш подход. Если вы знаете хоть чуть чуть Яву, то скачав Versant VDS и посмотрев, вы сможете давать ответы намного толковее чем мы )
28 мар 05, 16:30    [1420381]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Dimonische
Member

Откуда:
Сообщений: 137
Предыдущий пост относится к Павлу Воронцову
28 мар 05, 16:31    [1420387]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Dimonische

Не могли бы Вы ответить на следующие вопросы. В частности на вопрос 3 относительно count(). На вопрос 2 Вы уже ответили.

c127
2 Dimonische

Очень интересно, похоже наконец-то пошел предметный разговор. Имеет место несколько вопросов.

Вопрос 1:
Сколько все-таки дилаектов СКЛ-подобных языков запросов у версанта? Нам раньше говорили только об OQL, теперь появисля VQL.

Ворпос 2:
>select r from Race r, r.sold s where s.date between '2003.01.01' and '2003.01.31'
and r.shedul.fly.name != 'TU 154' and sum(r.shedul.fly.place.cnt) between 10 and 20

А как тут сумма считается? По какому множеству? Аналаогично, как в запросе 3 считается count?

Вопрос 3:
>select r1, r2 from Race r1, Race r2 where count(r1.sold.fio) - count(r1.sold.fio - r2.sold.fio) >10

Что такое "r1.sold.fio - r2.sold.fio"? Это разность множеств?

Вопрос 4:
>Что такое f.shedul - т.к. в объекте типа Fly нет поля с именем shedul, значит это имя класса который на нас ссылается - т.е тот самый Shedul:

А если бы в объекте типа Fly случайно было постороннее поле с именем shedul, не имеющее отношения к задаче, как бы Вы выполнили это связывание?

Вопрос 5:
Как это связывание работает в случае много Shedul - один Fly? Возвращает ли оно множество?

Вопрос 6:
Есть ли способ посмотреть подробнее как версант выполняет связки типа f.shedul? И вообще посмотреть подробнее как он выполняет селекты? Что-то типа планов запросов?
29 мар 05, 01:47    [1421490]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Ответ на вопрос о диалектах языков запросов Versant.

В ООСУБД Versant языки запросов основываются на некотором подмножестве языка OQL (это касается и VDS и FastObjects). В VDS указанное подмножество расширено рядом конструкций, которые в OQL не предусмотрены. Поэтому язык запросов VDS получил название Versant Query Language (VQL). По сути VQL - это более полное подмножество SQL, чем предусмотренный стандартами ODMG язык OQL.
29 мар 05, 10:27    [1421973]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Dimonische
Member

Откуда:
Сообщений: 137
c127


Вопрос 1:
Сколько все-таки дилаектов СКЛ-подобных языков запросов у версанта? Нам раньше говорили только об OQL, теперь появисля VQL.


Alexey Rovdo

В ООСУБД Versant языки запросов основываются на некотором подмножестве языка OQL (это касается и VDS и FastObjects). В VDS указанное подмножество расширено рядом конструкций, которые в OQL не предусмотрены. Поэтому язык запросов VDS получил название Versant Query Language (VQL). По сути VQL - это более полное подмножество SQL, чем предусмотренный стандартами ODMG язык OQL.


Насколько я знаю, их три
1. JDO QL - тот на котором я пишу примеры через Versant Open Access
2. VQL - на котором пишет примеры serg99
3. OQL - на нем можно писать черезь интерфейс ODMG

По видимому, нативный язык - VQL, остальные транслируются в него.

c127


Вопрос 3:
>select r1, r2 from Race r1, Race r2 where count(r1.sold.fio) - count(r1.sold.fio - r2.sold.fio) >10

Что такое "r1.sold.fio - r2.sold.fio"? Это разность множеств?


Да, разность множеств, в данном случае разность коллекций типа String

c127


Вопрос 5:
Как это связывание работает в случае много Shedul - один Fly? Возвращает ли оно множество?


В каких случаях это важно? Насколько я могу понять, если вы навигируетесь по связи 1-1 - shedul.fly в селекте "select s from Shedul where s.fly.name = 'any name'" будет работать как фильтр по одному name. Если shedul.fly - 1-*, то выберутся shedul, у которого как минимум один Fly имеет name = 'any name'

c127

Вопрос 6:
Есть ли способ посмотреть подробнее как версант выполняет связки типа f.shedul? И вообще посмотреть подробнее как он выполняет селекты? Что-то типа планов запросов?


Насколько я знаю, в Versante есть некий графический (или псевдографический) показ плана. К сожалению, т.к. как я не DBA, сравнить его с Оракловым не смогу. Однозначно менее мощный. Вопрос насколько - в 10 раз или на 10 процентов.
29 мар 05, 10:54    [1422146]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
>В каких случаях это важно?

Вот, например: r1.sold.fio - r2.sold.fio

Но я понял идею по-моему. Это эквивалентно чему-то типа

...
select fio from sold s where s.race=r1.id
except
select fio from sold s where s.race=r2.id

Получается есть 2 способа получить множество дочерних объектов: через точку и через селект. Это верно?

>Насколько я знаю, в Versante есть некий графический (или псевдографический) показ плана. К сожалению, т.к. как я не DBA, сравнить его с Оракловым не смогу. Однозначно менее мощный. Вопрос насколько - в 10 раз или на 10 процентов.

Сравнивать не нужно, был важен сам факт.

Остается

Вопрос 4:
>Что такое f.shedul - т.к. в объекте типа Fly нет поля с именем shedul, значит это имя класса который на нас ссылается - т.е тот самый Shedul:

А если бы в объекте типа Fly случайно было постороннее поле с именем shedul, не имеющее отношения к задаче, как бы Вы выполнили это связывание?
30 мар 05, 05:25    [1424980]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Dimonische

Еще забыл спросить, в выражениях типа "r1.sold.fio - r2.sold.fio" есть ли способ указать что-то типа all или distinct?
30 мар 05, 05:28    [1424981]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
BaZa
Guest
Alexey Rovdo
Ответ на вопрос о диалектах языков запросов Versant.

В ООСУБД Versant языки запросов основываются на некотором подмножестве языка OQL (это касается и VDS и FastObjects). В VDS указанное подмножество расширено рядом конструкций, которые в OQL не предусмотрены. Поэтому язык запросов VDS получил название Versant Query Language (VQL). По сути VQL - это более полное подмножество SQL, чем предусмотренный стандартами ODMG язык OQL.


Однако, VQL не поддерживает:

• an attribute reference in an intermediate node of a path expression, either in a projection list or in a where clause
• functional query language support
• multi-class access (joins) (не через навигацию)
• запросы по коллекциям
• навешивание квантора общности или существования
• вызов методов или функций
• named объекты
• string выражения
• order by, group by, having, distinct, aggregate, union, intersection
30 мар 05, 12:29    [1425957]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Dimonische
Member

Откуда:
Сообщений: 137
BaZa

Однако, VQL не поддерживает:

• an attribute reference in an intermediate node of a path expression, either in a projection list or in a where clause


что это?
BaZa

• functional query language support


что это?

BaZa

• multi-class access (joins) (не через навигацию)


что это?

BaZa

• запросы по коллекциям


поддерживает

BaZa

• навешивание квантора общности или существования


что это?

BaZa

• вызов методов или функций


их там нет А еще не поддерживает SQL хп. Потому что их тоже нет и нах не надо.

BaZa

• named объекты


что это?

BaZa

• string выражения


что это?

BaZa

• order by, group by, having, distinct, aggregate, union, intersection


order by, group by, having поддерживает, просто потому что JDO спецификация это требует.
Относительно остального не использовал, не знаю.
30 мар 05, 12:42    [1426024]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
BaZa
Guest
Прощу прощения, надо не так:
VQL не поддерживает

А так:
The VQL SELECT statement does not support
далее по тексту

Насчет JDO не совсем понял: если работать с VDS через JDO, тогда да, но VQL к JDO никакого отношения ВООБЩЕ не имеет - в JDO своя тема JDOQL.
30 мар 05, 13:16    [1426199]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
BaZa

Насчет JDO не совсем понял: если работать с VDS через JDO, тогда да, но VQL к JDO никакого отношения ВООБЩЕ не имеет - в JDO своя тема JDOQL.


Это насчет замечания Dimonishe:
По видимому, нативный язык - VQL, остальные транслируются в него.

В действительности все транслируется в вызовы CИ-сишных процедур (которые лежат в dll на стороне клиента). А запросы поступают на сервер уже через проприетарные протоколы Versant. VQL - это просто еще один интерфейс к ядру обработки запросов.
30 мар 05, 13:42    [1426360]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Тем временем я на досуге проводил небольшой сравнительный анализ для тестовой задачи на Oracle и на FastObjects. По просьбе tygra, который требовал примеров по сохранению больших объемов данных в соседней ветке, я выкладываю здесь частичные результаты своей работы (в части ввода большого объема данных в БД).

Вот модель, которую я использовал на Oracle.


CREATE TABLE Person (
       id                   NUMBER(9) NOT NULL,
       first_name           VARCHAR2(255) NULL,
       last_name            VARCHAR2(255) NULL,
       PRIMARY KEY (id)
);


CREATE TABLE Crafttype (
       id                   NUMBER(9) NOT NULL,
       description          VARCHAR2(255) NULL,
       PRIMARY KEY (id)
);


CREATE TABLE Seat (
       id                   NUMBER(9) NOT NULL,
       seat_level           NUMBER(9) NULL,
       crafttype_id         NUMBER(9) NOT NULL,
       seat_number          NUMBER(9) NULL,
       PRIMARY KEY (id), 
       FOREIGN KEY (crafttype_id)
                             REFERENCES Crafttype
);

CREATE INDEX XIF1Seat ON Seat
(
       crafttype_id                   ASC
);

CREATE INDEX Seat_seat_level ON Seat
(
       seat_level                     ASC
);


CREATE TABLE City (
       id                   NUMBER(9) NOT NULL,
       name                 VARCHAR2(255) NOT NULL,
       PRIMARY KEY (id)
);

CREATE UNIQUE INDEX CITY_NAME ON City
(
       name                           ASC
);


CREATE TABLE Flight (
       id                   NUMBER(9) NOT NULL,
       description          VARCHAR2(255) NULL,
       crafttype_id         NUMBER(9) NOT NULL,
       startpoint_id        NUMBER(9) NOT NULL,
       endpoint_id          NUMBER(9) NOT NULL,
       PRIMARY KEY (id), 
       FOREIGN KEY (endpoint_id)
                             REFERENCES City, 
       FOREIGN KEY (startpoint_id)
                             REFERENCES City, 
       FOREIGN KEY (crafttype_id)
                             REFERENCES Crafttype
);

CREATE INDEX XIF1Flight ON Flight
(
       crafttype_id                   ASC
);

CREATE INDEX XIF2Flight ON Flight
(
       startpoint_id                  ASC
);

CREATE INDEX XIF3Flight ON Flight
(
       endpoint_id                    ASC
);


CREATE TABLE Item (
       id                   NUMBER(9) NOT NULL,
       day                  VARCHAR2(20) NULL,
       flight_id            NUMBER(9) NOT NULL,
       PRIMARY KEY (id), 
       FOREIGN KEY (flight_id)
                             REFERENCES Flight
);

CREATE INDEX XIF1Item ON Item
(
       flight_id                      ASC
);

CREATE INDEX Item_day ON Item
(
       day                            ASC
);


CREATE TABLE Ticket (
       id                   NUMBER(9) NOT NULL,
       cost                 NUMBER(24,4) NULL,
       person_id            NUMBER(9) NULL,
       item_id              NUMBER(9) NOT NULL,
       seat_id              NUMBER(9) NOT NULL,
       PRIMARY KEY (id), 
       FOREIGN KEY (seat_id)
                             REFERENCES Seat, 
       FOREIGN KEY (person_id)
                             REFERENCES Person, 
       FOREIGN KEY (item_id)
                             REFERENCES Item
);

CREATE INDEX XIF1Ticket ON Ticket
(
       item_id                        ASC
);

CREATE INDEX XIF2Ticket ON Ticket
(
       person_id                      ASC
);

CREATE INDEX XIF3Ticket ON Ticket
(
       seat_id                        ASC
);


И первый же вопрос, который мне пришлось решать, - заполнение базы тестовыми данными. Причем хотелось, с одной стороны, сделать эти данные более-менее случайными (как-то кол-во проданных билетов), а с другой - максимально идентичными для FO и для Oracle, чтобы гарантировать одинаковые условия при сравнении скорости поиска.

Все бы ничего, но мне хочется проводить тестирование на очень больших объемах данных, и я столкнулся с проблемой. Вот код, который я использовал для заполнения БД Oracle.

import com.borland.dx.sql.dataset.*;
import java.math.*;
import java.util.*;

public class Avia_oracle {
  public static void main( String[] args ) {
    Database db1 = new Database();
    db1.addDriver("oracle.jdbc.OracleDriver");
    db1.setConnection (new ConnectionDescriptor("jdbc:oracle:oci8:@aviatest", "test", "test"));
    db1.openConnection();


    //  Массированный ввод данных
    GregorianCalendar c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Start dataflow ...");
    System.out.println();


    // Города
    QueryDataSet qds =  new QueryDataSet();
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, name FROM City"));
    qds.open();
    qds.last();

    int i = 0;
    while (++i <= 200 ) {
      qds.addRow(new com.borland.dx.dataset.DataRow(qds));
      qds.next();
      qds.setBigDecimal("ID", new BigDecimal(i));
      qds.setString("NAME", "City"+Integer.toString(i));
    }
    qds.saveChanges();
    qds.close();
    c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Cities: " + Integer.toString(i-1));
    System.out.println();


    // Типы самолетов и месита в них
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, description FROM Crafttype"));
    qds.open();
    qds.last();

    QueryDataSet qds2 = new QueryDataSet();
    qds2.setQuery(new QueryDescriptor(db1, "SELECT id, crafttype_id, seat_level, seat_number FROM Seat"));
    qds2.open();
    qds2.last();

    Random d1 = new Random(500);
    int j;

    i = 0;
    while (++i <= 50 ) {
      qds.addRow(new com.borland.dx.dataset.DataRow(qds));
      qds.next();
      qds.setBigDecimal("ID", new BigDecimal(i));
      qds.setString("description", "Crafttype"+Integer.toString(i));
      qds.saveChanges();

      // Места в самолетах
      j = 0;
      int s1 = 30 + d1.nextInt(200);
      int s2 = 100 + d1.nextInt(100);
      while (++j <= s1+s2 ) {
        qds2.addRow(new com.borland.dx.dataset.DataRow(qds2));
        qds2.next();
        qds2.setBigDecimal("ID", new BigDecimal(qds2.rowCount()));
        qds2.setBigDecimal("crafttype_id", new BigDecimal(i));
        qds2.setBigDecimal("seat_level", new BigDecimal(j > s1 ? 2 : 1));
        qds2.setBigDecimal("seat_number", new BigDecimal(j));
      }
    }
    qds2.saveChanges();
    c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Crafttypes: " + Integer.toString(i-1));
    System.out.println("Seats: " + Integer.toString(qds2.rowCount()));
    System.out.println();
    qds.close();
    qds2.close();


    // Рейсы
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, description, crafttype_id, startpoint_id, endpoint_id FROM Flight"));
    qds2.setQuery(new QueryDescriptor(db1, "SELECT id, name FROM City")); qds2.setReadOnly(true);
    qds.open();
    qds2.open();

    i = 0;
    String descr;
    while (++i <= 2000 ) {
      qds.addRow(new com.borland.dx.dataset.DataRow(qds));
      qds.next();
      qds.setBigDecimal("ID", new BigDecimal(i));
      qds.setBigDecimal("crafttype_id", new BigDecimal(d1.nextInt(49)+1));
      j = d1.nextInt(199);
      qds2.goToRow(j);
      qds.setBigDecimal("startpoint_id", qds2.getBigDecimal("id"));
      descr = qds2.getString("name");
      while (j == qds2.row()) {qds2.goToRow(d1.nextInt(199));}
      qds.setBigDecimal("endpoint_id", qds2.getBigDecimal("id"));
      descr = descr + "-" + qds2.getString("name");
      qds.setString("description", descr);
    }
    qds.saveChanges();
    qds.close();
    qds2.close();
    c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Flights: " + Integer.toString(i-1));
    System.out.println();

    // Персоны
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, first_name, last_name FROM Person WHERE id = 1"));
    qds.open();
    qds.last();

    i = 0;
    while (++i <= 2000000 ) {
      qds.addRow(new com.borland.dx.dataset.DataRow(qds));
      qds.last();
      qds.setBigDecimal("ID", new BigDecimal(i));
      qds.setString("first_name", "Name"+Integer.toString(i));
      qds.setString("last_name", "LastName"+Integer.toString(i));
      while (qds.rowCount() > 10000) {qds.saveChanges(); qds.refresh();}
    }
    qds.saveChanges();
    qds.close();
    c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Persons: " + Integer.toString(i-1));
    System.out.println();

    // Расписание и билеты
    d1 = new Random(500);
    QueryDataSet qds3 = new QueryDataSet();
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, flight_id, day FROM Item WHERE id=1"));
    qds2.setQuery(new QueryDescriptor(db1, "SELECT id, item_id, seat_id, person_id, cost FROM Ticket WHERE id = 1"));
    qds3.setQuery(new QueryDescriptor(db1, "SELECT Flight.id, MAX(Seat.id) seat_id_end, MIN(Seat.id) seat_id_start FROM Seat INNER JOIN Flight ON Flight.crafttype_id = Seat.crafttype_id GROUP BY Flight.id ORDER BY Flight.id"));
    qds2.setReadOnly(false);
    qds3.setReadOnly(true);
    qds.open(); qds.last();
    qds2.open(); qds2.last();
    qds3.open();

    GregorianCalendar curr_day = new GregorianCalendar(2004, 10, 30);
    GregorianCalendar end_day = new GregorianCalendar(2005, 0, 2);
    i = 1; // счетчик рейсов (элементов расписания)
    int k, l;
    l = 1; // счетчик билетов (броней)
    while (!(curr_day.equals(end_day))) {
      j = 0;
      while (++j <= 2000) {
        qds.addRow(new com.borland.dx.dataset.DataRow(qds));
        qds.next();
        qds.setBigDecimal("ID", new BigDecimal(i));
        qds.setBigDecimal("flight_id", new BigDecimal(j));
        qds.setString("day", Integer.toString(curr_day.get(Calendar.DAY_OF_MONTH)) + "." +
                             Integer.toString(curr_day.get(Calendar.MONTH)+1) + "." +
                             Integer.toString(curr_day.get(Calendar.YEAR)));
        qds.saveChanges();

        // Билеты
        qds3.goToRow(j-1);
        k = (qds3.getBigDecimal("seat_id_start")).intValue();
        while (k <= (qds3.getBigDecimal("seat_id_end")).intValue()) {
          if (!(d1.nextBoolean() & d1.nextBoolean())) {
            qds2.addRow(new com.borland.dx.dataset.DataRow(qds2));
            qds2.next();
            qds2.setBigDecimal("ID", new BigDecimal(l));
            qds2.setBigDecimal("seat_id", new BigDecimal(k));
            qds2.setBigDecimal("item_id", new BigDecimal(i));
            qds2.setBigDecimal("person_id", new BigDecimal(d1.nextInt(1999999)+1));
            if (!(d1.nextBoolean() & d1.nextBoolean() & d1.nextBoolean())) {
              qds2.setBigDecimal("cost", new BigDecimal(d1.nextInt(500)));
            }
            else {qds2.setBigDecimal("cost", new BigDecimal(0));}
            l++;
          }
          k++;
        }
        qds2.saveChanges();
        qds2.refresh(); qds2.last();

        i++;
        if (d1.nextBoolean()) {j--;}
      }
      qds.refresh(); qds.last();
      curr_day.add(Calendar.DAY_OF_MONTH, 1);
    }
    qds.close();
    qds2.close();
    qds3.close();
    c1 = new GregorianCalendar();
    System.out.println(c1.getTime().toString());
    System.out.println("Items: " + Integer.toString(i-1));
    System.out.println("Tickets: " + Integer.toString(l-1));


    db1.closeConnection();
  }
}


Это Java-исходник (работаю с JBuilder). Как из него видно, я не стал сразу заморачиваться с написание SQL-запросов, а воспользовался возможностями библиотеки com.borland.dx.sql.dataset. Но возникла проблема - очень долгая отработка этого кода (около недели на моем Pentim 4, 512, Щкфсду 9i). А ведь мне хотелось бы и увеличить объем тестовых данных. Я пытался решить проблему настройками Oracle, но мне не удалось увеличить скороть сколь либо существенно. Честно говоря, подозреваю, что здесь я уперся именно в быстродействие Oracle. Я пытался переписать код в стиле:

import java.math.*;
import java.util.*;
import java.sql.*;
import java.io.*;

public class Avia_oracle2 {
  public static void main( String[] args ) 
     throws SQLException, IOException
     {
       DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
       Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@aviatest", "test", "test");
       conn.setAutoCommit(false);
   
       //  Массированный ввод данных
       GregorianCalendar c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Start dataflow ...");
       System.out.println();
   
       // Города
       Statement stmt = conn.createStatement();
       int i = 0;
       while (++i <= 200) {
         String qry1 = "INSERT INTO City (id, name) VALUES(" + Integer.toString(i) +
             ", 'City" + Integer.toString(i) + "')"; 
         stmt.executeQuery(qry1);
       }
       conn.commit();
       stmt.close();
       c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Cities: " + Integer.toString(i - 1));
       System.out.println();
   
       // Типы самолетов и месита в них
       stmt = conn.createStatement();
       Random d1 = new Random(500);
       int j, k = 0;
       i = 0;
       while (++i <= 50) {
         String qry1 = "INSERT INTO Crafttype (id, description) VALUES(" + Integer.toString(i) +
             ", 'Crafttype" + Integer.toString(i) + "')"; 
         stmt.executeQuery(qry1);
   
         // Места в самолетах
         j = 0;
         int s1 = 30 + d1.nextInt(200);
         int s2 = 100 + d1.nextInt(100);
         while (++j <= s1 + s2) {
           String qry2 = "INSERT INTO Seat (id, crafttype_id, seat_level, seat_number) VALUES(" + 
               Integer.toString(++k) + ", " + Integer.toString(i) + ", " +  Integer.toString(j > s1 ? 2 : 1) +
               ", " + Integer.toString(j) + ")"; 
           stmt.executeQuery(qry2);
         }
       }
       conn.commit();
       stmt.close();
       c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Crafttypes: " + Integer.toString(i - 1));
       System.out.println("Seats: " + Integer.toString(k));
       System.out.println();
   
       // Рейсы
       stmt = conn.createStatement();
       i = 0;
       String descr;
       while (++i <= 2000) {
         int j1 = d1.nextInt(49) + 1; int j2 = d1.nextInt(199) + 1; int j3 = d1.nextInt(199) + 1;
         while (j2 == j3) {
           j3 = d1.nextInt(199);
         }
         String qry1 = "INSERT INTO Flight SELECT " + 
             Integer.toString(i) + " id, (City1.name || '-' || City2.name) description, " + 
             Integer.toString(j1) + " crafttype_id, " + 
             Integer.toString(j2) + " startpoint_id, " + Integer.toString(j3) + " endpoint_id" +
             " FROM City City1 JOIN City City2 ON City2.id = " +
             Integer.toString(j3) + " WHERE City1.id = " + Integer.toString(j2); 
         stmt.executeQuery(qry1);
       }
       conn.commit();
       stmt.close();
       c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Flights: " + Integer.toString(i - 1));
       System.out.println();
   
       // Персоны
       stmt = conn.createStatement();
       i = 0;
       while (++i <= 2000000) {
         String qry1 = "INSERT INTO Person (id, first_name, last_name) VALUES(" + 
             Integer.toString(i) + ", 'Name" + Integer.toString(i) + "', 'LastName" + Integer.toString(i) + "')"; 
         stmt.executeQuery(qry1);
       }
       conn.commit();
       stmt.close();
       c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Persons: " + Integer.toString(i - 1));
       System.out.println();
       
   
       // Расписание и билеты
       stmt = conn.createStatement();
       d1 = new Random(500);
       GregorianCalendar curr_day = new GregorianCalendar(2004, 10, 30);
       GregorianCalendar end_day = new GregorianCalendar(2005, 0, 2);
       i = 1; // счетчик рейсов (элементов расписания)
       int l = 1; // счетчик билетов (броней)
       while (! (curr_day.equals(end_day))) {
         j = 0;
         while (++j <= 2000) {
           String qry1 = "INSERT INTO Item (id, flight_id, day) VALUES(" + 
               Integer.toString(i) + ", '" + Integer.toString(j) + 
               Integer.toString(curr_day.get(Calendar.DAY_OF_MONTH)) + "." +
               Integer.toString(curr_day.get(Calendar.MONTH) + 1) + "." +
               Integer.toString(curr_day.get(Calendar.YEAR)) + "')";
   
           // Билеты
           String qry_rs = "SELECT MIN(Seat.id) seat_id_start, MAX(Seat.id) seat_id_end " +
             "FROM Seat INNER JOIN Flight ON Flight.crafttype_id = Seat.crafttype_id " +
             "WHERE Flight.id = " + Integer.toString(j) + "GROUP BY Flight.id";
         ResultSet rs = stmt.executeQuery(qry_rs);
           k = (rs.getBigDecimal("seat_id_start")).intValue();
           while (k <= (rs.getBigDecimal("seat_id_end")).intValue()) {
             if (! (d1.nextBoolean() & d1.nextBoolean())) {
               int j1 = d1.nextInt(1999999), j2 = 0;
               if (! (d1.nextBoolean() & d1.nextBoolean() & d1.nextBoolean())) {
                 j2 = d1.nextInt(500);
               }

               String qry2 = "INSERT INTO Ticket (id, seat_id, item_id, person_id, cost) VALUES(" + 
                   Integer.toString(l) + ", " + Integer.toString(k) + ", " + 
                   Integer.toString(i) + ", " + Integer.toString(j1) + ", " + Integer.toString(j2) + ")"; 
               stmt.executeQuery(qry1);

               l++;
             }
             k++;
           }
           conn.commit();
           i++;
           if (d1.nextBoolean()) {
             j--;
           }
         }
         conn.commit();
         curr_day.add(Calendar.DAY_OF_MONTH, 1);
       }
       conn.commit();
       stmt.close();
       conn.close();
       c1 = new GregorianCalendar();
       System.out.println(c1.getTime().toString());
       System.out.println("Items: " + Integer.toString(i - 1));
       System.out.println("Tickets: " + Integer.toString(l - 1));
     }
}

Но в таком виде он по скорости вроде не выигрывает по сравнению с предыдущим. Я, разумеется, понимаю, что можно переместить многие задачи в хранимые процедуры и увеличить скорость таким образом процентов на 20-30. Но меня волнует вопрос, нельзя ли увеличить скорость более существенно?

Я преднамеренно не привожу здесь информацию по FastObjects. Во-первых, я еще не закончил тестирования и эта информация достаточно сырая. Во-вторых, мне бы нехотелось делать скоропалительные выводы, поскольку мои данные могут опираться на ошибочную конфигурацию. Давайте разберемся сначала с Oracle, а именно найдем оптимальное решение по заполнению тестовой базы тестовыми данными. Я также буду рад, если кто-то представит конкретные цифры быстродействия указанной задачи именно на Oracle.

Я использовал разные настройки в Oracle, но для простоты будем считать, что у меня сейчас все установлено как по-умолчанию после инсталляции БД для DataWarehouse.

Для удобства. Привожу также пример командного файла для запуска приложения:

cd classes
SET CP=%CLASSPATH%;C:\Progra~1\JBuilderX\lib\dx.jar;C:\Progra~1\JBuilderX\lib\beandt.jar
SET CP=%CP%;C:\oracle\ora92\jdbc\lib\ojdbc14.jar
java -cp %CP% Avia_oracle
echo off
pause

Хотелось бы реальных предложений, а не пустых комментариев.

С уважением, Алексей Ровдо

К сообщению приложен файл (Avia_ORACLE.rar - 32Kb) cкачать
8 апр 05, 17:26    [1453425]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
а зачем вообще было использовать Яву? например заливка городов:
    QueryDataSet qds =  new QueryDataSet();
    qds.setQuery(new QueryDescriptor(db1, "SELECT id, name FROM City"));
    qds.open();
    qds.last();

    int i = 0;
    while (++i <= 200 ) {
      qds.addRow(new com.borland.dx.dataset.DataRow(qds));
      qds.next();
      qds.setBigDecimal("ID", new BigDecimal(i));
      qds.setString("NAME", "City"+Integer.toString(i));
    }
    qds.saveChanges();
    qds.close();
 

вместо этого можно было бы создать таблицу с числами от 0 до 200 (а лучше еще больше) и сделать одним запросом:
(допустим такая таблица называется Millenium, с одним полем num, как у меня)
insert City
  select num, 'City'+convert(varchar, num)
    from Millenium
    where num<=200
Ну и так далее. И скорость бы увеличилась не на 20-30 %, а раз в 20-30, да и писать существенно меньше
8 апр 05, 18:32    [1453703]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
Я что-то не нашел результатов теста, много кода - даже не стал вчитываться.
В чем был тест? В написании кода? :))

Если уж писать тест для Оракла, то и на PL/SQL тогда уж

-- Tygra's --
8 апр 05, 18:39    [1453718]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
Алексей, имхо не корректный способ сравнения с самого начала. Я предлагаю сгенерировать тестовые данные и выложить их в файлы (например, CSV или XML). Затем одни и те же данные можно будет вливать и в Оракл и в FO. Именно одни и те же, а не разные.

Дальше, использование CSV - это представление данных в реляционном виде, использование XML - структурированном. Можно будет сравнить также раные подходы, скорости при разном изначальном представлении данных.

Разумеется ждать неделю для генерации тестовых данных - далеко не лучший способ с пользой провести время.
8 апр 05, 18:45    [1453737]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Gowest
Guest
AAron
Алексей, имхо не корректный способ сравнения с самого начала. Я предлагаю сгенерировать тестовые данные и выложить их в файлы (например, CSV или XML). Затем одни и те же данные можно будет вливать и в Оракл и в FO. Именно одни и те же, а не разные.

Дальше, использование CSV - это представление данных в реляционном виде, использование XML - структурированном. Можно будет сравнить также раные подходы, скорости при разном изначальном представлении данных.

Разумеется ждать неделю для генерации тестовых данных - далеко не лучший способ с пользой провести время.


Имеено. Осторожно утверждаю, что 2 миллиона записей положатся из файла через оракловую утилиту импорта за 5 минут
8 апр 05, 19:05    [1453793]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Поясняю.

Java я использовал потому, что мне было влом писать разные программы для FO и Oracle. А раз уж для FO я выбрал Java, то и для Oracle тоже.

Разумеется можно написать на PL/SQL (кстати, если не влом, можете и написать - очень любопытно увидеть эту разницу в 20-30 раз и понять откуда же она берется.). Но тут вылазит проблема одинаковости. У меня количество мест в самолетах и количество проданных билетов на них генерятся случайно. Используя один код для FO и Oracle я могу обеспечить однотипность данных. Т.е. теже 2 млн. загнать в PL/SQL не сложно. А вот последний блок - генерацию билетов - сложнее. Может подскажете код.

И наконец, почему этот код должен быть на порядок медленнее PL/SQL кода? Медленнее - да, но на порядок ...

2 tygra.

Собственно, прежде чем приводить цифры по FO. хотелось бы согласовать цифры по Oracle. Например. у меня задача вплоть до окончания заполнения таблицы Person двумя млн. строк проходит примерно за 10-15 минут, а вот дальше - ступор. При тех значениях, что даны в коде ~130 тыс. рейсов (полетов) и ~27 млн. билетов генерятся почти неделю. А по банальной аналогии с персонами должны генериться несколько часов. В чем проблема то?
8 апр 05, 19:28    [1453830]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Gowest
Осторожно утверждаю, что 2 миллиона записей положатся из файла через оракловую утилиту импорта за 5 минут


Простое складывание 2 млн. записей действительно много времени не занимает (10-15 мин. на моем компе). Но вот там, где есть FK похоже возникают задержки, и задержки большие. Помимо сравнения быстродействия систем на задаче ввода данных, хочется поюзать тесты чтения на действительно больших (10-20 Гб) базах.
8 апр 05, 19:35    [1453845]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
XM
Guest
Блин, хто ж такие объемы данных так вставляет?
Я бы воопче написал скрипт на PERL, да соорудил нихеровый текстовик, который и импортировал в базу.
Ишшо один момент, шо constraintы можно включить только после импорта в базу, а равно и создать после этого индексы.
Шо я из спортивного интереса и сделал. Генерация файла (~500Mb) занимает 3 мин, импорт - 15 мин. (PostgreSQL 8.0, Celeron-1.4 256M RAM).
Завтра потестрирую на запросы, аж самому интересно.

К сообщению приложен файл (trash.pl - 1Kb) cкачать
8 апр 05, 21:15    [1453999]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
автор

Например. у меня задача вплоть до окончания заполнения таблицы Person двумя млн. строк проходит примерно за 10-15 минут, а вот дальше - ступор. При тех значениях, что даны в коде ~130 тыс. рейсов (полетов) и ~27 млн. билетов генерятся почти неделю. А по банальной аналогии с персонами должны генериться несколько часов. В чем проблема то?

Причин может быть много. Вам надо Ораклового спеца туда было пригласить, чтобы он контролировал.
А что
SELECT MIN(Seat.id) seat_id_start, MAX(Seat.id) seat_id_end " +
             "FROM Seat INNER JOIN Flight ON Flight.crafttype_id = Seat.crafttype_id " +
             "WHERE Flight.id = " + Integer.toString(j) + "GROUP BY Flight.id

выполняется 2000 раз внутри какого-то цикла? Т.е. еще нужно умножить 2000 на скока-то.

Ну можно хотя бы посмотреть
select s.sql_text, s.sorts, s.fetches, s.executions, s.loads, s.parse_calls,
s.disk_reads, s.buffer_gets, s.rows_processed, s.cpu_time, s.elapsed_time
from v$sql s
order by s.elapsed_time desc
Если сервер не вырубали, и не закачивали никаких других милионов.

А вообще на том серваке ничего не крутится еще?
Надо было смотреть чего сессии ждут.
Можно было statspack включить.
Ну в общем что-то надо было делать, чтобы все объективно было.
Хотя бы подуть на него, када он тормозил.
9 апр 05, 01:16    [1454216]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Alexey Rovdo

>И первый же вопрос, который мне пришлось решать, - заполнение базы тестовыми данными.

Нету такого вопроса, по крайней мере для РСУБД. Постройте CSV файлы, как советовал AAron, и импортируйте их. В ASA, например, это делается одним оператором input или load. Автоматически решится и следующая проблема:

>Причем хотелось, с одной стороны, сделать эти данные более-менее случайными (как-то кол-во проданных билетов), а с другой - максимально идентичными для FO и для Oracle, чтобы гарантировать одинаковые условия при сравнении скорости поиска.

Причем данные будут гарантированно идентичными.

Но я подозреваю что фастобджектс импортировать данные из текстовых файлов сам по себе не умеет, или делает это очень медленно, поэтому будут найдены аргументы чтоб объявить способ непригодным.

>Честно говоря, подозреваю, что здесь я уперся именно в быстродействие Oracle.

Или в быстродействие библиотек. Чтоб с уверенностью выделить проблему все-таки нужно построить ПЛ-СКЛ скрипты.

>Но тут вылазит проблема одинаковости. У меня количество мест в самолетах и количество проданных билетов на них генерятся случайно. Используя один код для FO и Oracle я могу обеспечить однотипность данных.

Определитесь что нужно: однотипность или одинаковость? Однотипность можно добиться и в разных программах, одинаковость при использовании случайных чисел - врядли.


2 SergSuper

>а зачем вообще было использовать Яву?

Я об этом твержу с самого начала, но товатисч не понимает, товарисч любит преодолевать трудности, а с джавой даже простой инсерт требует 20 строчек кода.

Но самое главное, что потом тихо забывается тот факт, что из соображений совместимости в РСУБД искусственно выбрано далеко не лучшее решение, и громко объявляется: вот видите, результаты не показали явного преимущества оракла перед Версантом.
9 апр 05, 02:00    [1454235]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
2 c127

Вы не поняли одного простого факта. Изначально я вообще не планировал сравнивать FO и Oracle на задаче ввода данных. И приведенный здесь код даже и не предполагал кому-то показывать. Мне просто нужно было наделать тестовых данных, я написал прогу для FO, а потом переделал ее под Oracle - это было яно проще, чем все другие доступные методы, просто потому, что Java-код уже имелся.

Но впоследствии в соседней ветке зашла речь о скорости работы ООСУБД при большом объеме входных данных (датчики, измерительные системы и т.п.). Мне показалось, что данный пример вполне можно рассматривать как модель системы с большим объемом входной информации (случайные последовательности данных, которые нужно как-то структурировать и сохранять вполне подходят для такой модели).

Учитывая все это, советы перейти к использованию CSV или переписать код на PL/SQL могут решить проблему заливки большого объема данных (хотя насчет CSV нужны пояснения), но тогда и модель уже не будет соответствовать реальности (данные должны поступать в БД извне). Поэтому было бы все таки любопытно разобраться в причине - почему все-таки происходит торможение при генерации билетов.

Выше высказана идея, с которой я согласен. Причина вероятно в том, что при вводе новых значений в таблицу Ticket проверяется довольно много ссылок (правила ссылочной целостности). Эти проверки и тормозят систему. Проверить эту версию очень легко - отключить проверку констрейнтов и проверить скорость работы программы в этом режиме. Кстати, как это лучше всего сделать в Oracle 9i?
9 апр 05, 09:14    [1454335]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
XM
Guest
Alexey Rovdo

Поэтому было бы все таки любопытно разобраться в причине - почему все-таки происходит торможение при генерации билетов.
....
Причина вероятно в том, что при вводе новых значений в таблицу Ticket проверяется довольно много ссылок (правила ссылочной целостности). Эти проверки и тормозят систему.

Ишшо тормоза:
1. SELECT MIN(Seat.id) ... - проверь, сколько времени занимает один такой запрос и умножь на кол-во рейсов.
2. conn.commit() - усё можно сделать в одной транзакции, а не за ~130000 .

c127
одинаковость при использовании случайных чисел - врядли.

Шо, трудно написать и использовать один генератор псевдослучайных чисел?
9 апр 05, 10:23    [1454387]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
XM
Guest
Гы, подправленный запрос для решения задачи

Дано: дата d, маршрут [Z1, Z2]. Выдать таблицу (билеты в наличии): рейс - класс - кол-во мест

SELECT  Itm.id, Itm.day, Flight.description, Seat1.seat_level,
  ( select count(s2.id)
    from seat s2
    where s2.crafttype_id = flight.crafttype_id and s2.seat_level=seat1.seat_level
  ) -
  ( select count(s3.id)     from seat s3 join (select * from ticket where item_id=itm.id) as tickt on s3.id = tickt.seat_id
    where s3.crafttype_id = flight.crafttype_id  and s3.seat_level=seat1.seat_level
  ) AS free_seats
FROM
   (select * from Item where item.day = '01.01.2005') as Itm
   JOIN Flight ON Flight.id = Itm.flight_id
   JOIN (select distinct seat_level, crafttype_id from Seat ) AS Seat1 ON Seat1.crafttype_id = Flight.crafttype_id
   JOIN (select * from City where name='City49' ) AS City1  ON Flight.startpoint_id = City1.id
   JOIN (select * from City where name='City32' ) AS City2 ON Flight.endpoint_id = City2.id
ORDER BY Itm.id, Itm.day, Flight.description, Seat1.seat_level ; 
66000 рейсов, 13323720 билетов, база импортировалась ( с построением индексов) 1,5 часа.

Запрос выполнялся 0.5 sec
9 апр 05, 14:01    [1454534]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
XM

66000 рейсов, 13323720 билетов, база импортировалась ( с построением индексов) 1,5 часа.


А можно выложить методику (код) и/или все константы использованные при заполнении базы?

За запрос спасибо. Чтобы предупредить лишнюю работу, могу сразу сказать, что мои эксперименты показали - Oracle заметно опережает FastObjects в скорости обработки запросов и качестве их оптимизации. Тот код, который я выкладывал для FastObjects проигрывает вследвие этого коду для Oracle (запрос у меня однако выглядит по проще). Только отказавшись от использования запросов и оперевшись на прямую навигацию можно добиться принципиального увеличения быстродействия FastObjects. Я выложу детальные результаты сравнения, когда закончу его (это будут тесты на последовательностях запросов со случайными параметрами).

Но быстродействие при записи случайных внешних данных тоже представляет интерес. Поэтому, если вы нашли причину торможения моего кода при генерации билетов, прошу пояснить ее.
9 апр 05, 23:32    [1454898]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 20 21 22 23 24 [25] 26 27 28 29 .. 34   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить