Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于SQL Server 2008的MySQL LIMIT子句太慢了_Sql_Sql Server 2008 - Fatal编程技术网

相当于SQL Server 2008的MySQL LIMIT子句太慢了

相当于SQL Server 2008的MySQL LIMIT子句太慢了,sql,sql-server-2008,Sql,Sql Server 2008,LIMIT子句可用于约束SELECT语句返回的行数 我查找了SQL server(2008)的LIMIT子句的等效项,发现了以下内容: SELECT * FROM (SELECT TOP 30 field1, field2 FROM (SELECT TOP 10 field1, field2 FROM matable

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的这个请求在浏览器中显示数据)

您以
asc
顺序拉出
top 10
行,然后形成您拉出
top 30
行但顺序相反的那10行。然后从上一个结果中获取所有行,并再次按升序对其排序。如果您的查询看起来确实如此,那么它应该是等效的:

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

如果您在MyColumn上没有索引,
orderby
可能是一项耗时的操作。您还可以检查执行计划以获取有关查询的详细信息。

参考@Bogdan Sahlan的评论,我在我的专栏(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限制子句提供一个等价项

  • 使用上面的查询
  • 在您的列上创建一个索引,其中包含您想要排序的对象(在我的示例中是:MyColumn)

  • 谢谢大家。

    您的查询正在从一个子查询返回前30名,该子查询正在提取前10名。那没有道理。您的实际查询是什么样子的?您是否尝试创建索引?您正在从整个表中进行选择。也许where子句会加快速度。@Gordon Linoff:resultset是20行,我的查询看起来像这样,只是我更改了字段1,。。。使用真实的列名。@Bogdan Sahlan:我没有,但我必须在哪一列上创建索引?您的查询只会给出前10名,但对我来说,我想分页(从1-->10、11-->21等等…),这就是为什么您的查询无法帮助我解决问题的原因。我想我必须给我的专栏编索引。那么,你能解释一下,自从你从
    top10
    中选择了
    top10
    ,你的查询是如何给你提供超过10行的吗?也许会帮助你达到期望的目标。