当前位置:首页 » 编程语言 » sql百万级数据分页
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql百万级数据分页

发布时间: 2022-06-13 20:28:30

1. sql 存储过程分页,(要求百万级)

CREATE PROCEDURE SP_Pagination
@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
@Fields VARCHAR(200) = '*', --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize int = 30, --每页记录数
@CurrentPage int = 1, --当前页,0表示第1页
@IsCount int = 0,
@Filter VARCHAR(2000) = '', --条件,可以为空,不用填 where
@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGIN
DECLARE @SortColumn VARCHAR(200)
DECLARE @Operator CHAR(2)
DECLARE @SortTable VARCHAR(200)
DECLARE @SortName VARCHAR(200)
DECLARE @sql nvarchar(4000)
DECLARE @iPageCount int
IF @Fields = ''
SET @Fields = '*'
IF @Filter = ''
SET @Filter = 'Where 1=1'
ELSE
SET @Filter = 'Where ' + @Filter
IF @Group <>''
SET @Group = 'GROUP BY ' + @Group

IF @IsCount != 0
BEGIN
SET @Sql = 'SELECT @iPageCount=COUNT(1) FROM ' + @TableNames + ' ' + @Filter + ''
EXEC sp_executesql @Sql,N'@iPageCount int OUTPUT',@iPageCount OUTPUT--计算总记录数
END

IF @Order <> ''
BEGIN
DECLARE @pos1 INT, @pos2 INT
SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
IF CHARINDEX(' DESC', @Order) > 0
IF CHARINDEX(' ASC', @Order) > 0
BEGIN
IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
SET @Operator = '<='
ELSE
SET @Operator = '>='
END
ELSE
SET @Operator = '<='
ELSE
SET @Operator = '>='
SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
SET @pos1 = CHARINDEX(',', @SortColumn)
IF @pos1 > 0
SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
SET @pos2 = CHARINDEX('.', @SortColumn)
IF @pos2 > 0
BEGIN
SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
IF @pos1 > 0
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
ELSE
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET @SortTable = @TableNames
SET @SortName = @SortColumn
END
END
ELSE
BEGIN
SET @SortColumn = @PrimaryKey
SET @SortTable = @TableNames
SET @SortName = @SortColumn
SET @Order = @SortColumn
SET @Operator = '>='
END

DECLARE @type varchar(50)
DECLARE @prec int
Select @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'

