6

我遇到了系统过载的问题。下面的查询是从 3 个表中获取数据,其中 2 个表的记录超过 10.000 条,运行时间为 50 秒。

SELECT DISTINCT
p.prod_name,
p.prod_price,
Sum(dt.vt_qtd) as total_qtd

FROM tdb_products p 
LEFT JOIN tdb_sales_temp dt ON p.prod_mp_id = dt.vt_product
LEFT JOIN tdb_sales s ON dt.vt_cupom = s.sl_coupom

WHERE
s.sl_day = $day_link AND
s.sl_mon = $mon_link AND
s.sl_year = $year_link

GROUP BY
p.prod_name

ORDER BY
p.prod_name ASC

这是正常的吗?

解决!

4

2 回答 2

10
SELECT  prod_name, prod_price, SUM(dt.vt_qtd) AS total_qtd
FROM    tdb_sales s
JOIN    tdb_sales_temp dt
ON      dt.vt_cupom = s.sl_coupom
JOIN    tdb_products p
ON      p.prod_mp_id = dt.vt_product
WHERE   (s.sl_day, s.sl_mon, s_sl_year) = ($day_link, $mon_link, $year_link)
GROUP BY
        p.prod_name -- but it's better to group by product's PRIMARY KEY

删除DISTINCT(它是多余的GROUP BY并选择分组字段)

重写LEFT JOIN为因为您在'ed 表INNER JOIN上有过滤条件。LEFT JOIN

创建索引:

tdb_sales (sl_year, sl_mon, sl_day, sl_coupom)
tdb_sales_temp (vt_cupom, vt_product)
tdp_product (prod_mp_id) -- it's probably a PRIMARY KEY and you already have it
于 2013-01-16T18:35:59.440 回答
4

简短的回答是否定的,这绝对不是一个合适的时间长度。任何常见的数据库系统都应该能够以亚秒级的时间处理多个 10,000 行表。

不知道完整的架构或 dbms 后端,我的建议是:

索引 - 确保连接中使用的列有正确的索引 数据类型 - 如果连接的列的数据类型不同,dbms 必须为每个行连接执行转换,这可能导致显着的性能消耗。

于 2013-01-16T18:30:35.663 回答