PostgreSQL + Django обновляет большую таблицу, для запуска простого обновления требуется много времени ⇐ Python
-
Anonymous
PostgreSQL + Django обновляет большую таблицу, для запуска простого обновления требуется много времени
У меня есть таблица, в которой около 47 миллионов записей. Мне нужно очень быстро обновить эту таблицу примерно для 3 миллионов записей, для этого я использую type_id и int внутри диапазона для выбора записей, а затем обновляю значение в другом поле, исключая при этом другую запись. ОБНОВЛЕНИЕ "table_name" SET "changes" = 12 WHERE ("table_name". "type_id" = 78 И "table_name"."rank" МЕЖДУ 2 И 2238079 И НЕ ("table_name"."id" = 55423921)) Этот запрос был автоматически сгенерирован Django с использованием метода update в QuerySet, но он соответствует описанному выше поведению и может быть изменен на более эффективный.
Причина, по которой я храню все эти записи в одной таблице, заключается в том, чтобы динамически добавлять внутрь новый type_id без необходимости создавать новую таблицу для каждой (при условии, что это улучшит скорость).
>
В настоящее время таблица имеет несколько индексов, но давайте сначала перечислим поля:
id (PK); тип (внешний ключ, содержащий идентификатор + имя типа); оценка (BigInt); Score_data (метаданные jsonb fr); изменения (IntField); ранг (IntField, используется для выбора диапазона); пользователь (внешний ключ пользователя, связанного с этой записью); Существуют разные индексы:
[*]BTree для полей оценка и ранг [*]введите PK, возможно, BTree (это индекс по умолчанию) [*]пользователь, такой же, как тип
Как вы, наверное, догадались, я создаю систему таблицы лидеров, которая сохраняет свой рейтинг и изменяется непосредственно внутри результатов.
Мои вопросы:
[*]Следует ли разделить таблицы на разные типы, чтобы повысить скорость? [*]Должен ли я сделать вышеописанное и сделать ранг ПК [*]Есть ли лучший индекс для упорядоченной таблицы, где я мог бы просто упорядочить по оценке и не беспокоиться о ранге и изменениях? [*]Есть ли простой способ повысить скорость запросов на обновление с помощью rawsql?
Время выполнения включенного запроса составило 4 минуты, что очень долго.
Я открыт для предложений, эту таблицу и всю структуру можно немного изменить (при условии, что мы сохраняем тот же тип хранимых данных).
У меня есть таблица, в которой около 47 миллионов записей. Мне нужно очень быстро обновить эту таблицу примерно для 3 миллионов записей, для этого я использую type_id и int внутри диапазона для выбора записей, а затем обновляю значение в другом поле, исключая при этом другую запись. ОБНОВЛЕНИЕ "table_name" SET "changes" = 12 WHERE ("table_name". "type_id" = 78 И "table_name"."rank" МЕЖДУ 2 И 2238079 И НЕ ("table_name"."id" = 55423921)) Этот запрос был автоматически сгенерирован Django с использованием метода update в QuerySet, но он соответствует описанному выше поведению и может быть изменен на более эффективный.
Причина, по которой я храню все эти записи в одной таблице, заключается в том, чтобы динамически добавлять внутрь новый type_id без необходимости создавать новую таблицу для каждой (при условии, что это улучшит скорость).
>
В настоящее время таблица имеет несколько индексов, но давайте сначала перечислим поля:
id (PK); тип (внешний ключ, содержащий идентификатор + имя типа); оценка (BigInt); Score_data (метаданные jsonb fr); изменения (IntField); ранг (IntField, используется для выбора диапазона); пользователь (внешний ключ пользователя, связанного с этой записью); Существуют разные индексы:
[*]BTree для полей оценка и ранг [*]введите PK, возможно, BTree (это индекс по умолчанию) [*]пользователь, такой же, как тип
Как вы, наверное, догадались, я создаю систему таблицы лидеров, которая сохраняет свой рейтинг и изменяется непосредственно внутри результатов.
Мои вопросы:
[*]Следует ли разделить таблицы на разные типы, чтобы повысить скорость? [*]Должен ли я сделать вышеописанное и сделать ранг ПК [*]Есть ли лучший индекс для упорядоченной таблицы, где я мог бы просто упорядочить по оценке и не беспокоиться о ранге и изменениях? [*]Есть ли простой способ повысить скорость запросов на обновление с помощью rawsql?
Время выполнения включенного запроса составило 4 минуты, что очень долго.
Я открыт для предложений, эту таблицу и всю структуру можно немного изменить (при условии, что мы сохраняем тот же тип хранимых данных).