每个人都希望我更具体。我试图用asp经典和ms访问数据库进行分页。这是我用来获取第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
答案 0 :(得分:2)
TOP
的 ORDER 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,则可以使用窗口函数进行此类查询。
答案 1 :(得分:1)
一些指示:
SELECT BOTTOM (n)
模拟TOP (n)
并反转ORDER BY 因此,“分页”查询的最终结果是(用后代页面的75,100,125替换50):
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);
答案 2 :(得分:0)
您要做的是从表格中选择符合特定条件的所有行,而不是前25个。不幸的是,不同的数据库管理系统有自己的语法来做这种事情。
对Wikipedia page for the SQL select statement上的不同语法进行了很好的调查。
举一个例子,在MySQL中你可以使用LIMIT clause of the SELECT statement来指定要返回的行数和偏移量:
SELECT *
FROM catalog
WHERE sku LIKE '1W%'
ORDER by id
LIMIT 25, 9999999999
返回查询结果的第26行到第9999999999行。
答案 3 :(得分:0)
在列sku上创建索引(如果有效,则使其唯一)。表格中有多少行?
答案 4 :(得分:0)
SELECT sku
FROM catalog
WHER sku LIKE '1W%
ORDER BY __SOME COLUMN __
LIMIT 10000 OFFSET 25
这将返回数据库中第25行(OFFSET 25
)之后的所有行。
* LIMIT 10000
将生成的查询约束为10000个元组(行)。
为了确保您没有获得随机OFFSET
,您需要按某个列进行排序。