Вопрос

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

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

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Если вы выполняете несколько обновлений таблицы "города", было бы неплохо выполнить их все в одном операторе ОБНОВЛЕНИЯ, если это возможно.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top