Обновить вслепую или обновить где? - PullRequest
1 голос
/ 24 сентября 2008

У меня есть таблица, содержащая информацию о городах в игре, вы можете строить одно здание за ход, и это записывается со значением «usedBuilding».

Каждый ход я буду запускать скрипт, который изменяет usedBuilding на 0, вопрос в том, какой из следующих двух способов быстрее и имеет ли значение, какой способ используется?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;

Ответы [ 8 ]

4 голосов
/ 24 сентября 2008

В общем случае предложение 2-го случая (с WHERE) будет более быстрым, поскольку оно не приведет к оценке триггера, регистрации транзакций, обновлению индекса и т. Д. Для неиспользуемых строк.

Потенциально - в зависимости от распределения значений 0/1 на самом деле может быть быстрее обновить все строки, чем проводить сравнение - но это довольно вырожденный случай.

Поскольку ~ 95% затрат на ваш запрос составляют операции ввода-вывода, использование предложения WHERE не будет иметь никакого значения (поскольку столбец не проиндексирован, и вы выполняете сканирование таблицы), или огромной разницы (если столбец индексируется, или таблица секционируется и т. д.). В любом случае, это не больно.

Я подозреваю, что для объема данных, которые вы говорите, вы не заметите разницы ни в планах выполнения, ни в скорости - что делает его академическим в лучшем случае преждевременной оптимизацией в худшем. Поэтому я бы посоветовал использовать все, что логично для вашего приложения.

3 голосов
/ 24 сентября 2008

Попробуйте оба раза в цикле несколько тысяч раз и определите время! Вероятно, это зависит от того, сколько записей на самом деле находится в этой таблице, и все ли они помещаются в памяти или должны быть перенесены на диск. Сколько зданий имеют значение 1 до запуска обновления (я предполагаю, что это может быть 1).

Неважно, какой путь используется, но самый короткий, вероятно, имеет наименьшее, которое может пойти не так. Код, который вы не пишете, не может содержать ошибок.

3 голосов
/ 24 сентября 2008

Если usedBuilding проиндексирован, будет быстрее использовать предложение where, поскольку он будет получать доступ / обновлять только те строки, для которых usedBuilding имеет значение true. Если он не проиндексирован, вы все равно будете выполнять полное сканирование таблицы, так что это не будет иметь большого (какого-либо) значения.

2 голосов
/ 24 сентября 2008

Как часто происходят эти повороты? Сколько строк вы ожидаете иметь в этой таблице? Если ответы «менее одного раза в секунду» и «менее 10000», просто перестаньте беспокоиться.

Если, конечно, у вас к этому нет академического интереса, конечно.

1 голос
/ 24 сентября 2008

Сколько строк у вас будет? Я подозреваю, что для маленькой онлайн-игры вам все равно.

Если вы выполняете несколько обновлений таблицы «городов», было бы неплохо сделать их все в одном выражении UPDATE, если это возможно.

Для внесения любых изменений в строку, вероятно, потребуется столько же операций ввода-вывода, сколько для записи всей строки (кроме того, что обновление индексированных столбцов также требует записи в индекс), поэтому вы проиграете, сделав несколько ОБНОВЛЕНИЙ, которые попадут во множество строк.

Но если у вас, скажем, <1000 строк, вам действительно все равно:) </p>

1 голос
/ 24 сентября 2008

индексация вам совсем не поможет, если у вас нет примерно 2% значений usedBuilding = 1.

однако эти 2 утверждения логически различны и могут означать совершенно разные вещи. но если для вашего случая они совпадают, используйте тот, который не содержит предложения where.

1 голос
/ 24 сентября 2008

Лучший способ получить окончательный ответ - это профилирование с использованием большого количества выборочных данных при различных сценариях.

1 голос
/ 24 сентября 2008

Похоже, что было бы меньшее количество транзакций, чтобы сделать "ОБНОВЛЕНИЕ городов SET SET usedBuilding = 0;" выполнить, чем более конкретный запрос. Основная причина, по которой я могу подумать против этого, состоит в том, что в вашей колонке было более одного состояния. Если это просто логическое значение, тогда все будет в порядке, но вы можете потратить некоторое время на размышления, будет ли это всегда так.

Индексирование также может повысить эффективность плана выполнения с помощью предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...