我正在使用 Django 来显示一系列测试结果。我创建了一个 View 来显示每个测试结果的最新实例。
1: results = resultTable.objects.order_by('id')
2: latestResults = {}
3: for res in results: latestResults[res.testcase.name] = res.id
4: latestResultQuerySet = resultTable.objects.filter(id__in=latestResults.values())
5: del latestResults
6: return HttpResponse()
第 1 行在大约 1 秒内创建了一个包含大约 20,000 个条目的 QuerySet。
第3行在大约12秒内计算出每个测试用例的最新结果的id。
第 4 行使用这些 ID 在大约 1 秒内创建了一个包含大约 800 个条目的新查询集。
第 5 行基本上立即删除了字典。
由此我认为(空白)页面将在大约 15 秒内加载。实际上,加载大约需要 3 分钟。
删除第 3 行允许页面立即加载。
知道是什么导致了额外的 2 分钟以上的延迟吗?因为我没有向 HttpResponse 传递任何东西,所以我假设它与字典的垃圾收集有关,因此第 5 行诞生了。
请您参考如下方法:
我猜你有一个 n + 1问题
如果是这样,您将在循环遍历结果集时进行 20,000 次查询。
你可以使用select_related为了避免这种情况:
results = resultTable.objects.select_related('testcase').order_by('id')
