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

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

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

давай сюда тест, повторимый. Иначе о чем.
Сильно много усилий придется потратить такой тест сделать, фактически надо с нуля тестовое приложение написать. Если без этого никак проще оставить как есть и не париться.
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775279
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molochnikпроще оставить как есть и не париться
Если допустимо не оптимизировать - не оптимизируй.
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775281
Molochnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фэйтл ЭраMolochnikпроще оставить как есть и не париться
Если допустимо не оптимизировать - не оптимизируй.
Наверное так и оставлю, в принципе работает, посмотрел как запрос выполняется в IBExpert, все вроде корректно, в плане куча джойнов и индексов, "natural" только один, в таблице где обычно 1-2 записи. Чтобы оптимизировать вероятно нужно будет сильно потрудиться. Не стоит игра свеч наверно.
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775282
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolochnikПри тестировании обнаружил, что с MS SQL программа работает быстро и реально многопотоково
Molochnikвсе запросы делаются через критическую секцию, т.е. фактически эти запросы к базе выполняются потоками по очередиТы определись - "реально многопотоково" или таки "по очереди"
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775284
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolochnikКаждый поток выполняет (регулярно и часто) одинаковый для всех сложный SELECT, и затем одинаковый для всех простой UPDATE, со своим набором параметровА коммит - где ?
В MSSQL - автокоммит небось, а у FB нужно явно делать.
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775295
Molochnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Firebird vs MS SQL
    #39775302
Molochnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код в каждом потоке выглядит примерно так
Код: 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
Firebird vs MS SQL
    #39775307
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolochnikИмеется многопотоковое дельфийское приложение, у каждого потока свое соединение к общей базе <..>.
Милый друг, ну а зачем же ты тогда критические секции в них запихал?
И что будет, если обращение к ним (секциям) просто закомментировать?
И если уж на то пошло, то мерить/сравнивать тебе надо, для начала, простое последовательное выполнение
тех запросов в цикле. Слелай циклы на тысячу итераций к каждому серверу (вот тебе саамый простой тест),
засеки время и озвучь результат.
...
Рейтинг: 0 / 0
Firebird vs MS SQL
    #39775308
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molochnik,

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

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

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

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

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

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

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

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

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


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