Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 使用nexted联接的查询需要很长时间_Sql - Fatal编程技术网

Sql 使用nexted联接的查询需要很长时间

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

我有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,
    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)