我已经改写了上一个问题MS Access 2010 SQL Top N query by group performance issue (continued),因为我认为以前没有清楚地描述过上下文。我上一个问题的问题没有按组结果提供前n个。重新提出的问题更为通用。我现在把所有数据放在一个表中。
这是我的情况:我有一个表(分析),其中包含各种类别(类别)的产品(Partnumber)。每个产品都有价格(价值)。查询的目的是显示每个类别中价格最高的10种产品。该表包含15000条记录并将继续增长。
这是查询:
SELECT
a.Location,
a.Category,
a.Partnumber
a.Value
FROM Analysis a
WHERE a.Partnumber IN (
SELECT TOP 10 aa.Partnumber
FROM Analysis aa
WHERE aa.Category = a.Category
ORDER BY aa.Value DESC
)
ORDER BY
a.Category;
以下是我的问题:我当前的查询适用于表格中的1000条记录(响应时间为3秒)。有15000条记录,查询运行的时间很长。如何重建查询以显着提高性能?
我上一个问题的答案是不使用列表操作。但这消除了按组提供前n个记录的功能。该查询给出了所有记录的前n个。
答案 0 :(得分:1)
对于名为[Analysis]
的表中的样本数据ID Location Category Partnumber Value
-- --------- -------- ---------- -----
1 here cat1 part001 1
2 there cat1 part002 2
3 wherever cat1 part003 3
4 someplace cat2 part004 4
5 nowhere cat2 part005 5
6 unknown cat2 part006 6
"排名查询"
SELECT
a1.ID,
a1.Location,
a1.Category,
a1.Partnumber,
a1.Value,
COUNT(*) AS CategoryRank
FROM
Analysis a1
INNER JOIN
Analysis a2
ON a1.Category = a2.Category
AND a1.Value <= a2.Value
GROUP BY
a1.ID,
a1.Location,
a1.Category,
a1.Partnumber,
a1.Value
返回
ID Location Category Partnumber Value CategoryRank
-- --------- -------- ---------- ----- ------------
1 here cat1 part001 1 3
2 there cat1 part002 2 2
3 wherever cat1 part003 3 1
4 someplace cat2 part004 4 3
5 nowhere cat2 part005 5 2
6 unknown cat2 part006 6 1
所以,如果您只想要每个类别中的前2个项目,只需将上述查询包装在SELECT ... WHERE
中SELECT *
FROM
(
SELECT
a1.ID,
a1.Location,
a1.Category,
a1.Partnumber,
a1.Value,
COUNT(*) AS CategoryRank
FROM
Analysis a1
INNER JOIN
Analysis a2
ON a1.Category = a2.Category
AND a1.Value <= a2.Value
GROUP BY
a1.ID,
a1.Location,
a1.Category,
a1.Partnumber,
a1.Value
) AS RankingQuery
WHERE CategoryRank <= 2
ORDER BY Category, CategoryRank
给你
ID Location Category Partnumber Value CategoryRank
-- -------- -------- ---------- ----- ------------
3 wherever cat1 part003 3 1
2 there cat1 part002 2 2
6 unknown cat2 part006 6 1
5 nowhere cat2 part005 5 2
注意:确保索引[类别]和[值]字段以获得最佳性能。