powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Посоветуйте СУБД
25 сообщений из 53, страница 2 из 3
Посоветуйте СУБД
    #35903499
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
Hello, pkarklin!
You wrote on Tue, 31 Mar 09 12:00:33 GMT:

pkarklin p> Гм... Коим образом явное использование неявнях транзакций и откатов в триггерах зависит от СУБД?!
Павел, ты будешь смеяться, но ЭТО не везде именно так.

--
With best regards, Мимопроходящий.



Да я знаю, просто мне хочется понять ход мысли Дмитрия, т.е. каким образом наличие режима неявных транзакций и возможность сделать откат в триггере влияет на "недопонимание управления транзакциями". М.б. есть какой-то критерий (стандарт) "понимания управления"?
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903510
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviderИ огнептица работает на порядок быстрее (например 3 секунды против 15).

В моем понимании "на порядок" - это 10 к 1, а не 5 к 1.

DeviderА я сейчас сделал вот что: создал 2 одинаковых таблички с 2мя полями (интовое и текстовое) и делаю по N коннектов с выполнением M простениких селектов.

Скрипты и результаты тестирования в студию...
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903527
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklin
мне хочется понять ход мысли Дмитрия, т.е. каким образом наличие режима
неявных транзакций и возможность сделать откат в триггере влияет на
"недопонимание управления транзакциями".

Один из типичных вопросов мигрантов: "А что, SELECT тоже надо в
транзакции делать? "
Второй типичный вопрос: "А как сделать ROLLBACK/COMMIT в триггере?"
М.б. есть какой-то критерий (стандарт) "понимания управления"?

Лично я таким критерием считаю осознание того, что транзакции
принадлежат к бизнес-логике и пихать управление ими в физическую модель
данных (триггера)... некорректно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903530
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviderСтал разбираться с DB2, ну там по-ходу так сходу не получится, читать придется. Например у меня не получилось создать БД, при создании пишет "нет такого пути" ну и еще что какие-то непонятные вещи. После установки/деинсталляции слетели настройки файерфокса, избранное, пароли и т.д. Да и "антураж" (все прилогающиеся софтины) достаточно задумчивые. Хотя с точки зрения "изучить, чтобы потом пригодилось" наверное все-таки предпочтительнее DB2?При создании БД указывайте корень нужного диска, DB2 работает с ним. Через Control center все просто, мышом.
С файрфоксом - у меня настройки не слетали никогда. Если под Win, на время установки сделайте IExplorer дефолтным бровзером - да, согласен, запуск установки сделан через попу.
Задумчивость софтин проистекает в основном от старта Java - включите "Enable Quick Launch..." в трее винды.
Вообще, если чего непонятно - лучше спросить в соседнем форуме по DB2 . Там, кстати, и добрые люди из IBM отвечают.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903552
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОдин из типичных вопросов мигрантов: "А что, SELECT тоже надо в
транзакции делать? "

Вопрос без уточнения что это за SELECT, одиночный он или нет и т.п. не имеет смысла. Ибо даже в дефолтном режиме автокоммита - один SELECT одна транзакция.

Dimitry SibiryakovВторой типичный вопрос: "А как сделать ROLLBACK/COMMIT в триггере?"
Лично я таким критерием считаю осознание того, что транзакции
принадлежат к бизнес-логике и пихать управление ими в физическую модель
данных (триггера)... некорректно.

Почему же Вы отнесли триггеры к "физической модели"?! Странно, производители многих СУБД считают, что как раз с помощью триггеров и можно\нужно "Enforcing Business Logic".
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903555
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklinВопрос без уточнения что это за SELECT, одиночный он или нет и т.п. не имеет смысла. Ибо даже в дефолтном режиме автокоммита - один SELECT одна транзакция.

Естественно, это дефолтное значение относится к MS SQL.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903602
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklin
В моем понимании "на порядок" - это 10 к 1, а не 5 к 1.