DECLARE @TopRows INT
SET @TopRows = @PageSize * @CurrentPage + 1
PRINT @TopRows
PRINT @Operator
EXEC('
DECLARE @SortColumnBegin ' + @type + '
SET ROWCOUNT ' + @TopRows + '
Select @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + '
SET ROWCOUNT ' + @PageSize + '
Select ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + '
')
If @@Error = 0
BEGIN
RETURN @iPageCount ---返回记录总数
END
END
GO

2. 高分求SQL分页的存储过程

ASP.Net中的DataGrid有内置分页功能,
但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页,
这种只选取了一小部分而丢掉大部分的方法是不可去取的.
在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页.
下面介绍一下我在项目中用到的分页方法.
当然显示控件还是用DataGrid的,
因为数据绑定很方便^_^.
要保证不传输冗余的数据,那么必须在数据库中数据读取时实现分页,
数据库的分页操作可以放在存储过程中.
看了CSDN的一篇Blog中讲了一个百万级数据分页的存储过程的实现(
http://blog.csdn.net/wellknow/posts/55167.aspx
,他的这个方法可以根据不同情况进行适当的优化),
根据他的方法,这里实现一个简单的SQL语句来实现这里分页需要的存储过程。
create
procere
ListProct
(
@PageIndex
int,
--
分页后需要页的序号
@PageSize
int,
--
一页的大小
@ConditionSQL

查询条件的SQL语句
)
AS

具体代码就不写了(可以参考上面的链接).
具体的SQL语句如下:
Select
TOP
100
*
FROM
(select
*
from
proct
where
proctid<200000)
T
Where
T.proctid
NOT
IN
(Select
TOP
900
proctid
FROM
(select
proctid
from
proct
where
proctid<200000)
T1
orDER
BY
T1.proctid
asc)
orDER
BY
proctid
asc
这条语句的
从总的商品(30万)中取出proctid<200000(共20万),再按每页100的大小分页,然后取出第10页.
Public
DataTable
ListProct(int
pageIndex,
int
pageSize)
{
//ADO.net从数据库中取出数据的代码就略过^_^.
}
用上面的存储过程读出的数据在DataGrid里面分页,
必须把DataGrid的AllowPaging和AllowCustomPaging设置为true
protected
System.Web.UI.WebControls.DataGrid
ProctGrid;
ProctGrid.AllowPaging
=
true;
ProctGrid.AllowCustomPaging
=
true;
然后在设置要显示的一页的大小
ProctGrid.PageSize
=
100;
//
在显示的时候依据实际的数据显示。
设置一页大小后,如果要让DataGrid实际分出页数来,还必须设置
ProctGrid.VirtualItemCount
=
GetProctCount()
;
//
GetProctCount()
的功能是获取满足条件的产品数目,
这里的条件就是proctid<200000.
设置这项属性后,那么这个DataGrid的页数就是
VirtualItemCount/PageSize,
也就是PageCount的值.
不能对PageCount直接赋值,因为他是只读的属性.

3. mysql 百万级数据,怎么分页

一般刚开始学SQL的时候,会这样写 复制代码代码如下: SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 复制代码代码如下: SELECT * FROM table ORDER BY id LIMIT 1000000,

4. oracle数据库,搜索百万级别数据分页优化问题

oracle count 百万级 分页查询记录总数、总条数优化
Oracle count 百万级 查询记录总数、总条数优化
最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次是查询总数,一次是查询分页结果
[java] view plain
/** 查询总记录数 **/
SELECT
COUNT(id)
FROM
USER
order by
id
/** 查询结果集 **/
select
*
from
( select
row_.*,
rownum rownum_
from
( select
id ,
user_number,
user_name,
user_password,
sex,
Registered_time,
last_login_time,
post
from
USER u
order by
u.id) row_
where
rownum <= ?
)
where
rownum_ > ?
user表中的记录是128万多条,这个是没有查询条件时的查询,也就是用户刚刚进入模块时的查询,发现查询时间是2566ms~2152ms之间,单独执行每条语句,发现第一条的执行时间在2000ms以上,在PL/SQL中执行的结果也证实了我的判断。所以要对select count语句进行优化。
在网上找了很多优化方案,大多不尽人意,(分表的方式听上去不错,不过由于单表是历史原因,这里就不作考虑)。最后找到一个比较令人满意的答。就是在语句中加入 /*+ROWID(USER)*/或者/*+ INDEX(USER ID) */ 来提高查询效果。
听说这个就是强制使用索引统计结果?如果有哪位大虾能把原理详细告诉我,请来多多指点!
[java] view plain
SELECT /*+ROWID(USER)*/ count(*) FROM USER t
或者
SELECT /*+ INDEX(USER ID) */ count(*) FROM USER t
使用后,单条统计总数的查询在800ms左右,分页查询结果基本在900ms~950ms之间,基本在一秒之内,达到了当初设计需求。
当然,这个是没有加查询条件的,当把查询条件加入后,不管前面加不加强制索引,结果时间都在2000ms之间,所以,如果要进行有条件的查询,就要在where条件中进行优化。特别注意条件字段查询前后顺序。

5. MYSQL百万条数据下标签、文章的分页查询排序的高效方法有哪些

文章:content表储存:content_id[自增id],content[内容],dateline[发布时间戳],ispublic[是否发布]
关系:tag_content表储存:tag_id[标签id],content_id[文章id]
网站前段,访问标签页面,需要查询出这个标签下的所有文章,需要筛选是否发布,需要按照时间排序。
通过一般方法left join + 联合索引 速度仍然十分不理想。
请教在百万级文章,万级标签,千万级关系下。如果高效的实现某一标签下文章的分页排序查询。(分页可只显示前100页,不用全部可访问)
以前数据量没这么大,联合索引+left join 没问题。在大数据量的时候,速度瓶颈在于按照时间戳、浏览量等排序。

6. sql2008数据库,九百万条数据,如何快速查询

根据你说的需求:
"可程序中需要查询每行的所有数据"、“查询全部九百万条数据”

-------------------------------
这样的需求跟索引没有关系了(因为已经肯定是走全表扫描的了),要提高效率的办法就是:1、提高硬盘的io速度;2、增加内存以使sql server有更多的缓存

另外,你程序不要一次性取那么多数据返回,这样会拖死的,建议你考虑变换下处理逻辑(如:分批取回--可以根据id列值进行分批;将数据直接在服务端存成文本再传回本地处理)。

"而是需要根据这些数据逐一进行其他功能的操作,这款程序是不联网的"
--------------------------------
就算这样的话,也不能一次性把9百万数据一次性取回,如果你非要取出来再操作的话,那你得考虑分批去取。或者你把处理逻辑写在存储过程,然后由SQL SERVER本身去完成逻辑处理。总之,不管怎样,你也是得优化你现在的处理逻辑(现有处理逻辑我觉得不合理,效率很低下)。

“真正部署到电力网的服务器上速度会不会提高呢”
------------------------
服务器当然比你本地要快得多啦,硬件配置根本就不同一个级别,但不管怎样,还是建议你参考上面的建议优化你的处理逻辑才行,否则,你系统的效率将很低。

7. SQL语句自带的分页,就是最后between 1 and 20这样的。现在要导出到excel,但因为记录比较多,百万级的

select Field1,Field2 from table with(nolock)再加个索引就会快一些,
不想再查询的话放到内存里面,第二次再从内存里面拿数据

8. sql server百万级的数据,如何提高查询效率

没有太好的办法,哪怕千万级的,查询也还是那么查,
唯一能做的,就是尽量增加限制条件,筛选数据,节约时间和资源。

9. 百万级数据分页 C# SQL 2K5

百万级数据检索存储过程需要很精洁 尽量不要在select部分、where部分做判断; 考虑仅一次的order by。
在存储过程里做分页是个不错的选择。排序好的数据可以用between and达到分页效果。