我有一个名为客户的表,有10个字段
给定两个选项,如果我想建立一个订单对象的数组并嵌入到一个订单对象是一个客户对象,我有两个选择.
选项1:
一个.首先查询订单表.
湾循环记录并查询人员表以获取该人的记录
这将是:
Select * from APplications Select * from Customer where id = 1 Select * from Customer where id = 2 Select * from Customer where id = 3 Select * from Customer where id = etc . . .
选项二:
一个.在所有领域加入
它是一个明显的#2,因为你只做一个查询与1 [numberOforders]查询(可能是数百或更多)
这将是:
Select * from Applications a,Customers c Innerjoin c.id = a.customerID
我的主要问题是,如果我在订单表中有10个其他表格(类似于客户),那么你在订单表中有id.你应该做一个单独的查询连接这10个表,或者某种程度上是低效的做到这一点:
解决方法
最好的办法是首先尝试最简单的方法(大连接),看看它的效果如何.如果表现良好,那么很棒 – 你完成了.如果执行不佳,请对查询进行配置,并在表上查找缺少的索引.
由于网络往返次数(asijhaw提到),您的选项#1不太可能表现良好.这有时被称为“选择N 1”问题 – 您可以使用一个SELECT来获取N个应用程序的列表,然后在循环中执行N个SELECT以获得客户.这种记录在一起的循环对应用程序员来说是自然的;但是当您一次对整套数据进行操作时,sql的效果会更好.
如果选项#2甚至在索引较好的情况下也很慢,您可能需要查看缓存.您可以在应用程序(如果有足够的RAM)或专用缓存服务器(如memcached)中缓存数据库(使用汇总表或实体化/索引视图).当然,这取决于最新的查询结果需要.如果一切都必须完全更新,那么每当更新底层表时,都需要更新任何缓存 – 它变得复杂并变得不那么有用.
这听起来像是一个报告查询,而且报告通常不需要实时.所以缓存可能能够帮助你.
根据您的DBMS,需要考虑的另一个问题是此查询对其他查找同一数据库的查询的影响.如果您的DBMS允许读者阻止写入器,则如果运行需要很长时间,则此查询可能会阻止对表的更新.那将是坏的Oracle没有这个问题,而在“读提交快照”模式下运行时,sql Server也不会.我不知道MysqL.