Ну 10 к 1 так и было, а при увеличении N и M то получилось то, что я описал. Потом я подумал, что неплохо было бы отследить зависимость от N и от M, нарисовать поверхность, посмотреть, почесать репу, ну и плюнул в итоге и прикрыл эту лавочку до выходных..
pkarklin
Скрипты и результаты тестирования в студию...
и соответственно не сохранил эту красоту. Ну я думаю не сложно будет повторить если зададитесь целью.
Тестил чем-то вроде:
Код: 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.
package javaapplication;
import java.sql.*;

public class Main {

    private static int requestCount =  150 ;
    private static int connectCount =  10 ;
    private static String sql = null;

    public static void main(String[] args) {
        System.out.print("Starting: " + sql);
        sql = args[ 0 ] + args[ 1 ];

        for (int i =  0 ; i < connectCount; i++){
            TestDB2();
            //TestFireBird();
        }
        System.out.println("Done");
    }

    private static void TestFireBird(){
        try{
            Class.forName("org.firebirdsql.jdbc.FBDriver");//.newInstance();
        }
        catch(Exception e) {System.err.println("Error" + e.getMessage());}
        try
        {
            Connection Conn = DriverManager.getConnection(
                "jdbc:firebirdsql:localhost/3050:c:/dbs/testfbdb.fdb",
            "lodin", "passw");

            //System.out.println("Connection is opened: " + !Conn.isClosed());

            DoSQLCode(Conn, sql);
            //System.out.println ("Closing connection...");
            Conn.close();
        }
        catch(Exception e){
            System.err.println("Error" + e.getMessage());
            return;
        }
       // System.out.println("OK");
    }

    private static void TestDB2(){
        try{
            Class.forName("com.ibm.db2.jcc.DB2Driver");//.newInstance();
        }
        catch(Exception e) {System.out.println("Error" + e.getMessage());}
        //System.out.println("Done!");
        try
        {
            Connection Conn = DriverManager.getConnection(
                "jdbc:db2:testdb",
            "admin", "passw");

            //System.out.println("Connection is opened: " + !Conn.isClosed());

            DoSQLCode(Conn, sql);

            //System.out.println ("Closing connection...");
            Conn.close();
        }
        catch(Exception e){
            System.err.println("Error" + e.getMessage());
            return;
        }
        //System.out.println("OK");
    }

    private static void DoSQLCode(Connection Conn, String query){
        for (int k =  0 ; k < requestCount; k++)
        {
            try
            {
                Statement stmt = Conn.createStatement();
                //System.out.println("Creating...");
                ResultSet rs = stmt.executeQuery(query);
                //System.out.println("Executing...");
                ResultSetMetaData rsmd = rs.getMetaData();
                String columns[] = new String[rsmd.getColumnCount()];
                while(rs.next()){
                    for (int i =  0 ; i < columns.length; i++){
                        columns[i] = rsmd.getColumnName(i+ 1 );
                        //System.out.print(columns[i] + " = " + rs.getString(columns[i]) + " ");
                    }
                    //System.out.println();
                }
                stmt.close();
            }
            catch (Exception e){System.out.println(e.toString());}
        }
    }
}


...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903610
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deviderpackage javaapplication;

Да, да. нет ничего более кошерного, чем мерить производительность СУБД скриптами на джаве.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903634
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pkarklinВопрос без уточнения что это за SELECT, одиночный он или нет и т.п. не имеет смысла. Ибо даже в дефолтном режиме автокоммита - один SELECT одна транзакция.
Естественно, это дефолтное значение относится к MS SQL.А можно узнать "в порядке самообразования" - к какой части MS SQL относится сие дефолтное значение? TSQL внутри SP или триггера - тоже?!
pkarklinСтранно, производители многих СУБД считают, что как раз с помощью триггеров и можно\нужно "Enforcing Business Logic".Простите, что прерываю, но rollback в SS действительно можно сделать в триггере? Я в шоке. А зачем?!!
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903643
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Favn,

Да, спасибо, разобрался. Все работает (из того, что пробовал =) ) только "Центр задач" пишет при запуске
DBA1176N Центру управления не удалось автоматически
каталогизировать базу данных каталога инструментов "" для
системы "CompName".
да после установки (с ИЕ по дефолту был оно что-то писало но отображадись только окна (контуры) и кнопки. Ну фреймы контролов короче (без картинок и шрифтов). Виндовз сканер воспринимал окно как единое целое, ну т.е. текст меток нельзя прочесть было. Короче, чего хотел я так и не понял, нажимал на кнопки исходя из того, что слева ОК а справа Cancel. =)
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903650
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklinDeviderpackage javaapplication;

Да, да. нет ничего более кошерного, чем мерить производительность СУБД скриптами на джаве.

Так приложение-то на джаве будет написано. Зачем мне производительность "впринципе"?
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903701
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Favn
Простите, что прерываю, но rollback в SS действительно можно сделать в
триггере? Я в шоке. А зачем?!!

Поройся в поиске, тут была длинная тема по этому поводу. Вкратце: это
единственный способ откатить выполняющийся статемент/батч и обеспечить
тем его атомарность.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903711
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviderВсе работает (из того, что пробовал =) ) только "Центр задач" пишет при запуске
DBA1176N Центру управления не удалось автоматически
каталогизировать базу данных каталога инструментов "" для
системы "CompName".
Наверно, Вы при установке отказались создавать БД TOOLSDB, а "Центр задач" без нее не может, вот и обиделсо :)
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903772
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FavnА можно узнать "в порядке самообразования" - к какой части MS SQL относится сие дефолтное значение? TSQL внутри SP или триггера - тоже?!

Поумолчанию MS SQL работает в режиме автокоммита, когда каждая отдельная инстркция завернута в отдельную транзакцию. Т.е. отправка на сервер:

Код: plaintext
SELECT * FROM SomeTable


в таком режиме эквивалентно по поведению в режиме явных транзакций:

Код: plaintext
1.
2.
BEGIN TRAN
SELECT * FROM SomeTable
COMMIT

И это не зависит от того, пришла инструкция с клиента или она написана в хп без явного управления транзакциями.

В триггере мы всегда находимся в транзакции (даже если она не была запущена явно) от инструкции, которая вызвала срабатывание триггера. Т.е. отправка на сервер в режиме автокоммита инструкции

Код: plaintext
INSERT SomeTable VALUES(SomeValues, ...)


при наличи тригера на INSERT будет эквивалентно по поведению в режиме явных транзакций:

Код: plaintext
1.
2.
3.
BEGIN TRAN
INSERT SomeTable VALUES(SomeValues, ...) 
--тут логика триггера
COMMIT

Можно перевести сервер в режим неявных транзакций, когда инструкции DML и DDL и некоторые другие инструкции стартуют транзакцию неявно, если таковой сейчас нет, и не стартуют, если есть активная. При таком подходе требуется лишь сказать COMMIT или ROLLBACK в конце пакета.


FavnПростите, что прерываю, но rollback в SS действительно можно сделать в триггере? Я в шоке. А зачем?!!

Есть таблица операций по счету, есть таблица с остатками по счету. При операции модификации данных в таблице операций по счету необходимо запретить проведение операции, по результатам которой остаток по счету станет <0, исключив при этом часть клиентов, имеющих овердрафт по счету, для них условия другие, не выйти в минус за максимальный овердрафт. Чистейшая бизнес-логика, не правда ли?

Почему бы не реализовать это триггером, откатив (с учетом приведенных выше объяснений) то, что уже мог наделать триггер и саму инструкцию с выдачей соответствующего сообщения об ошибке или выполнить другие действия, например, отправить письмо менеджеру?
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35903825
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Favn
Простите, что прерываю, но rollback в SS действительно можно сделать в
триггере? Я в шоке. А зачем?!!

Поройся в поиске, тут была длинная тема по этому поводу. Вкратце: это
единственный способ откатить выполняющийся статемент/батч и обеспечить
тем его атомарность.



Не совсем так, точнее совсем не так. Вот этот тред:

http://www.sql.ru/forum/actualthread.aspx?tid=588877&pg=4&hl=set+xact_abort+%f2%f0%e8%e3%e3%e5%f0
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904179
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, видимо, припух уже, но.. Вот такой запрос:
sqlSELECT COUNT(*) FROM TableName WHERE (MOD(ID,2) = 0)
В случае с огнептицей выполняется меньше чем за секунду при
Код: plaintext
1.
    private static int requestCount =  10 ;
    private static int connectCount =  10 ;
