"SELECT *
FROM property t1
LEFT
JOIN address t2
ON t1.pin = t2.pid
AND t1.status = t2.status
LEFT
JOIN ownerinfo t3
ON t1.pid = t3.pid
AND t1.status = t3.status
LEFT JOIN boundaries t4
ON t1.pid = t4.pid
AND t1.status = t4.status
LEFT
JOIN status t5
ON t1.pid = t5.pid
AND t1.status = t5.status
LEFT
JOIN references t6
ON t1.pid = t6.pid
AND t1.status = t6.status
LEFT
JOIN classification t7
ON t1.kind = t7.sysid
LEFT
JOIN oaddress t8
ON t1.basicinfo_id = t8.basicinfoid
LEFT
JOIN obasicinfo t9
ON t1.basicinfo_id = t9.id
WHERE t1.pid = :pid
AND t1.status = :status
"
这是我对左连接的查询。我使用左连接主要是因为会有一个时间或实例,其中一个表中没有与其他表相关的数据。但我仍然需要获取相关数据。如果我使用INNER JOIN
,如果是这种情况,我将无法获得结果。目前LEFT JOIN
完成了这项工作。但是我得到rowcount()
以后得到out of memory
6144
。对于2条目,在某些情况下,我在其他实例上获得12288
记录我得到out of memory
这是我获得insert
的位置(取决于哪个表有数据的组合,哪些有没有数据)。
INNER JOIN
期间填写所有表格并使用INNER JOIN
?rowcount()
会减少或减少rowcount()
的数量吗?UPDATE
?{{1}}
答案 0 :(得分:1)
它依赖于你的表结构可能在左表中返回几次的值很少,而且你收到的是Cartesian
答案 1 :(得分:0)
在不了解架构,应用程序或表格中的实际数据的情况下,我将采用疯狂的方法,并对每个属性t1.pid
进行粗略假设,每个表中的相关记录相对较少。
如果这是真的,我猜测数据爆炸的位置是两个表连接中的一个:
LEFT JOIN classification t7
ON t1.kind = t7.sysid
LEFT JOIN oaddress t8
ON t1.basicinfo_id = t8.basicinfoid
其中一个或两个看起来可能不够具体,所有其他JOINS都包含在ON
子句t1.pid
中,链接回原始property
表。
删除这两个JOINS,然后查看结果集是否显着缩小。如果是这样,请一次添加一个,以找出您的增长问题。
如果没有关于您的方案和数据的更多信息,我可以提供更多信息。添加到OP中列出的表的create table
语句将非常有用。
答案 2 :(得分:0)
这取决于表格的关系。让我们假设您有1000个属性,每个属性有2个分类记录,那么总行数将是2000,依此类推。这取决于您所遵循的逻辑以及您创建的结构。
如果每个连接表应该只有一个记录最大值(即属性表是关系的“多边”),那么在这种情况下它永远不会超过1000.
这只是连接和数据库结构的本质。