Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запросы Interbase/Firebird, MSSQL, MySQL и т.д.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понял! Сразу не дошло. В понедельник на работе добавлю поле и о результатах скорости отпишусь. Но если логически подумать то будет работать гораздо быстрее. Спасибо!

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 10:42 28-02-2016
zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скорость действительно увеличилась с введением поля dateoff. Спасибо KDPoid. Благо менять в базе не так много придётся.

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 08:27 29-02-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чего то я не врубаюсь, может чего не понимаю. Вдруг здесь найдется кто соображает )
есть запрос QUERY, выбирающий 226 строк (плюс кое какие подсчеты) из миллионов

Цитата:
/* Affected rows: 0  Found rows: 226  Warnings: 0  Duration for 1 query: 2.265 sec. */

далее я пытаюсь этими данными изменить записи в другой таблице TABLE запросом вида

Код:
UPDATE (QUERY) q JOIN TABLE t ON t.column1 = q.column1 AND t.column2 = q.column2
SET t.column3 = q.column3

условия в ON выбирают записи 1 к 1, то есть измениться должны те 226 строк. explain при этом показывает, что MySQL собирается обрабатывать гораздо больше строк, приводя к очень длительному запросу.
при этом запрос вида

Код:
SELECT * FROM (QUERY) q JOIN TABLE t ON t.column1 = q.column1 AND t.column2 = q.column2

срабатывает за
Цитата:
/* Affected rows: 0  Found rows: 226  Warnings: 0  Duration for 1 query: 2.375 sec. */

 
вот как так то? или может есть какой иной способ обновить данные в таблице полученные запросом?
 
ps: использование временной таблицы для QUERY и потом ее использование помогает, но все же..

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 08:37 19-07-2018 | Исправлено: Mavrikii, 09:02 19-07-2018
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
стандарт определяет следующий синтаксис
 
[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
UPDATE [ ONLY ] имя_таблицы [ * ] [ [ AS ] псевдоним ]
    SET { имя_столбца = { выражение | DEFAULT } |
          ( имя_столбца [, ...] ) = [ ROW ] ( { выражение | DEFAULT } [, ...] ) |
          ( имя_столбца [, ...] ) = ( вложенный_SELECT )
        } [, ...]
    [ FROM список_FROM ]
    [ WHERE условие | WHERE CURRENT OF имя_курсора ]
    [ RETURNING * | выражение_результата [ [ AS ] имя_результата ] [, ...] ]
 
Для mysql не скажу как правильно, но по логике во From пиши свой подзапрос

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 09:56 20-07-2018 | Исправлено: uranic2, 09:58 20-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
uranic2

Цитата:
Для mysql не скажу как правильно

у него такого нет - https://dev.mysql.com/doc/refman/8.0/en/update.html

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:12 20-07-2018
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
удя по синтаксису, тогда так
 
update <mytable> , <query> set <mytable>.<field> = <query>.<field>
where <mytable>.<keyfield> =<query>.keyfield

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 10:20 20-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
uranic2

Цитата:
тогда так  

это полностью аналогично тому, что я написал в первом посте через JOIN

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:21 20-07-2018
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я так понял у тебя таблица большая. Посмотри есть ли индекс по полям, по которому ты делаешь join

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 10:24 20-07-2018 | Исправлено: uranic2, 10:25 20-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
uranic2

Цитата:
я так понял у тебя таблица большая. Посмотри есть ли индекс по полям, по которому ты делаешь

я же показал, что проблема не в индексах. индексы есть и они работают.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:25 20-07-2018
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
explain при этом показывает, что MySQL собирается обрабатывать гораздо больше строк, приводя к очень длительному запросу.

 
Давай сюда план запроса, а то не совсем понятно

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 10:27 20-07-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
uranic2
я уже переписал через временную таблицу. да, лишние телодвижения, но все выполняется за 2.5 секунды (в отличие от сотен секунд той ситуации, что описывал выше).  
 
если я покажу explain, то там слишком много всего. проблемы, судя по всему, возникают с derived таблицами, так как с ними не работают оптимизации, и везде рекомендуют использовать временные или CTE (скорее всего перейду именно на него)
 
ситуация несколько похожа на это - https://dba.stackexchange.com/questions/116653/mysql-why-is-this-update-query-so-incredibly-slow

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:51 20-07-2018
uranic2

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Эх, с MySQL я на серьезных проектах не работал, в последнее время на postgresql. По идее только посмотрев на план запросы можно понять поему так долго выполнятеся запрос

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 11:34 20-07-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запросы Interbase/Firebird, MSSQL, MySQL и т.д.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru