0

每个人都希望我更具体。我正在尝试使用 asp classic 和 ms-access 数据库进行分页。这是我用来获取第 2 页的项目的查询。每页有 25 个项目,当查询返回更大的数据集(例如大约 500+)时,执行大约需要 20+ 秒,是的,我已将 sku 编入索引更快的查询。有什么建议么。

SELECT TOP 25 *
FROM catalog
WHERE sku LIKE '1W%'
AND sku NOT IN (SELECT TOP 25 sku
                FROM catalog
                WHERE sku LIKE '1W%' ORDER BY price DESC ) ORDER BY price DESC
4

5 回答 5

2

TOPwithoutORDER BY看起来没用或至少很奇怪。我猜你打算使用这个子查询:

( SELECT TOP 25 sku
  FROM catalog
  WHERE sku LIKE '1W%' 
  ORDER BY sku
)

sku如果没有,请在 上添加索引。

对于 Access,可能会重写查询:

SELECT *
FROM catalog
WHERE sku LIKE '1W%'
AND sku >= ( SELECT MAX(sku)
             FROM ( SELECT TOP 26 sku
                    FROM catalog
                    WHERE sku LIKE '1W%' 
                    ORDER BY sku 
                  )
           )

如果您使用的是 SQL-Server,则可以对此类查询使用窗口函数。

于 2012-05-01T01:50:40.987 回答
1

一些指示:

  • SELECT BOTTOM (n)您可以通过使用TOP (n)和反转 ORDER BY来模拟 a
  • 您可以使用嵌套 SELECT(创建临时表)

因此,“分页”查询的最终结果是(后续页面将 50 替换为 75、100、125,...):

SELECT TOP 25 *
FROM
(
SELECT TOP 50 *
FROM  catalog
WHERE sku LIKE '1W%'
ORDER BY price desc
)
TEMP
ORDER BY price asc;

尽管您提到您已经为您的数据建立了索引,但是为了完全清楚,为了获得最佳性能,您应该确保您的所有表都为您的查询建立了充分的索引。在这种情况下,我建议至少查询中涉及的两列:

CREATE INDEX IX_CATALOG ON CATALOG (SKU, PRICE);
于 2012-05-08T06:51:54.477 回答
0

您要做的是从表中选择满足特定条件的所有行,而不是前 25 行。不幸的是,不同的数据库管理系统有自己的语法来做这种事情。

Wikipedia 页面上对 SQL select 语句的不同语法进行了很好的调查。

举个例子,在 MySQL 中,您可以使用SELECT 语句的 LIMIT 子句来指定要返回的行数和偏移量:

SELECT *
FROM catalog
WHERE sku LIKE '1W%'
ORDER by id
LIMIT 25, 9999999999

它返回查询结果的第 26 行到第 9999999999 行。

于 2012-05-01T00:24:24.673 回答
0

在 sku 列上创建索引(如果有效,使其唯一)。表中有多少行?

于 2012-05-01T01:20:43.353 回答
0
SELECT sku
FROM catalog
WHER sku LIKE '1W%
ORDER BY __SOME COLUMN __
LIMIT 10000 OFFSET 25

这将返回数据库中第 25 行 ( ) 之后的所有行OFFSET 25

*LIMIT 10000将生成的查询限制为 10000 个元组(行)。

为确保您没有得到 random OFFSET,您需要按某个列排序。

于 2012-05-01T02:21:16.340 回答