|
|
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! В карточке клиента есть поле, в котором накапливается сумма его покупок. Почему в карточке и почему статично, а не вычисляется по запросу при необходимости - другой вопрос и к данной задаче отношения не имеет. Задача - периодически корректировать значение в этом поле. Планирую использовать такой запрос Код: sql 1. 2. 3. 4. 5. 6. Вопрос первый - насколько оптимален такой запрос и если не оптимален - какие есть варианты его реализации? Вопрос второй - будет ли сервер неявно блокировать таблицы клиентов и продаж или только изменяемые записи или вообще не будет ничего блокировать? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 02:48:10 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
В догонку - в таблице moves есть необходимый ключ по продажам клиента. Explain показывает, что именно этот ключ и будет использоваться для селекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 02:51:21 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
OlegROA, может там все же SUM добавить? ddl таблиц давай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 07:03:53 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
MasterZivOlegROA, может там все же SUM добавить? ddl таблиц давай.Прошу прощения - да, естественно, там SUM используется. И исходное задание я немного упростил - надо не одно поле а сразу два изменять этим запросом. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Для обновления одного поля, имхо, подходит запрос: Код: sql 1. 2. 3. 4. 5. 6. Как бы в этот запрос добавить обновление второго поля mem.sum2, что-бы его значение подсчитывалось в том-же селекте? Что-то типа: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 22:38:47 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
OlegROAКак бы в этот запрос добавить обновление второго поля mem.sum2, что-бы его значение подсчитывалось в том-же селекте? Что-то типа: Код: sql 1. 2. 3. 4. 5. 6. Когда ж уже маны начнут читать ниже первой строки... до многотабличного апдейта - не дочитал, что ли? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 23:03:07 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
AkinaКогда ж уже маны начнут читать ниже первой строки... до многотабличного апдейта - не дочитал, что ли?Дочитал и даже несколько раз перечитывал! Но я не додумался, что в качестве одной из таблиц может выступать не физическая таблица, а простая выборка! Хотя последний пример из доки, где заданы две таблицы, но изменяется колонка только первой, должен был натолкнуть на нужную мысль! Спасибо, большое!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 23:48:53 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
OlegROAНо я не додумался, что в качестве одной из таблиц может выступать не физическая таблица, а простая выборка!читаем этоавтор table_references and where_condition are is specified as described in Section 13.2.8, “SELECT Syntax”.идём по ссылке, читаем это:авторtable_references indicates the table or tables from which to retrieve rows. Its syntax is described in Section 13.2.8.2, “JOIN Syntax”.ещё раз идём по ссылке и вкуриваем написанное там :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 06:54:50 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
Кстати, еще вопрос по последнему варианту кода от Akin`ы - для ограничения пересчета только по одному клиенту, добавил в селект по moves условие просмотра продаж по этому клиенту и это же условие добавил в последний where по update Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Константа 1001 в данном случае используется для тестирования. Так вот, explain по такому запросу выдает: 'id''select_type''table''type''possible_keys''key''key_len''ref''rows''extra''1' 'PRIMARY' 'mem' 'const' 'PRIMARY' 'PRIMARY' '4' 'const' '1' NULL'1' 'PRIMARY' '<derived2>' 'ref' '<auto_key0>' '<auto_key0>' '4' 'const' '10' NULL'2' 'DERIVED' 'mov' 'ref' 'MemCard_Key' 'MemCard_Key' '4' 'const' '572' NULL Интересует вторая строка - какие 10 строк сервер собирается по этому подзапросу выбирать? Ведь селект вернет только одну строку с итогами по клиенту 1001 и в таблице members тоже только одна запись по клиенту 1001! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 14:34:04 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
Отрабатывает, кстати, последний запрос правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 14:38:06 |
|
||
|
Оптимизация UPDATE ... SELECT?
|
|||
|---|---|---|---|
|
#18+
OlegROAкакие 10 строк сервер собирается по этому подзапросу выбирать?Да кто ж его знает... а с чего ты решил, что он собирается выбрать именно 10 строк? просто ещё без обращения к данным на основе статистики серверу показалось, что придётся выбрать 10... реально на самом деле выберется 1... ну и что? невеликая ошибка-то, это ж не на полтаблицы мимо. Запусти аналайз - значения авось и поменяются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2014, 22:17:39 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1835341]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
22ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 284ms |

| 0 / 0 |
