Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird vs MS SQL / 25 сообщений из 143, страница 1 из 6
17.02.2019, 23:50
    #39775271
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Имеется многопотоковое дельфийское приложение, у каждого потока свое соединение к общей базе. Через Unidac может работать с Firebird и MS SQL. Каждый поток выполняет (регулярно и часто) одинаковый для всех сложный SELECT, и затем одинаковый для всех простой UPDATE, со своим набором параметров. При тестировании обнаружил, что с MS SQL программа работает быстро и реально многопотоково, а с Firebird выглядит так как будто каждый поток ждет когда до него дойдет очередь выполнять запрос, в итоге получается а разы медленнее чем с MS SQL. Тестировал на FB2.5 и FB3.0 со всеми архитектурами, ситуация примерно одинакова. В какую сторону смотреть? Не может же быть, что Firebird в разы хуже MS SQL.
...
Рейтинг: 0 / 0
18.02.2019, 00:09
    #39775273
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

давай сюда тест, повторимый. Иначе о чем.
...
Рейтинг: 0 / 0
18.02.2019, 00:11
    #39775274
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Поменять сообщение видимо нельзя, поэтому добавлю, что все запросы делаются через критическую секцию, т.е. фактически эти запросы к базе выполняются потоками по очереди, но это не мешает MS SQL обрабатывать их очень быстро в отличии от FB.
...
Рейтинг: 0 / 0
18.02.2019, 00:20
    #39775276
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

набросать тест? А ты, не имея его исходников, начнешь угадывать, насколько он соответствует твоим задачам.
...
Рейтинг: 0 / 0
18.02.2019, 00:23
    #39775278
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Фэйтл ЭраMolochnik,

давай сюда тест, повторимый. Иначе о чем.
Сильно много усилий придется потратить такой тест сделать, фактически надо с нуля тестовое приложение написать. Если без этого никак проще оставить как есть и не париться.
...
Рейтинг: 0 / 0
18.02.2019, 00:25
    #39775279
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnikпроще оставить как есть и не париться
Если допустимо не оптимизировать - не оптимизируй.
...
Рейтинг: 0 / 0
18.02.2019, 00:33
    #39775281
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Фэйтл ЭраMolochnikпроще оставить как есть и не париться
Если допустимо не оптимизировать - не оптимизируй.
Наверное так и оставлю, в принципе работает, посмотрел как запрос выполняется в IBExpert, все вроде корректно, в плане куча джойнов и индексов, "natural" только один, в таблице где обычно 1-2 записи. Чтобы оптимизировать вероятно нужно будет сильно потрудиться. Не стоит игра свеч наверно.
...
Рейтинг: 0 / 0
18.02.2019, 00:45
    #39775282
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
MolochnikПри тестировании обнаружил, что с MS SQL программа работает быстро и реально многопотоково
Molochnikвсе запросы делаются через критическую секцию, т.е. фактически эти запросы к базе выполняются потоками по очередиТы определись - "реально многопотоково" или таки "по очереди"
...
Рейтинг: 0 / 0
18.02.2019, 00:47
    #39775284
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
MolochnikКаждый поток выполняет (регулярно и часто) одинаковый для всех сложный SELECT, и затем одинаковый для всех простой UPDATE, со своим набором параметровА коммит - где ?
В MSSQL - автокоммит небось, а у FB нужно явно делать.
...
Рейтинг: 0 / 0
18.02.2019, 06:29
    #39775295
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
hvladТы определись - "реально многопотоково" или таки "по очереди"
Да, ошибся поправить вопрос уже было нельзя. с базой приложение работают фактически однопотоково. Просто визуально MS SQL работал намного быстрее и выглядело так, будто потоки выполняют запросы одновременно.
hvladА коммит - где ?
В MSSQL - автокоммит небось, а у FB нужно явно делать.
Нет все явно, для каждого потока две формальных транзакции, первый (SELECT) SQL выполняется в читающей, второй (UPDATE) - в пишущей. Для FB у читающей 'Params=read;wait;read_committed;rec_version', у пишущей 'Params=write;wait;read_committed;rec_version', читающая постоянная, пишущая - открывается, закрывается. Для MS SQl формально выглядит так же, транзакции без параметров. Зачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует.
...
Рейтинг: 0 / 0
18.02.2019, 07:54
    #39775302
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Код в каждом потоке выглядит примерно так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    CriticalSection.Enter;
    try
        QuerySelect.Open;// read trasaction is already opened
        uniWriteTransaction.StartTransaction;
        try
          QueryUpdate.ExecSQL;
          uniWriteTransaction.Commit;
        except
          uniWriteTransaction.Rollback;
        end;
    finally
      CriticalSection.Leave;
    end;


