如何更快地使这个SQL代码?

时间:2012-05-01 00:03:02

标签: sql ms-access asp-classic vbscript

每个人都希望我更具体。我试图用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

5 个答案:

答案 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
  • 您可以使用嵌套的SELECT(创建临时表)

因此,“分页”查询的最终结果是(用后代页面的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,您需要按某个列进行排序。