按组性能问题的MS Access 2010 SQL前N个查询(续2)

时间:2014-06-25 09:33:53

标签: sql performance ms-access-2010 query-performance

我已经改写了上一个问题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个。

1 个答案:

答案 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

注意:确保索引[类别]和[值]字段以获得最佳性能。