SQL селект очень большой, упрощенно (уменьшено раза в 3, но суть ту же) выглядит так:
Код: sql
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.
SELECT tbl1.*, tbl2.*, tbl3.*, tbl4.*, tbl5.*, tbl6.*, 
 CASE WHEN UseText=1 AND Text1<>'' AND Text1Done<>1 AND
  (:AllowedTexts='' OR Text1 LIKE :AllowedTexts) AND TextTypes1.Allow1=1 AND TextTypes1.Allow2=1 AND
  (TextCondition=:TextCondition OR Text1Count<MaxTextCount) THEN 1 ELSE 0 END ActualUseText1,
 CASE WHEN UseText=1 AND Text2<>'' AND Text2Done<>1 AND
  (:AllowedTexts='' OR Text2 LIKE :AllowedTexts) AND TextTypes1.Allow1=1 AND TextTypes1.Allow2=1 AND
  (TextCondition=:TextCondition OR Text2Count<MaxTextCount) THEN 1 ELSE 0 END ActualUseText2,
 CASE WHEN UseText=1 AND Text3<>'' AND Text3Done<>1 AND
  (:AllowedTexts='' OR Text3 LIKE :AllowedTexts) AND TextTypes1.Allow1=1 AND TextTypes1.Allow2=1 AND
  (TextCondition=:TextCondition OR Text3Count<MaxTextCount) THEN 1 ELSE 0 END ActualUseText3
FROM tbl1
LEFT JOIN tbl2 ON tbl1.UserId=tbl2.UserId
LEFT JOIN tbl3 ON tbl1.ContactId=tbl3.ContactId
LEFT JOIN tbl4 ON tbl1.ContactId=tbl4.ContactId
LEFT JOIN tbl5 ON tbl5.UserId=tbl2.UserId
LEFT JOIN tbl6 ON tbl1.TaskId=tbl6.TaskId
LEFT JOIN tbl7 ON tbl1.TaskId=tbl7.TaskId
LEFT JOIN tbl8 ON tbl1.TextId=tbl8.TextId
LEFT JOIN tbl9 ON tbl1.TextId=tbl9.TextId
WHERE Paused<>1 AND (DBType=0 OR DBType=2) AND ContactOn=1 AND 
TextMarked=0 AND NextDateTimeText<=CURRENT_TIMESTAMP AND
( (UseText=1 AND Text1<>'' AND Text1Done<>1 AND
  (:AllowedTexts='' OR Text1 LIKE :AllowedTexts) AND TextTypes1.Allow1=1 AND TextTypes1.Allow2=1 AND
  (TextCondition=:TextCondition OR Text1Count<MaxTextCount)) OR
  (UseText=1 AND Text2<>'' AND Text2Done<>1 AND TextTypes2.Allow1=1 AND TextTypes2.Allow2=1 AND
  (:AllowedTexts='' OR Text2 LIKE :AllowedTexts) AND
  (TextCondition=:TextCondition OR Text2Count<MaxTextCount)) OR
  (UseText=1 AND Text3<>'' AND Text3Done<>1 AND TextTypes3.Allow1=1 AND TextTypes3.Allow2=1 AND
  (:AllowedTexts='' OR Text3 LIKE :AllowedTexts) AND
  (TextCondition=:TextCondition OR Text3Count<MaxTextCount)) OR
  (UseNumber=1 AND Contacts.Number<>'' AND NumberDone<>1 AND
  (:AllowedTexts='' OR Contacts.Number LIKE :AllowedTexts) AND
  (TextCondition=:TextCondition OR NumberCount<MaxTextCount))) AND
(tbl4.LineTypeId IS NULL OR tbl4.LineTypeId=:LineTypeId) AND
StartDate<=CAST(CURRENT_TIMESTAMP AS DATE) AND EndDate>=CAST(CURRENT_TIMESTAMP AS DATE) AND
((RoundTheClock=1) OR 
((StartTime<=EndTime) AND (CAST(StartTime AS TIME)<=CAST(CURRENT_TIMESTAMP AS TIME)) AND (CAST(EndTime AS TIME)>=CAST(CURRENT_TIMESTAMP AS TIME))) OR
((StartTime>EndTime) AND ((CAST(StartTime AS TIME)<=CAST(CURRENT_TIMESTAMP AS TIME)) OR (CAST(EndTime AS TIME)>=CAST(CURRENT_TIMESTAMP AS TIME))))) AND
Done = -1 AND :UseType = 1
ORDER BY tbl1.Priority DESC, tbl2.Priority DESC, NextDateTimeText ASC
ROWS 1


