【问题标题】:MySQL LIMIT clause equivalent for SQL Server 2008 so slow相当于 SQL Server 2008 的 MySQL LIMIT 子句太慢了
【发布时间】:2013-12-27 15:03:26
【问题描述】:

LIMIT 子句可用于限制 SELECT 语句返回的行数。

我为 SQL server(2008) 寻找了一个等效的 LIMIT 子句并找到了这个:

SELECT * 
FROM   (SELECT TOP 30 field1, 
                      field2 
        FROM   (SELECT TOP 10 field1, 
                              field2 
                FROM   matable 
                ORDER  BY mycolumn ASC) AS tbl1 
        ORDER  BY mycolumn DESC) AS tbl2 
ORDER  BY mycolumn ASC 

显示 10 行中的 30 行

效果很好!!但是当我增加要从中提取数据的数量时,它会花费很多时间。有人知道如何改进 SQL Server 2008 的此查询吗? (我的表包含很多行,我将此请求与 PHP 和 Jquery 一起使用以在浏览器中显示数据)

【问题讨论】:

  • 您的查询从正在拉取top 10 的子查询返回top 30。那没有意义。您的真实查询是什么样的?
  • 您是否尝试创建索引?
  • 您正在从整个表格中进行选择。也许 where 子句会加快速度。
  • @Gordon Linoff:结果集是 20 行,我的查询看起来像这样,只是我更改了 Field1,... 使用真实的列名。
  • @Bogdan Sahlean:我没有,但是我必须在哪一列创建索引?

标签: sql sql-server-2008


【解决方案1】:

您以asc 的顺序拉出top 10 行,然后形成您以相反的顺序拉出top 30 行的那10 行。然后,您从先前的结果中取出所有行,并再次按升序对其进行排序。如果您的查询真的看起来像它应该是等效的:

SELECT TOP 10 Field1, Field2 FROM  matable  ORDER BY MyColumn asc

如果您在 MyColumn 上没有索引,ORDER BY 可能会很耗时。您还可以检查执行计划以获取有关您的查询的详细信息。

【讨论】:

  • 您的查询只会给我前 10 名,但对我来说,我想分页(从 1-->10、11-->21 等...)这就是为什么您的查询会不能帮我解决问题。我想我必须索引我的专栏。
  • 那么您能否解释一下,自从您从 top 10 中选择了 top 30 后,您的查询如何为您提供超过 10 行?也许this 会帮助你达到预期的目标。
【解决方案2】:

参考@Bogdan Sahlean 的评论,我在我的列 (MyColumn) 上创建了一个新索引,现在它真的非常快。并且查询仍然改变:

SELECT * FROM ( 
         SELECT TOP 30 Field1, Field2 FROM ( 
         SELECT TOP 10 Field1, Field2 
         FROM  matable 
        ORDER BY MyColumn asc 
        ) AS tbl1 ORDER BY MyColumn desc 
        ) AS tbl2 ORDER BY MyColumn asc

总结;如果你想要 SQL Server 2008 的子句 LIMIT等价性

  1. 使用上述查询
  2. 在您的列上创建一个您想要订购的人的索引(在我的例子中是: MyColumn )

谢谢大家。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-03-27
    • 2010-09-27
    相关资源
    最近更新 更多