【问题标题】:SQL How to get the result from the statement faster?SQL 如何更快地从语句中获取结果?
【发布时间】:2014-02-24 00:33:07
【问题描述】:

我怎样才能让这个 SQL 语句更小,比如只在某个地方使用一次 WHERE,以更快地获得结果?谢谢!

SELECT p.model, pc.price FROM Product AS p
JOIN PC AS pc
  ON pc.model = p.model
WHERE p.maker='B'

UNION
SELECT p.model, lp.price FROM Product AS p
JOIN Laptop AS lp
  ON p.model = lp.model
WHERE p.maker='B'

UNION
SELECT p.model, pr.price FROM Product AS p
JOIN Printer AS pr
  ON p.model = pr.model
WHERE p.maker='B'

编辑:我希望它更快。

【问题讨论】:

  • 非常容易阅读。为什么要改变它?
  • 我教过也许有更好/更快的方法来获得结果。
  • 除了规范化为单个产品表并具有指定类型的标识符...
  • 压缩代码 更快的结果
  • 您可以通过将每个union 替换为union all 来加快速度。

标签: sql select join union


【解决方案1】:

我可能会保持原样,除非您打算添加更多内容。但作为对您问题的字面回答:

select pr.model,
       case
         when pc.price is not null then
          pc.price
         when lp.price is not null then
          lp.price
         when pt.price is not null then
          pt.price
         else
          null
       end as price
  from product pr
  left join pc
    on pr.model = pc.model
  left join laptop lp
    on pr.model = lp.model
  left join printer pt
    on pr.model = pt.model
 where pr.maker = 'B'

【讨论】:

  • 您可以将 case 替换为 coalesce(pc.price, lp.price, pt.price)
【解决方案2】:

加快查询速度的最佳方法可能是将每个union 替换为union all,然后添加以下索引:

create index product_maker_model on produce(maker, model);
create index pc_model_price on pc(model, price);
create index laptop_model_price on laptop(model, price);
create index printer_model_price on printer(model, price);

查询是:

SELECT p.model, pc.price
FROM Product p JOIN
     PC pc
     ON pc.model = p.model
WHERE p.maker = 'B'
UNION ALL
SELECT p.model, lp.price
FROM Product p JOIN
     Laptop lp
     ON p.model = lp.model
WHERE p.maker = 'B'
UNION ALL
SELECT p.model, pr.price
FROM Product p JOIN
     Printer pr
     ON p.model = pr.model;
WHERE p.maker = 'B';

相同的索引也会加快left outer join 版本的速度。哪个更快取决于多种因素,但左外连接版本的性能可能更好。

【讨论】:

    【解决方案3】:

    尝试 CTE。

    伪。不在航站楼前。

    With product as
    (
    Select fields from PC union all
    Select fields from laptop union all
    Select fields from printers
    )
    Select fields from product where maker = b
    

    【讨论】:

    • 是的,就是这样!谢谢!
    • 确保您的字段匹配。在 with 前面加一个分号。也许有人可以将其格式化为我的代码。对不起,我在打电话。
    • 即使没有这样标记,我猜 OP 必须使用 sql-server?
    • 正如 OP 想要的那样 faster ways to get the result - 这有帮助吗?
    • 查看我对主帖的评论。除了标准化。这可能取决于优化器 a​​ 如何看待它。虽然不是保证。索引和规范化是门票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2019-03-05
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多