日期:2014-05-19  浏览次数:20419 次

连接数据库次数问题,急啊!
小弟做个网站,首页显示的时候:
从数据库的一个表里读取,然后分类显示(比较多,按30类),每个类别都显示出前几条内容。(现暂定8条)
现在的问题是:
        1、如果说一次从数据库里读取出来再进行筛选的话,我必须判断每个类别不超过8条,这样可以实现,但必须把表里的数据全读出来,如果几万条呢,可我只显示那几十条,太影响性能了。
        2、所以我考虑不一次读取,但根据我掌握的知识就要从数据库查询30次,光个首页就要打开这么多次连接,是不是也太影响性能了?
        3、我该怎么办?个位高手、大侠有没有好的办法,可不要笑小弟无知啊!

------解决方案--------------------
SqlServer通用存储过程(1)-千万级数据库高速分页显示


/*
经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:
exec GetRecordFromPage news,newsid,10,100000
news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。
*/

/*
函数名称: GetRecordFromPage
函数功能: 获取指定页的数据
参数说明: @tblName 包含数据的表名
@fldName 关键字段名
@PageSize 每页记录数
@PageIndex 要获取的页码
@OrderType 排序类型, 0 - 升序, 1 - 降序
@strWhere 查询条件 (注意: 不要加 where)
*/
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = ' ' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型

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 "
end

set @strSQL = "select top " + str(@PageSize) + " * from [ "
+ @tblName + "] where [ " + @fldName + "] " + @strTmp + "([ "
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " [ "
+ @fldName + "] from [ " + @tblName + "] " + @strOrder + ") as tblTmp) "
+ @strOrder

if @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 + " " + @strOrder

if @PageIndex = 1
begin
set @strTmp = " "
if @strWhere != ' '
set @strTmp = " where ( " + @strWhere + ") "

set @strSQL = "select top " + str(@PageSize) + " * from [ "
+ @tblName + "] " + @strTmp + " " + @strOrder
end

exec (@strSQL)

GO



-----------

另一个版本
/*
函数名称: GetRecordFromPage
函数功能: 获取指定页的数据
参数说明: @tblName 包含数据的表名
@fldName 关键字段名
@PageSize 每页记录数
@PageIndex 要获取的页码
@IsCount 是否要取得记录数
@OrderType 排序类型, 0 - 升序, 1 - 降序
@strWhere 查询条件 (注意: 不要加 where)
*/