|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Симонов Денис, Я имел в виду ISO SQL 2008, а не Firebird. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 10:03 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
WildSery, вот как раз там и есть тот синтаксис что я привёл. Его кстати почти во всех последних версиях SQL серверов прикрутили в том числе и в Oracle, MS SQL Server ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 10:13 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikТ.е если сделать ускорение только для обычного приоритета почему для обычного, делай для всех MolochnikПриоритет меняется от 1 до 5 в двух используемых таблицах можно вообще сделать таблицу Максимальный_Приоритет с одной единственнйо строкой и заполнять её на триггерах. или тупо в клиенте сделать цикл по приоритетам, как только нашлась первая запись, цикл прерывать и поскольку тебе все равно никогда больше одоной строки не надо, то вместо "ORDER BY tbl1.Priority DESC" написать "WHERE tbl1.Priority = ( SELECT MAX (tbl1.Priority) )" Но IMHO зря это. Лучше реально считывать пачками хотя бы пару десятков задач, а потом уже на клиенте их разбирать по потокам. Впрочем, если обработка задачи по 10 секунд... (интересно, почему так долго) SQL апдейт очень простой: UPDATE tbl1 SET TextMarked=1 WHERE TextId=:TextId Вот это мне тоже не нравится. Я бы лучше сделал таблицу-очередь и в неё вставлял Приоритет + ID обработчика + ID задачи (ссылку на таблицу/таблицы с задачами). Соответственно, при ошибке в обработчике можно задачу возвращать в пул "неназначенных". При Успешной обработке - просто удалять из таблицы. У тебя же похоже что во-первых идёт модификация "широкой" таблицы по одному столбцу. Во вторых получается таблица, где TextMarked=0 выполняется только у очень немногих записей. Кажется считается, что индексы по таким столбцам неэффективны. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 20:08 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Ariochили тупо в клиенте сделать цикл по приоритетам, как только нашлась первая запись, цикл прерывать Да, вариант рабочий, я просто хотел обойтись одним запросом Ariochи поскольку тебе все равно никогда больше одоной строки не надо, то вместо "ORDER BY tbl1.Priority DESC" написать "WHERE tbl1.Priority = ( SELECT MAX (tbl1.Priority) )" Это не прокатит, может быть так, что запись с максимальным приоритетом не удовлетворяет другим условиям, например по времени, а записи с меньшим - удовлетворяют. В итоге, при наличии реальных записей система будет стоять. AriochНо IMHO зря это. Лучше реально считывать пачками хотя бы пару десятков задач, а потом уже на клиенте их разбирать по потокам. Да уже предлагали этот вариант ( Дегтярев Евгений ) - один поток, обработчик базы, раскидывает данные по потокам. Я предположил что это чересчур сложно, имея сервер БД, который в общем то должен сам решать эту задачу AriochВпрочем, если обработка задачи по 10 секунд... (интересно, почему так долго) Пользователь долго думает. AriochВот это мне тоже не нравится. Я бы лучше сделал таблицу-очередь и в неё вставлял Приоритет + ID обработчика + ID задачи (ссылку на таблицу/таблицы с задачами). Соответственно, при ошибке в обработчике можно задачу возвращать в пул "неназначенных". При Успешной обработке - просто удалять из таблицы. В общем то примерно так оно сейчас и работает, когда я добавил синтетическое поле приоритета AriochУ тебя же похоже что во-первых идёт модификация "широкой" таблицы по одному столбцу. Во вторых получается таблица, где TextMarked=0 выполняется только у очень немногих записей. 50 тыс записей, 10 потоков, т.е. TextMarked=0 у 49990 записей. Очень немного записей (обычно 0) получается когда не выполняется условие, подобное для всех, например время. Тут сразу получается очень долго. Очевидный вариант решения, который приходит в голову, это сделать еще один запрос, выдающий возможные по условию TaskID (это к примеру на предыдущей странице) и только по ним делать выборку: Код: sql 1.
и затем цикл по всем полученнным TaskId: Код: sql 1. 2.
Как сделать такой же эффективный один запрос я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 09:38 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikОчевидный вариант решения, который приходит в голову, это сделать еще один запрос, выдающий возможные по условию TaskID (это к примеру на предыдущей странице) и только по ним делать выборку: Код: sql 1.
и затем цикл по всем полученнным TaskId: Код: sql 1. 2.
Как сделать такой же эффективный один запрос я не знаю. Встряну в середину разговора Если уже получил нужные TaskID из Table2 в первом запросе то зачем JOIN да еще и LEFT во втором Не знаю что там было раньше написано однако эти два запроса обьеденить в "такой же эффективный один запрос" нет никаких проблем Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 09:59 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikОчевидный вариант решения, который приходит в голову, это сделать еще один запрос, выдающий возможные по условию TaskID (это к примеру на предыдущей странице) и только по ним делать выборку: Код: sql 1.
и затем цикл по всем полученнным TaskId: Код: sql 1. 2.
Как сделать такой же эффективный один запрос я не знаю. Встряну в середину разговора Если уже получил нужные TaskID из Table2 в первом запросе то зачем JOIN да еще и LEFT во втором Не знаю что там было раньше написано однако эти два запроса обьеденить в "такой же эффективный один запрос" нет никаких проблем Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 09:59 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnik, > > Я бы лучше сделал таблицу-очередь и в неё вставлял Приоритет + ID обработчика + ID задачи (ссылку на таблицу/таблицы с задачами). > В общем то примерно так оно сейчас и работает, когда я добавил синтетическое поле приоритета примерно да не так не первый раз говорят - сделайте отдельную узкую таблицу для очереди с необходимым и достаточным набором полей, постройте индексы покрывающие ваши кейсы и крутите ее как угодно, разделите захват таска и получение данных по нему зы и даже без индексов, 50т записей в табличке с десятком целых полей - фильтр + сортировка + получение первой записи менее 50мс ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 10:22 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
m7mВстряну в середину разговора Если уже получил нужные TaskID из Table2 в первом запросе то зачем JOIN да еще и LEFT во втором Не знаю что там было раньше написано однако эти два запроса обьеденить в "такой же эффективный один запрос" нет никаких проблем Код: sql 1. 2.
Пример просто был вырожденный чересчур, реально в Table2 имеются еще полезные поля которые нужно извлечь с помощью JOIN. Да действительно, заменить LEFT на INNER в голову не приходило, раньше где ни использовал INNER, всегда медленно было, а сейчас протестировал с INNER - мгновенно происходит при невыполнении условия Дегтярев Евгенийне первый раз говорят - сделайте отдельную узкую таблицу для очереди с необходимым и достаточным набором полей, постройте индексы покрывающие ваши кейсы и крутите ее как угодно, разделите захват таска и получение данных по нему зы и даже без индексов, 50т записей в табличке с десятком целых полей - фильтр + сортировка + получение первой записи менее 50мс так почти все поля и нужны (процентов 70), если все вносить в одну таблицу, то постоянно придется отслеживать все изменения в исходных, коих различных 6 штук, но вариант конечно рабочий ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 12:46 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikДа действительно, заменить LEFT на INNER в голову не приходило, раньше где ни использовал INNER, всегда медленно было, а сейчас протестировал с INNER - мгновенно происходит при невыполнении условия А нет, все от данных зависит, сейчас тестировал на 200 тыс идентичных записях в обоих серверах. Составил табличку 1)Если нет ни одной удовлетворяющей записи, FB INNER JOIN - 1.6 сек LEFT JOIN - 5.5 сек MS INNER JOIN - 0.6 сек, LEFT JOIN - 0.6 сек 2) Если из 200 тыс доступны по условию все, то при получении одной записи FB INNER JOIN - 20 сек, LEFT JOIN - 0.8 секунды MS INNER JOIN - 0.01 сек LEFT JOIN - 0.01 сек Последние результаты для FB просто удручающие ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 14:56 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnik, я тебе уже советовал отделять условия фильтрации от остальных данных? делай так Код: sql 1. 2. 3.
если этот запрос будет быстро работать, то и остальное заработает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:08 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikЭто не прокатит, может быть так, что запись с максимальным приоритетом не удовлетворяет другим условиям, например по времени, а записи с меньшим - удовлетворяют. Хммм... Ну тогда вот именно в этом случае, относительно редком, и "сыграешь на понижение", сделаешь второй запрос Arioch"WHERE tbl1.Priority = ( SELECT MAX (tbl1.Priority) ) - :StepDown " StepDown = 0, 1, 2, 3.... Molochnikимея сервер БД, который в общем то должен сам решать эту задачу количество действий на вытаскивание одного задания, в процентах на непосредственно получения задания, и на обрамление для многопоточности есть вообще такие заморочки, как "безблокировочные структуры данных", которые весьма сложные и баго-опасные, но ими занимаются. потому что чем дольше у тебя процессор занимается действием "получить следующий элемент" - тем боьлше вероятность, что два таких действия с разных процессоров пересекутся. Тем, соотв., больше вероятность - что процессор будет работать "на мусорное ведро". Даже вот тупо так: процессор 1 начал получать задание процессор 2 начал получать задание процессор 1 получил задание №1 процессор 2 получил задание №1 процессор 1 начал обрабатывать задание №1 процессор 2 начал обрабатывать задание №1 процессор 1 кончил обрабатывать задание №1 процессор 2 кончил обрабатывать задание №1 процессор 1 положил в БД задание №1 процессор 2 попытался положить в БД задание №1 - и обломался (а то, не дай бог, и положил, дубль) процессор 1 начал получать задание процессор 2 начал получать задание процессор 1 получил задание №2 процессор 2 получил задание №2 .... если задания примерно равнозначные по сложности - то такая цепочка может дооолго идти. а если процессоров >2 - то ещё дольше. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:15 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikВ общем то примерно так оно сейчас и работает, когда я добавил синтетическое поле приоритета ну сиииииильно примерно, учитывая что вместо одной таблицы у тебя джойн полудесятка и учитывая, что отработанные записи вместо простого удаления из таблицы помечаются отдельным столбцом TextMarked - который вообще нафиг не нужен. Просто удаляй отработанную запись из таблицы. Molochnik50 тыс записей, 10 потоков, т.е. TextMarked=0 у 49990 записей. это сегодня. завтра у тебя 50К с 0 и 50К с 1 послезавтра - 50К с 0 и 100К с 1 через месяц - 50К с 0 и 3М с 1 и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:20 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Дегтярев Евгенийне первый раз говорят - сделайте отдельную узкую таблицу для очереди туда ещё и генератор можно будет прицепить, ради dirty read, ради того, чтобы "захват таска" выполнялся вообще ВНЕ ТРАНЗАКЦИЙ и таким образом два разных клиента просто В ПРИНЦИПЕ не могли схватить один и тот же таск да, надо будет отрабатывать ошибочные ситуации типа "клиент схватил таск и умер, а уборщица украла сетевой кабель" - вбрасывать задание обратно с новым ID > generator-value но захват пачки заданий становится максимально быстрым и вообще без возможных пересечений с конкурентами ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:24 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikПоследние результаты для FB просто удручающие а если перед запуском запроса выключать службы FB и MS SQL, а потoм снoва их включать и запрос прогонять на "холодной" базе (т.е. убрать влияние кэшей) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:27 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnik, 20 сек - это, конечно, сильно. Может анализ производительности в Эксперте посмотрим? План? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 15:42 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
AriochMolochnikПоследние результаты для FB просто удручающие а если перед запуском запроса выключать службы FB и MS SQL, а потoм снoва их включать и запрос прогонять на "холодной" базе (т.е. убрать влияние кэшей) ? Да сделал так, еще дополнительно провел бэкап рестор базы, результаты получше стали 1)Если нет ни одной удовлетворяющей записи, FB INNER JOIN - 1.2 сек LEFT JOIN - 4.1 сек 2) Если из 200 тыс доступны по условию все, то при получении одной записи FB INNER JOIN - 17 сек, LEFT JOIN - 0.015 сек То есть в идеальном случае, когда любая запись подходит FB работает почти как MS, что не может не радовать. Но INNER JOIN просто смерть какая-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 16:10 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnik Но INNER JOIN просто смерть какая-то. Вот тут ты не прав нельзя просто так заменить LEFT JOIN на INNER JOIN ибо это совершенно разные запросы и совершенно разные результаты выполнения зы. не видя ни структур таблиц, ни планов, ни запросов мы тебе тут много чего насоветуем ззы. то что я написал относилось конкретно к тем двум запросам что были в сообщении и никак не означало что надо заменить LEFT JOIN на INNER JOIN в твоем исходном запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 16:45 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikAriochпропущено... а если перед запуском запроса выключать службы FB и MS SQL, а потoм снoва их включать и запрос прогонять на "холодной" базе (т.е. убрать влияние кэшей) ? Да сделал так, еще дополнительно провел бэкап рестор базы, результаты получше стали 1)Если нет ни одной удовлетворяющей записи, FB INNER JOIN - 1.2 сек LEFT JOIN - 4.1 сек 2) Если из 200 тыс доступны по условию все, то при получении одной записи FB INNER JOIN - 17 сек, LEFT JOIN - 0.015 сек То есть в идеальном случае, когда любая запись подходит FB работает почти как MS, что не может не радовать. Но INNER JOIN просто смерть какая-то. Да план меняется просто при заменах inner-left. Порядок перебора таблиц и, соответственно, используемые индексы. При left порядок задан жёстко, при inner его определяет оптимизатор. Опираясь на статистику индексов. Но он не знает сколько у тебя в какой таблице дубликатов по индексам и, бывает, оптимизирует не в ту сторону. А у тебя их, дубликатов, сорок бочек арестантов. Но ты-то об этом знаешь, так и направляй оптимизатора через +0 для того, чтобы он не использовал заведомо вредные для этого конкретного запроса индексы. В смысле чтобы добиться среднестатистической оптимальности, по наиболее распространённому случаю. Кстати, сортировки тоже тормозят тем сильнее, чем больше дубликатов по этим полям. Если их нет, то почти что с сортировкой, что без. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 19:03 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Симонов ДенисMolochnik, я тебе уже советовал отделять условия фильтрации от остальных данных? делай так Код: sql 1. 2. 3.
если этот запрос будет быстро работать, то и остальное заработает. Потестировал ваш вариант, оставил одно поле Код: sql 1.
и убрал Код: sql 1.
иначе выдавал ошибку. Результаты следующие: 1)Если нет ни одной удовлетворяющей записи (Count =0) FB INNER JOIN - 1.3 сек LEFT JOIN - 3.8 сек MS INNER JOIN - 0.005 сек, LEFT JOIN - 0.005 сек 2) Если из 200 тыс доступны по условию все ( Count =200000) FB INNER JOIN - 4.2 сек, LEFT JOIN - 4.2 сек MS INNER JOIN - 0.7 сек LEFT JOIN - 0.7 сек m7mВот тут ты не прав нельзя просто так заменить LEFT JOIN на INNER JOIN ибо это совершенно разные запросы и совершенно разные результаты выполнения В общем случае согласен, но в моем варианте и варианте тестового примера, когда возвращается одна строка результат по логике должен быть примерно одинаковым, что результаты MS в общем то доказывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 19:09 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
m7mне видя ни структур таблиц, ни планов, ни запросов мы тебе тут много чего насоветуем ззы. то что я написал относилось конкретно к тем двум запросам что были в сообщении и никак не означало что надо заменить LEFT JOIN на INNER JOIN в твоем исходном запросе Реально там нет ничего интересного, ну вообще ничего, 6 таблиц джойнятся с разными несложными разумными условиями, никаких нестед таблиц или сложных конструкций, две таблицы большие да, по 200 тыс записей, джойнятся один к одному по полю, которое в одной таблице уникально, остальные таблицы по 1-3 записи. Основная проблема судя по всему - очень много одинаковых значений по полям, которые используется при сортировке и фильтре. Старый плюшевый мишкаДа план меняется просто при заменах inner-left. Порядок перебора таблиц и, соответственно, используемые индексы. При left порядок задан жёстко, при inner его определяет оптимизатор. Опираясь на статистику индексов. Но он не знает сколько у тебя в какой таблице дубликатов по индексам и, бывает, оптимизирует не в ту сторону. А у тебя их, дубликатов, сорок бочек арестантов. Но ты-то об этом знаешь, так и направляй оптимизатора через +0 для того, чтобы он не использовал заведомо вредные для этого конкретного запроса индексы. В смысле чтобы добиться среднестатистической оптимальности, по наиболее распространённому случаю. Кстати, сортировки тоже тормозят тем сильнее, чем больше дубликатов по этим полям. Если их нет, то почти что с сортировкой, что без. Это пока для меня слишком сложно, я сейчас почитаю как работает FB (ссылку дали). Но что интересно, если у меня был только MS, я бы и думать не знал что имеется какой-то "оптимизатор", который иногда работает плохо и его надо както "поправлять" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 19:24 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnikесли у меня был только MS, я бы и думать не знал что имеется какой-то "оптимизатор", который иногда работает плохо и его надо както "поправлять" Ты просто пока не сталкивался. Например, выполни поиск слова "хинт" в форуме https://www.sql.ru/forum/microsoft-sql-server. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 19:35 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Molochnik, упрости запрос по максимуму на которых проявляются тормоза. Приведи его здесь, статистику выполнения и explain план запроса. Кстати в MS SQL ном варианте тоже хотелось бы на план взглянуть ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 19:47 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
MolochnikЭто пока для меня слишком сложно, я сейчас почитаю как работает FB (ссылку дали). Но что интересно, если у меня был только MS, я бы и думать не знал что имеется какой-то "оптимизатор", который иногда работает плохо и его надо както "поправлять" :) IBExpert внизу, вместе со временем выполнения, показывает пресловутый план. Перечень использованных индексов. Причём они перечисляются в порядке перебора таблиц, на которых они созданы. То есть, индексы таблицы, от которой начинается перебор, идут первыми (если она вообще не идёт натуралом), первого уровня подчинённости - вторыми и так далее. Скажем, условие "on t1.id=t2.id" в иннер может быть выполнено как перебором t1 с подтягиванием записей из t2 по индексу на t2, так и наоборот. Посмотри на план и прикинь как ТЫ бы это делал сам, ручками, чтобы не за... за... устать, в общем. И если оптимизатор сделал наоборот, то имеем то, что имеем, и надо вправлять ему мозги подзатыльником. Типа "on t1.id+0=t2.id". Тогда t1 точно будет ведущей, а t2 подтягиваться по индексу. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 20:13 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Симонов Денис Старый плюшевый мишка Да все сделаю, посмотрю и проверю ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2019, 20:28 |
|
Firebird vs MS SQL
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаIBExpert внизу, вместе со временем выполнения, показывает пресловутый план там ещё статистика чтений показываетсЯ, сколько с диска и сколько с кэша в памяти особенно еслди сравнить один и тот же запрос по холодному и по горячему вполне возможно, что часть преимущества MS SQL просто в бОльшем кэше ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2019, 14:18 |
|
|
start [/forum/topic.php?fid=40&msg=39776592&tid=1560461]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
153ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 269ms |
total: | 544ms |
0 / 0 |