MSSQL查询调优


MSSQL query tuning

我有以下场景:

1客户有两个产品列表(一个公共,一个私人),这些列表有许多产品,有些产品可以出现在两个列表中。如果产品出现在私人列表中,我想得到它,否则我会选择公共列表中的产品。

在你看来,实现这一目标的最快方法是什么?到目前为止,我已经尝试了以下几种:

  • UNION ALL然后删除PHP中的重复项(性能平平)
  • UNION(性能不佳)

还有其他实现这一目标的可能性吗?

编辑

这是一把小提琴,展示我的技艺http://sqlfiddle.com/#!6/41d2e/2

在fiddle中,我假设列表id为7和1,因为它们是客户1的列表id,我没有使用join,因为我已经从php中检索到了这些id。

我需要的是从私有列表中检索产品(如果存在),否则从公共中检索

作为一个更像mysql的人,我通常会在没有聚合的情况下使用group-by来完成这项工作,所以mysql按照正确的顺序进行taht只会剪切不需要的记录(这是一种糟糕的做法,但足够可靠和性能):

select *
from pricelist
where listId in (1, 7) 
order by listId asc
group by artnum

因此,例如,如果我想获得客户端id 1的所有产品,我需要检索这些产品:

ID  ARTNUM  ARTDES  LISTID  PRICE
1   1000    potatoes    1   20
1   1001    carrots     7   4

由于客户端1有两个列表:1和7(土豆同时出现在列表1和7中,所以我只想把土豆放在客户端私有列表中,而不是公共列表中)

希望我足够清楚,很抱歉所有这些编辑

由于我不知道如何在纯SQL中正确地做到这一点,我使用了一种PHP方法:

  • 检索不带UNION/UUNION ALL的两个查询
  • 创建2个php集合
  • 合并两个集合以删除重复项