You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2005分批加载大数据:行范围查询与总行数获取咨询

嘿,针对你做海量数据分批加载的需求,这两个问题刚好是分页查询的核心环节,不同数据库的实现语法略有区别,我给你整理了常用数据库的解决方案:

1. 选取指定范围的行(分页查询)

不管哪种数据库,一定要加上稳定的ORDER BY子句!不然数据库返回的结果顺序是不保证的,多次分页可能会出现重复或缺失的数据。

MySQL/MariaDB

用LIMIT语法,有两种写法:

  • 偏移量 + 行数:SELECT * FROM table ORDER BY id LIMIT 9, 10;
    这里的9是偏移量(跳过前9行,从第10行开始),10是要取的行数,对应你说的“row 10 and next 10 rows”。
  • 更直观的写法:SELECT * FROM table ORDER BY id LIMIT 10 OFFSET 9;
    如果要取第10到第20行(共11行),把10改成11就行。

PostgreSQL

支持LIMIT/OFFSET,也支持更语义化的FETCH NEXT:

-- 取第10行及之后的10行
SELECT * FROM table ORDER BY id OFFSET 9 FETCH NEXT 10 ROWS ONLY;

SQL Server

推荐用OFFSET...FETCH(SQL Server 2012及以上版本):

SELECT * FROM table ORDER BY id OFFSET 9 ROWS FETCH NEXT 10 ROWS ONLY;

如果是旧版本,只能用子查询+TOP:

-- 取第10到第20行
SELECT TOP 11 * 
FROM (SELECT TOP 20 * FROM table ORDER BY id) AS temp 
ORDER BY id DESC;

Oracle

12c及以上版本支持OFFSET/FETCH,和上面类似;旧版本用ROWNUM:

-- 取第10到第20行
SELECT * 
FROM (SELECT t.*, ROWNUM rn FROM table t ORDER BY id) 
WHERE rn BETWEEN 10 AND 20;
2. 获取表中的总行数

通用精确写法

几乎所有数据库都支持:

SELECT COUNT(*) FROM table;

COUNT(*)会统计所有行,包括包含NULL值的行,效率通常比COUNT(column_name)更高(因为不需要检查列的非空性)。

高效近似写法(适合超大表)

如果你的表数据量特别大,COUNT(*)可能会慢(需要全表扫描),可以用数据库的系统视图获取近似行数:

  • MySQL:InnoDB引擎可以查INFORMATION_SCHEMA.TABLES:
    SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'your_database' AND TABLE_NAME = 'table';
    
  • PostgreSQL:
    SELECT reltuples::bigint FROM pg_class WHERE relname = 'table';
    
  • SQL Server:
    SELECT SUM(row_count) FROM sys.dm_db_partition_stats 
    WHERE object_id = OBJECT_ID('table') AND index_id < 2;
    

这些方法返回的是近似值,但速度极快,适合分批加载时估算总页数的场景。

内容的提问来源于stack exchange,提问作者Angry Tomato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:06