SQLSERVER千万级数据查询

时间:2021-05-27 00:28:25
 1000万条数据 ,要查出前20 条,我 想到的是这样写:
 建立了索引,
select * from ( select top 20 id from table ) order by id desc

我就只会这样写啊  ,可是 有人告诉我说这样写 过时了 ,谁知道怎么 写 效率 最高的?

22 个解决方案

#1


为什么要那么费劲!
select to 20 * from table order by id desc

#2


select to 20 * from table order by id 

#3


select top 20 * from table order by id desc

#4


建索引
SELECT TOP 页大小 *
FROM table1
WHERE id >
          (
          SELECT ISNULL(MAX(id),0) 
          FROM 
                (
                SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                ) A
          )
ORDER BY id

SELECT TOP 页大小 * 
FROM 
        (
        SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
        ) A
WHERE RowNumber > 页大小*(页数-1)

#5


建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top 

#6


10W级的用select top 20 id from table 都很慢了....

#7


引用 6 楼 heaventohell17 的回复:
10W级的用select top 20 id from table 都很慢了....

那么 不用 top  应该怎么写呢?

#8


引用 5 楼 yubanzhi 的回复:
建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top

我只是这样举个例子,有时候 ,需要反过来排序,就 要在套一层了

#9


引用 8 楼 popotans 的回复:
引用 5 楼 yubanzhi 的回复:
建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top

我只是这样举个例子,有时候 ,需要反过来排序,就 要在套一层了

反过来排序是什么意思? asc?
其实海量级数据查询的话 你的表结构很重要  给你的关键字段 加索引  有必要的话再建分区表。这样查询效率才高

#10



select * from ( select top 20 upper(id) from table as tableName ) order by id desc

#11


引用 7 楼 popotans 的回复:
引用 6 楼 heaventohell17 的回复:
10W级的用select top 20 id from table 都很慢了....

那么 不用 top  应该怎么写呢?


top不会这么差吧. lz别怕, 直接top.

#12


这张表要是经常被查询,增删改比较少,建立索引还是很提高效率的,要是增删改也比较多,还是不要建立索引了。

#13


该回复于2010-09-10 09:41:23被版主删除

#14


学习来了

#15


学习学习

#16


可以的

#17


应该是这样写的,不用索引直接写select top 20 * from table order by id desc比你的慢多了,建立了索引快多了

#18


sql 工具里有最优的SQL语句,就是根据你写的语句,它会自己产生一些语句,效果和你写的语句查询效果一样。

#19


你自已可以有尝试下吧,很多时候学习靠自已试验试出真理来的
你可以用多程方法试查询的效率
可以在查询分析器-“查询”-"显示执行计划"去研究你的代码问题

#20


百度 google 告诉你很多

#21


USE northwind;
GO       
SET STATISTICS TIME ON
GO
SELECT * 
FROM orders
WHERE freight >3.2500
GO
SET STATISTICS TIME OFF;
GO

结果消息


SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。

(所影响的行数为 751 行)


SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。

SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。

SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。

#22


表分区 精减表字段 规划表关系 制定好表索引 优化SQL语句 改善服务器硬件环境
一个都不能少。

#1


为什么要那么费劲!
select to 20 * from table order by id desc

#2


select to 20 * from table order by id 

#3


select top 20 * from table order by id desc

#4


建索引
SELECT TOP 页大小 *
FROM table1
WHERE id >
          (
          SELECT ISNULL(MAX(id),0) 
          FROM 
                (
                SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                ) A
          )
ORDER BY id

SELECT TOP 页大小 * 
FROM 
        (
        SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
        ) A
WHERE RowNumber > 页大小*(页数-1)

#5


建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top 

#6


10W级的用select top 20 id from table 都很慢了....

#7


引用 6 楼 heaventohell17 的回复:
10W级的用select top 20 id from table 都很慢了....

那么 不用 top  应该怎么写呢?

#8


引用 5 楼 yubanzhi 的回复:
建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top

我只是这样举个例子,有时候 ,需要反过来排序,就 要在套一层了

#9


引用 8 楼 popotans 的回复:
引用 5 楼 yubanzhi 的回复:
建立的索引不 太合适吧!
select * from ( select top 20 id from table ) order by id desc
这个 没有必须要这样写, 直接 top

我只是这样举个例子,有时候 ,需要反过来排序,就 要在套一层了

反过来排序是什么意思? asc?
其实海量级数据查询的话 你的表结构很重要  给你的关键字段 加索引  有必要的话再建分区表。这样查询效率才高

#10



select * from ( select top 20 upper(id) from table as tableName ) order by id desc

#11


引用 7 楼 popotans 的回复:
引用 6 楼 heaventohell17 的回复:
10W级的用select top 20 id from table 都很慢了....

那么 不用 top  应该怎么写呢?


top不会这么差吧. lz别怕, 直接top.

#12


这张表要是经常被查询,增删改比较少,建立索引还是很提高效率的,要是增删改也比较多,还是不要建立索引了。

#13


该回复于2010-09-10 09:41:23被版主删除

#14


学习来了

#15


学习学习

#16


可以的

#17


应该是这样写的,不用索引直接写select top 20 * from table order by id desc比你的慢多了,建立了索引快多了

#18


sql 工具里有最优的SQL语句,就是根据你写的语句,它会自己产生一些语句,效果和你写的语句查询效果一样。

#19


你自已可以有尝试下吧,很多时候学习靠自已试验试出真理来的
你可以用多程方法试查询的效率
可以在查询分析器-“查询”-"显示执行计划"去研究你的代码问题

#20


百度 google 告诉你很多

#21


USE northwind;
GO       
SET STATISTICS TIME ON
GO
SELECT * 
FROM orders
WHERE freight >3.2500
GO
SET STATISTICS TIME OFF;
GO

结果消息


SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。

(所影响的行数为 751 行)


SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。

SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。

SQL Server 执行时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 16 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。

#22


表分区 精减表字段 规划表关系 制定好表索引 优化SQL语句 改善服务器硬件环境
一个都不能少。