0

使用 SQL 甲骨文。我创建了一个查询来查找食品订单的总数。

EXPLAIN PLAN FOR
SELECT FOOD.F_NAME, COUNT(ORDERS.O_ORDERID)
FROM ORDERS
INNER JOIN CUSTOMER ON O_CUSTID = C_CUSTID
INNER JOIN FOOD ON C_FOODKEY = F_FOODKEY
GROUP BY FOOD.F_NAME;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

3250这将返回计划表输出中行 ID 0 处的成本 (%CPU) 。

我了解到非规范化将加快查询速度并降低成本。在这种情况下,我从表中复制了食物名称FOODORDERS避免INNER JOIN. 我应该获得更好的成本 (%CPU) 使用率。

我接下来使用了这个查询

EXPLAIN PLAN FOR
SELECT ORDERS.F_NAME, COUNT(ORDERS.O_ORDERID)
FROM ORDERS
GROUP BY ORDERS.F_NAME;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

成本 (%CPU) 根本没有太大变化 - 该值3120位于计划表输出中的行 ID 0 处。

非规范化和删除INNER JOIN假设不是为了提高我的成本吗?在我的情况下,改进是如此微不足道。这里有什么问题?

4

2 回答 2

0

评论太长了。您将不得不研究执行计划。但是,主键上的连接通常不是特别昂贵。

昂贵的是GROUP BY,因为这需要移动数据。您可以尝试F_NAME在第二个查询中添加索引。

您的数据模型也很不寻常。目前还不清楚为什么一个名为的列FOOD会存储在该CUSTOMER级别。

于 2021-07-25T14:02:09.297 回答
0

C_FOODKEY应该最有可能O_FOODKEY是有意义的

您不需要非规范化。您正在做的是-您通过连接分解所有行,然后将它们组合在一起。不要一开始就这样做并尝试这样的事情

SELECT FOOD.F_NAME, 
      (SELECT COUNT(*) 
       FROM ORDERS 
       WHERE O_FOODKEY = F_FOODKEY) AS fCount
FROM FOOD 
于 2021-07-25T16:05:01.523 回答