我正在使用Django来显示一系列测试结果。我创建了一个视图来显示每个测试结果的最新实例。
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行在大约1秒钟内使用这些ID创建一个约800个条目的新QuerySet。
第5行基本上没时间删除字典。
由此我认为(空白)页面将在大约15秒内加载。在实践中,加载需要大约3分钟。
删除第3行可以立即加载页面。
任何想法是什么导致超过2分钟的延迟?由于我没有向HttpResponse传递任何内容,我认为它与字典的垃圾收集有关,因此第5行诞生了。
答案 0 :(得分:1)
我的猜测是你有n + 1问题
如果是这样,当您遍历结果集时,您正在进行20,000次查询。
您可以使用select_related来避免这种情况:
results = resultTable.objects.select_related('testcase').order_by('id')
答案 1 :(得分:0)
如果我可以从您的代码中猜测逻辑,那么您正在尝试查找具有不同值testcase.name
的最新ID。提高性能的唯一方法是避免从查询集在内存中构建一个庞大的字典。所以这是尝试将其变成一个简单的查询:
latestResultQuerySet = resultTable.objects.order_by('testcase__name', 'id').distinct('testcase__name')