本人用ASP.NET+ACCESS,但是在大量数据分页时,发现自己写的SQL太慢,如:我的People表有两个字段
id(自增长)和name。 我想查处按名称排列的第11-20条,SQL如下:
SELECT ID, NAME FROM (SELECT TOP 20 ID,NAME FROM PEOPLE ORDER BY NAME) AS P1 WHERE P1.ID NOT IN (SELECT TOP 10 ID FROM PEOPLE ORDER BY NAME);
发现数据在几万条时好慢,请高手指教!
id(自增长)和name。 我想查处按名称排列的第11-20条,SQL如下:
SELECT ID, NAME FROM (SELECT TOP 20 ID,NAME FROM PEOPLE ORDER BY NAME) AS P1 WHERE P1.ID NOT IN (SELECT TOP 10 ID FROM PEOPLE ORDER BY NAME);
发现数据在几万条时好慢,请高手指教!
解决方案 »
- 百度地图如何加载一个空白的城市地图
- asp.net读取word显示到web页面(求救)
- 正则取出数据片断
- 关于TREEVIEW动态读取数据库的问题
- 如何将一个控件放置到DataGrid中的一个单元格?
- 在页面执行完之后释放资源,求代码,vb.net,立刻给分
- 请教
- TreeView添加checkbox的问题,如何实现父结点级联选中的问题?
- 这个问题也有点难度,高手请进,如何在DataGrid里同时显示超链接和非超链接的信息呢?
- DataGrid中插入了一列checkBox,如何根据数据库中的数据设置是否选中
- 存储过程的@Info text,这个text数据类型为什么不能设定新值?
- 如何动态添加自定义控件
where (列名 >=
(select max([列名]) from
(select top str((页数-1)*页长+1) [列名] from [表名]
Order by [列名] ASC) as tmpTbl))
Order by 列名
这是sql server的 看看。。
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
ASdeclare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型if @OrderType != 0
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
endset @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrderif @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrderif @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where " + @strWhere set @strSQL = "select top " + str(@PageSize) + " * from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
endif @IsCount != 0
set @strSQL = "select count(*) as Total from [" + @tblName + "]"exec (@strSQL)GO
两个办法:
一是在已经做过数据库索引优化的前提下升级服务器配件。
二是改用另外一种分页方式具体见(在聚簇索引上做文章)http://dev.csdn.net/develop/article/60/60153.shtm
PARAMETERS [PersonalID] Short, [bulletinID] Short, [title] Text ( 255 ), [bulletinDate] DateTime, [content] Text ( 255 );
INSERT INTO bulletin ( PersonalID, bulletinID, title, bulletinDate, content )
VALUES ([PersonalID], [bulletinID], [title], [bulletinDate], [content]);