Django просмотреть проблемы времени ответа - PullRequest
4 голосов
/ 10 августа 2011

Привет, у меня есть много объектов, которые я получаю из запроса, набор запросов еще не оценен, когда я передаю objectlist объекту paginator, для возврата объекта paginator потребовалось 14 секунд, потому что он оценивает все объекты в списке, который Потребовалось время (может быть, ударяя дБ).

Я принудительно оценил набор запросов перед отправкой его объекту-пагинатору как:

ds_objects = list(ds_objects)

Угадайте, что теперь нумерация страниц занимала 0,0 секунд при возвращении объекта, но проблема все еще остается, теперь все время занято ds_objects = list (ds_objects), как я могу сделать это эффективно, чтобы время отклика моего просмотра сократилось до 2 или 3 секунд? я не нашел лучшего решения: s

1 Ответ

1 голос
/ 10 августа 2011

Я предполагаю, что соединения (так что select_related) не важны для скорости запроса.В любом случае, когда вы делаете запрос values(), вам на самом деле не нужен select_related, потому что единственные поля, которые вы когда-либо получите, это поля, указанные как values() аргументы, и они все равно извлекаются JOIN.

Чтобы понять, почему это занимает так много времени, вы можете сделать следующее:

Распечатать «raw sql» с помощью

print tbl_action_log.objects.order_by('-TicketID', '-ActionLogID').query

Изменить его (на самом деле это не SQL, но он должен быть рядомдостаточно) для запуска в клиенте SQL, например, в собственном django manage.py dbshell.

Выполните его, обратите внимание на время.Выполните затем EXPLAIN ... (поместите ваш запрос в точки), вы, вероятно, увидите какое-то сообщение «полное сканирование таблицы»

Добавьте правильный индекс в таблицу базы данных по затронутым столбцам и выполните запрос еще раз,Индекс, вероятно, будет таким:

CREATE INDEX idx_action_log_on_tkid_logid ON tbl_action_log (TicketID, ActionLogID);

Если вы удовлетворены индексом, сохраните его команду создания в файле app/sql/modelname.sql, это создаст индекс в любом новом развертывании.

...