1个大型SQL查询为Zend中的每一行执行多个单个查询

时间:2012-12-26 08:33:44

标签: sql postgresql zend-framework

标题可能有点不清楚,但我会解释:

以下查询:

SELECT DISTINCT t.something FROM table1 as m  LEFT JOIN table2 as t ON
t.id = m.id  LEFT JOIN table3 as c ON t.id = c.id  WHERE ... LIMIT
1000;

的限制为1000.现在这是在特定操作中执行的唯一查询,现在安装了Zend调试工具,当我查看在该页面上执行的sql查询时,我看到此查询与以下一次1000次(对于每行结果1次,每行的id:

SELECT "table1".* FROM table1 WHERE ((("table1"."id" = *id*)))

这使得页面的性能真的很慢,我不认为所有这些查询都是必要的,所以我正在寻找一个解决方案,所以所有这些查询都不再执行,性能会更好。

任何认识到这种情况的人?

PS:可能很高兴知道我将Postgresql和Zend框架一起使用

1 个答案:

答案 0 :(得分:1)

这更像是一个古老的谜语,人们必须猜测他的方式而不是程序员的问题。

您的网页上似乎需要超过something,但您的查询只会检索something。然后,你非常聪明的应用程序分别获取每一行 - 一场性能灾难。

我还,您在问题中提供的查询错误(除了效率低下),应阅读:

SELECT DISTINCT m.something
FROM   table1 as m
LEFT   JOIN table2 as t ON t.id = m.id
LEFT   JOIN table3 as c ON t.id = c.id
WHERE  ...
LIMIT  1000;

..这可能仍然是胡说八道,取决于您保留给我们的实际WHERE条款。

使用有意义的表别名检索整行(或只是您需要的列):

SELECT DISTINCT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t2.id = t1.id
LEFT JOIN table3 t3 ON t3.id = t2.id
WHERE ...
LIMIT 1000;

为了更有效地做同样的事情(前提是table1开头没有欺骗):

SELECT t1.*
FROM   table1 t1
WHERE EXISTS (
    SELECT 1 
    FROM   table2      t2
    LEFT   JOIN table3 t3 USING (id)
    WHERE  ON t2.id = t1.id
    )
AND ...
LIMIT 1000;