Sql 使用nexted联接的查询需要很长时间
我有4张桌子: 域: :有许多=>频道 :有多少销售额 :有多少次=>访问 我正在尝试获取此查询中每个域的所有域、渠道计数、销售计数和访问计数:Sql 使用nexted联接的查询需要很长时间,sql,Sql,我有4张桌子: 域: :有许多=>频道 :有多少销售额 :有多少次=>访问 我正在尝试获取此查询中每个域的所有域、渠道计数、销售计数和访问计数: SELECT kd.id, kd.domain, COUNT(distinct kc.id) AS channels_count, COUNT(distinct kv.id) AS visits_count, COUNT(distinct kv.ip_address) AS visitors_count, COU
SELECT
kd.id, kd.domain,
COUNT(distinct kc.id) AS channels_count,
COUNT(distinct kv.id) AS visits_count,
COUNT(distinct kv.ip_address) AS visitors_count,
COUNT(distinct ks.id) AS sales_count
FROM
domains AS kd
LEFT JOIN
channels AS kc
ON(kc.domain_id=kd.id)
LEFT JOIN
sales AS ks
ON(ks.channel_id=kc.id)
LEFT JOIN
visits AS kv
ON(kv.channel_id=kc.id)
GROUP BY kd.id
我在sales and Visitions表中有几千条记录,没什么大不了的,但我的查询需要花费很长时间。它再也不会回来了。知道为什么吗
db:postgresql计数(不同)可以是资源占用。此外,您的表在“kd.id”列上可能有许多重复项,从而生成了无数行
一种更有效的方法是首先进行聚合,然后将结果连接在一起。我认为以下查询符合您的要求(我假设每个表中的id列都是唯一的):
按kd.id分组对于那个数量的记录,您需要实现索引。您是否在相关表中定义了外键
kc.domain\u id、kv.channel\u id、kv.channel\u id
,以及相应的索引?是的,我在所有连接点上都有索引。解释显示被拉取的记录数量过多,因此我猜这是因为我必须将我的通道表与另外两个表连接在一起,但我似乎没有发现任何错误。如果你有索引,那么可能是计数(distinct)造成的。你是否尝试排除计数(distinct kv.ip\U地址)看看你得到了什么样的响应?如果你有很多记录,字符串域上的distinct可能不会很快。没有字符串域。Ip地址是10位整数,保存为长(long2ip)。我希望它能更干净,但它在结果方面是完美的。谢谢。
SELECT kd.id, kd.domain, channels_count, visits_count,
visitors_count, sales_count
FROM domains kd LEFT JOIN
(select kc.domain_id, count(*) as channels_count
from channels kc
group by kc.domain_id
) kc
ON(kc.domain_id=kd.id) LEFT JOIN
(select ks.channel_id, count(*) as sales_count
from sales ks
group by ks.channel_id
) ks
ON(ks.channel_id=kc.id) LEFT JOIN
(select kv.channel_id, count(*) as visits_count,
count(distinct ipaddress) as visitors_count
from visits kv
on kv.channel_id
)
ON(kv.channel_id=kc.id)