а DB2 больше минуты. Это как так?
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904198
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviderЭто как так?

Первая возможность: ты забыл набить огнептицу данными.
Вторая возможность: ты остановил выборку на первой/второй/двадцатой записи.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904279
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну практически. В коде накосячил. Ну а так в общем получается очень похожие результаты. Самое большое что мне удалось добиться - это 6 с маленьким % в пользу огнептицы.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904341
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devider
Самое большое что мне удалось добиться - это 6 с маленьким % в пользу
огнептицы.

Странно. Только из соображения, что DB2 - чистый блокировочник, он
должен быть гораздо быстрее на full scan в монопольном режиме. У него
тупо больше записей на страницу влазит.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904384
пгуые123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Devider,

потести firbird на запросах с группировкой

create table T
(
id int,
key int,
val numeric(14,4)
)

select
key,
sum(val)
from T
group by key

Только на db2 создай MQT по столбцу key а на firebird какие угодно. ;) увидишь как птычка крылашки сложит )))
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35904619
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пгуые123,

Потестю, аха. А крылышки она сложила когда я стал выбирать нечетные ID, но не как белый человек а так:

Код: plaintext
1.
2.
3.
SELECT COUNT(*) FROM TableName WHERE ID NOT IN(
  SELECT ID FROM TableName WHERE (MOD(ID, 2 ) =  0 )
)
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35905940
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пгуые123Только на db2 создай MQT по столбцу key а на firebird какие угодно. ;) Не получится, т.к. MQT, как и аналоги в остальных СУБД, это фича только Enterprise редакции.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35906041
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviderСамое большое что мне удалось добиться - это 6 с маленьким % в пользу огнептицы.Еще несколько моментов:
1. Для "чистого" сравнения не учитывайте в скрипте время на установление соединения - в DB2 оно довольно большое, особенно для "первого и единственного". По умолчанию все БД не активированы, активируются после любого 1-го конекта, дабы ненужные ресурсы не жрали, а активация требует времени. После отключения последнего пользователя БД опять деактивируется.
2. Хотите посмотреть "настоящую" скорость fullscan - создайте dms (вфефифыу ьфтфпьуте) tablespace на неформатированном разделе диска и разместите таблицу в нем. Должно быть заметно быстрее.
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35906049
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В смысле, dms (database managment space) :)
...
Рейтинг: 0 / 0
Посоветуйте СУБД
    #35906159
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pkarklinИ это не зависит от того, пришла инструкция с клиента или она написана в хп без явного управления транзакциями.
Можно перевести сервер в режим неявных транзакций, когда инструкции DML и DDL и некоторые другие инструкции стартуют транзакцию неявно, если таковой сейчас нет, и не стартуют, если есть активная. При таком подходе требуется лишь сказать COMMIT или ROLLBACK в конце пакета.DB2 всегда живет в "режиме неявных транзакций", потому и удивился, считая autocommit прерогативой (настройкой) клиента, а ни как не сервера. Для меня работа сервера в автокоммите по умолчанию, тем более в SP, выглядит диковато, ну да ладно.
pkarklinПочему бы не реализовать это триггером, откатив (с учетом приведенных выше объяснений) то, что уже мог наделать триггер и саму инструкцию с выдачей соответствующего сообщения об ошибке или выполнить другие действия, например, отправить письмо менеджеру?
http://www.sql.ru/forum/actualthread.aspx?tid=588877&pg=4&hl=set+xact_abort+%f2%f0%e8%e3%e3%e5%f0� Приведенный пример для меня логичнее реализовать обработкой ошибок, кот. в DB2 очень развита. Тот же RAISE ERROR может просто вызвать аварийный откат с нужным тестом ошибки, а можно выставить warning и обойтись без отката. А отправка письма к необходимости rollback отношения не имеет :)
Тред прочитал, нашел там "свой" вопрос насчет "что делать с savepoint'ами" при такой работе, тем более что они в T-SQL есть, но к сожалению не нашел ответа. Имхо такой подход больше похож на привычное "тяжкое наследие" старых версий с бедным функционалом.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Посоветуйте СУБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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