SQL апдейт очень простой:
Код: sql
1.
2.
UPDATE tbl1 SET TextMarked=1
WHERE TextId=:TextId
...
Рейтинг: 0 / 0
18.02.2019, 08:28
    #39775307
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
MolochnikИмеется многопотоковое дельфийское приложение, у каждого потока свое соединение к общей базе <..>.
Милый друг, ну а зачем же ты тогда критические секции в них запихал?
И что будет, если обращение к ним (секциям) просто закомментировать?
И если уж на то пошло, то мерить/сравнивать тебе надо, для начала, простое последовательное выполнение
тех запросов в цикле. Слелай циклы на тысячу итераций к каждому серверу (вот тебе саамый простой тест),
засеки время и озвучь результат.
...
Рейтинг: 0 / 0
18.02.2019, 08:32
    #39775308
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

за такой SELECT надо руки отрывать, без относительно того на каком сервере это выполняется
...
Рейтинг: 0 / 0
18.02.2019, 08:34
    #39775310
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Vlad FМилый друг, ну а зачем же ты тогда критические секции в них запихал?

Смысл этого простой - очередь. Каждый поток по очереди выбирает первую доступную запись для обработки и помечает ее как используемую. Если потоки будут читать одновременно они могут выбрать одну и туже запись.
Vlad FИ если уж на то пошло, то мерить/сравнивать тебе надо, для начала, простое последовательное выполнение
тех запросов в цикле. Слелай циклы на тысячу итераций к каждому серверу (вот тебе саамый простой тест),
засеки время и озвучь результат.

да, сделаю
...
Рейтинг: 0 / 0
18.02.2019, 08:35
    #39775311
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Симонов ДенисMolochnik,
за такой SELECT надо руки отрывать, без относительно того на каком сервере это выполняется
И в чем кривость?
...
Рейтинг: 0 / 0
18.02.2019, 08:42
    #39775312
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
MolochnikЗачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует.

Это вообще феерический бред. Каким образом боком здесь вообще другое приложение работающее с теми же таблицаим?
...
Рейтинг: 0 / 0
18.02.2019, 08:46
    #39775313
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

во всём, начиная от table.*, поля в where без уточнений к какой таблице относятся, 100500 условий фильтрации
...
Рейтинг: 0 / 0
18.02.2019, 08:47
    #39775314
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Симонов ДенисMolochnikЗачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует.

Это вообще феерический бред. Каким образом боком здесь вообще другое приложение работающее с теми же таблицаим?
Никакого, я просто объяснил почему несмотря на критическую секцию здесь используются две транзакции а не одна
...
Рейтинг: 0 / 0
18.02.2019, 08:49
    #39775316
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Симонов ДенисMolochnik,

во всём, начиная от table.*, поля в where без уточнений к какой таблице относятся, 100500 условий фильтрации
Поля используются практически все, их очень много, чтобы по отдельности выписывать. в WHERE поля без уточнения, согласен, но это косметика. Условий фильтрации много, ну и что? Все нужны.
...
Рейтинг: 0 / 0
18.02.2019, 09:03
    #39775322
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
MolochnikСмысл этого простой - очередь. Каждый поток по очереди выбирает первую доступную запись для обработки и помечает ее как используемую. Если потоки будут читать одновременно они могут выбрать одну и туже запись.
Select for update, с с оответствующей обработкой результатов возможного отлупа в потоках,
с тем чтобы они в подобной ситуации повторяли попытку поиска неиспользуемой записи?
Подумай над этим.
...
Рейтинг: 0 / 0
18.02.2019, 09:18
    #39775331
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Vlad FSelect for update, с с оответствующей обработкой результатов возможного отлупа в потоках,
с тем чтобы они в подобной ситуации повторяли попытку поиска неиспользуемой записи?
Подумай над этим.
Этой конструкции нет в MS SQL поэтому я стараюсь такие не использовать. Также например не использую функцию IIF, потому что вплоть до 2008 года в MS SQL ее не было.
...
Рейтинг: 0 / 0
18.02.2019, 09:30
    #39775338
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

Но case то был??
...
Рейтинг: 0 / 0
18.02.2019, 09:37
    #39775340
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Vlad FMolochnik,
Но case то был??
Да, как ни странно, case был. У меня сейчас совместимость вплоть до MS SQL 2000
...
Рейтинг: 0 / 0
18.02.2019, 09:43
    #39775342
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Molochnik,

Это очень даже не странно, это стандарт.
...
Рейтинг: 0 / 0
18.02.2019, 09:45
    #39775343
Molochnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird vs MS SQL
Vlad FMolochnik,
Это очень даже не странно, это стандарт.
Странно что в микрософте об этом знали :)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird vs MS SQL / 25 сообщений из 143, страница 1 из 6
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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