MSSQL 查询调优
MSSQL query tuning
我有以下场景:
1 Client have 2 products lists (one common, one private), those lists have many products, some products can appear in the two lists. If the product appear in the private list, I want to get it, otherwise I'll take the one in the common list.
您认为实现此目标的最快方法是什么?到目前为止,我已经尝试了以下方法:
- UNION ALL 然后删除 PHP 中的重复项(表现一般)
- UNION(表现不佳)
是否有其他方法可以实现这一点?
编辑
这是 fiddle 展示我所拥有的 http://sqlfiddle.com/#!6/41d2e/2
在 fiddle 中,我假设列表 ID 为 7 和 1,因为它们是客户 1 的列表 ID,我没有使用连接,因为我已经从 php 中检索到了这些 ID。
我需要的是从私有列表中检索产品(如果存在),否则从 public
作为一个 mysql 人,我通常会在没有聚合的情况下使用 group by 来执行此操作,因此按 mysql 的正确顺序会简单地删除不需要的记录(不好的做法,但是坚固且性能足够):
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 有 2 个列表:1 和 7(土豆同时出现在列表 1 和 7 中,所以我只想要客户端私有列表中的土豆,而不是 public 中的土豆)
希望我说得够清楚,抱歉所有这些编辑
因为我不知道如何在纯 SQL 中正确地做到这一点,我使用了 PHP 方法:
- 检索没有 UNION / UNION ALL 的两个查询
- 创建 2 php collections
- 合并 2 collections 删除重复项
我有以下场景:
1 Client have 2 products lists (one common, one private), those lists have many products, some products can appear in the two lists. If the product appear in the private list, I want to get it, otherwise I'll take the one in the common list.
您认为实现此目标的最快方法是什么?到目前为止,我已经尝试了以下方法:
- UNION ALL 然后删除 PHP 中的重复项(表现一般)
- UNION(表现不佳)
是否有其他方法可以实现这一点?
编辑
这是 fiddle 展示我所拥有的 http://sqlfiddle.com/#!6/41d2e/2
在 fiddle 中,我假设列表 ID 为 7 和 1,因为它们是客户 1 的列表 ID,我没有使用连接,因为我已经从 php 中检索到了这些 ID。
我需要的是从私有列表中检索产品(如果存在),否则从 public
作为一个 mysql 人,我通常会在没有聚合的情况下使用 group by 来执行此操作,因此按 mysql 的正确顺序会简单地删除不需要的记录(不好的做法,但是坚固且性能足够):
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 有 2 个列表:1 和 7(土豆同时出现在列表 1 和 7 中,所以我只想要客户端私有列表中的土豆,而不是 public 中的土豆)
希望我说得够清楚,抱歉所有这些编辑
因为我不知道如何在纯 SQL 中正确地做到这一点,我使用了 PHP 方法:
- 检索没有 UNION / UNION ALL 的两个查询
- 创建 2 php collections
- 合并 2 collections 删除重复项