Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Имеется многопотоковое дельфийское приложение, у каждого потока свое соединение к общей базе. Через Unidac может работать с Firebird и MS SQL. Каждый поток выполняет (регулярно и часто) одинаковый для всех сложный SELECT, и затем одинаковый для всех простой UPDATE, со своим набором параметров. При тестировании обнаружил, что с MS SQL программа работает быстро и реально многопотоково, а с Firebird выглядит так как будто каждый поток ждет когда до него дойдет очередь выполнять запрос, в итоге получается а разы медленнее чем с MS SQL. Тестировал на FB2.5 и FB3.0 со всеми архитектурами, ситуация примерно одинакова. В какую сторону смотреть? Не может же быть, что Firebird в разы хуже MS SQL.
17 фев 19, 23:50    [21812385]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Molochnik,

давай сюда тест, повторимый. Иначе о чем.
18 фев 19, 00:09    [21812414]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Поменять сообщение видимо нельзя, поэтому добавлю, что все запросы делаются через критическую секцию, т.е. фактически эти запросы к базе выполняются потоками по очереди, но это не мешает MS SQL обрабатывать их очень быстро в отличии от FB.
18 фев 19, 00:11    [21812416]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Molochnik,

набросать тест? А ты, не имея его исходников, начнешь угадывать, насколько он соответствует твоим задачам.
18 фев 19, 00:20    [21812425]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Фэйтл Эра
Molochnik,

давай сюда тест, повторимый. Иначе о чем.

Сильно много усилий придется потратить такой тест сделать, фактически надо с нуля тестовое приложение написать. Если без этого никак проще оставить как есть и не париться.
18 фев 19, 00:23    [21812429]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 627
Molochnik
проще оставить как есть и не париться

Если допустимо не оптимизировать - не оптимизируй.
18 фев 19, 00:25    [21812430]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Фэйтл Эра
Molochnik
проще оставить как есть и не париться

Если допустимо не оптимизировать - не оптимизируй.

Наверное так и оставлю, в принципе работает, посмотрел как запрос выполняется в IBExpert, все вроде корректно, в плане куча джойнов и индексов, "natural" только один, в таблице где обычно 1-2 записи. Чтобы оптимизировать вероятно нужно будет сильно потрудиться. Не стоит игра свеч наверно.
18 фев 19, 00:33    [21812436]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
hvlad
Member

Откуда:
Сообщений: 10578
Molochnik
При тестировании обнаружил, что с MS SQL программа работает быстро и реально многопотоково

Molochnik
все запросы делаются через критическую секцию, т.е. фактически эти запросы к базе выполняются потоками по очереди
Ты определись - "реально многопотоково" или таки "по очереди"
18 фев 19, 00:45    [21812440]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
hvlad
Member

Откуда:
Сообщений: 10578
Molochnik
Каждый поток выполняет (регулярно и часто) одинаковый для всех сложный SELECT, и затем одинаковый для всех простой UPDATE, со своим набором параметров
А коммит - где ?
В MSSQL - автокоммит небось, а у FB нужно явно делать.
18 фев 19, 00:47    [21812442]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
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 формально выглядит так же, транзакции без параметров. Зачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует.
18 фев 19, 06:29    [21812477]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Код в каждом потоке выглядит примерно так
    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, но суть ту же) выглядит так:
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 апдейт очень простой:
UPDATE tbl1 SET TextMarked=1
WHERE TextId=:TextId
18 фев 19, 07:54    [21812490]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Vlad F
Member

Откуда:
Сообщений: 926
Molochnik
Имеется многопотоковое дельфийское приложение, у каждого потока свое соединение к общей базе <..>.

Милый друг, ну а зачем же ты тогда критические секции в них запихал?
И что будет, если обращение к ним (секциям) просто закомментировать?
И если уж на то пошло, то мерить/сравнивать тебе надо, для начала, простое последовательное выполнение
тех запросов в цикле. Слелай циклы на тысячу итераций к каждому серверу (вот тебе саамый простой тест),
засеки время и озвучь результат.
18 фев 19, 08:28    [21812498]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10024
Molochnik,

за такой SELECT надо руки отрывать, без относительно того на каком сервере это выполняется
18 фев 19, 08:32    [21812499]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Vlad F
Милый друг, ну а зачем же ты тогда критические секции в них запихал?

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

да, сделаю
18 фев 19, 08:34    [21812502]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Симонов Денис
Molochnik,
за такой SELECT надо руки отрывать, без относительно того на каком сервере это выполняется

И в чем кривость?
18 фев 19, 08:35    [21812503]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10024
Molochnik
Зачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует
.

Это вообще феерический бред. Каким образом боком здесь вообще другое приложение работающее с теми же таблицаим?
18 фев 19, 08:42    [21812504]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10024
Molochnik,

во всём, начиная от table.*, поля в where без уточнений к какой таблице относятся, 100500 условий фильтрации
18 фев 19, 08:46    [21812505]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Симонов Денис
Molochnik
Зачем вообще две транзакции, если все равно запросы выполняются в критической секции? Потому что имеется еще другое приложение, которое тоже может работать с этими таблицами, но оно выполняет запросы вручную и в тесте не участвует
.

Это вообще феерический бред. Каким образом боком здесь вообще другое приложение работающее с теми же таблицаим?

Никакого, я просто объяснил почему несмотря на критическую секцию здесь используются две транзакции а не одна
18 фев 19, 08:47    [21812506]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Симонов Денис
Molochnik,

во всём, начиная от table.*, поля в where без уточнений к какой таблице относятся, 100500 условий фильтрации

Поля используются практически все, их очень много, чтобы по отдельности выписывать. в WHERE поля без уточнения, согласен, но это косметика. Условий фильтрации много, ну и что? Все нужны.
18 фев 19, 08:49    [21812510]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Vlad F
Member

Откуда:
Сообщений: 926
Molochnik
Смысл этого простой - очередь. Каждый поток по очереди выбирает первую доступную запись для обработки и помечает ее как используемую. Если потоки будут читать одновременно они могут выбрать одну и туже запись.

Select for update, с с оответствующей обработкой результатов возможного отлупа в потоках,
с тем чтобы они в подобной ситуации повторяли попытку поиска неиспользуемой записи?
Подумай над этим.
18 фев 19, 09:03    [21812516]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Vlad F
Select for update, с с оответствующей обработкой результатов возможного отлупа в потоках,
с тем чтобы они в подобной ситуации повторяли попытку поиска неиспользуемой записи?
Подумай над этим.

Этой конструкции нет в MS SQL поэтому я стараюсь такие не использовать. Также например не использую функцию IIF, потому что вплоть до 2008 года в MS SQL ее не было.
18 фев 19, 09:18    [21812528]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Vlad F
Member

Откуда:
Сообщений: 926
Molochnik,

Но case то был??
18 фев 19, 09:30    [21812538]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Vlad F
Molochnik,
Но case то был??

Да, как ни странно, case был. У меня сейчас совместимость вплоть до MS SQL 2000
18 фев 19, 09:37    [21812540]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Vlad F
Member

Откуда:
Сообщений: 926
Molochnik,

Это очень даже не странно, это стандарт.
18 фев 19, 09:43    [21812546]     Ответить | Цитировать Сообщить модератору
 Re: Firebird vs MS SQL  [new]
Molochnik
Member

Откуда:
Сообщений: 130
Vlad F
Molochnik,
Это очень даже не странно, это стандарт.

Странно что в микрософте об этом знали :)
18 фев 19, 09:45    [21812549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить