Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个外键表的过滤器工作缓慢_Sql_Django_Performance_Database Design - Fatal编程技术网

Sql 两个外键表的过滤器工作缓慢

Sql 两个外键表的过滤器工作缓慢,sql,django,performance,database-design,Sql,Django,Performance,Database Design,*相应地,我不能添加代码,因为我不在那台计算机附近 简单模型包括: class Test static data about test class Site static data about site class Result foreign key Site foreign key Test startTime result 论据: listTest, listSite, listStatus 我做了一个查询,返回上面的列

*相应地,我不能添加代码,因为我不在那台计算机附近

简单模型包括:

class Test
    static data about test
class Site
    static data about site
class Result
    foreign key Site
    foreign key Test
    startTime
    result
论据:

   listTest,
   listSite,
   listStatus
我做了一个查询,返回上面的列表 返回表示需求交叉点的查询集

我现在想提出一个问题
返回的列表与给定列表相同
只有测试最后一个结果是否处于
listStatus


我做了一个for循环,如果我在超过5K的测试结果上使用它,需要一分钟以上的时间。

从你的问题中很难知道你在处理什么,无论是代码、数据库本身还是查询,所以这只是我的最佳猜测

如果导致在循环中执行查询,则存在N+1查询问题。从这些数据来看,您可以改为执行联接。但是,我不太确定您的数据库结构是什么样的,或者您希望查询返回什么样的结果,因此我无法为您提供SQL解决方案。我要说的是:许多数据库不会自动向外键列添加索引。因此,我建议采取以下步骤:

  • 确保对结果表上的两个外键列分别编制索引。如果没有这一点,join性能将受到影响
  • 重写循环,改为对数据库执行一个查询

  • 数据库在处理复杂查询和返回大量数据方面出人意料地高效。如果在循环中进行查询,则可能要花费大部分时间生成和解析SQL,并将数据编组到数据库和从数据库编组数据。使用返回大结果的大查询通常比重复使用返回小结果的小查询要高效得多。

    我添加了索引,因为ORM,我使用了循环。但我认为我将只使用一个SQL查询而不是ORM,因为它非常糟糕。ORM有两种基本风格:无所不能和轻量级。大多数轻量级ORM(我一直认为Django属于这一类)鼓励在SQL提高性能时直接将SQL传递到后端。您应该像现在一样包含模型的代码和查询,否则您收到的所有答案都只是推测性的!