mvc 关于过千万数据的查询 带分页

残月照我心 2014-04-29 01:01:46
请教下 大数据你们是怎么处理的
...全文
1296 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
timsqin 2016-09-20
  • 打赏
  • 举报
回复
pagedlist
残月照我心 2014-05-06
  • 打赏
  • 举报
回复
残月照我心 2014-05-06
  • 打赏
  • 举报
回复
Select * FROM (Select ROW_NUMBER() OVER (order by id desc) AS pos, * from  House  where 1=1  and phone!='0000' and Area like '%白云区%')as sp 
where pos between  str((15000-1)*10+1) AND str(15000*10) order by posttime desc 
pageindex 越大越慢 有办法解决这个问题吗?
残月照我心 2014-05-05
  • 打赏
  • 举报
回复
引用 10 楼 xiaomou_mou 的回复:
例如我每页显示10条 我只查找10页的内容 每查找一次 就访问一次数据库 当页索引为11的时候 查找 11-20页的内容 我想知道是不是我得在程序端写个判断 判断是1-10页 还是11-20页 以此类推 21-30页 然后访问数据? 是这样吗?
重点在这里 求指导
残月照我心 2014-05-04
  • 打赏
  • 举报
回复
例如我每页显示10条 我只查找10页的内容 每查找一次 就访问一次数据库 当页索引为11的时候 查找 11-20页的内容 我想知道是不是我得在程序端写个判断 判断是1-10页 还是11-20页 以此类推 21-30页 然后访问数据? 是这样吗?
srym 2014-05-04
  • 打赏
  • 举报
回复

--调用
DECLARE   @TotalCount int
        

EXEC    [dbo].[sp_Paging]
        @Tables = N'QuestionWattings',
        @PrimaryKey = N'QuestionWattingId',
        @Sort = N'',
        @pageindex = 1,
        @PageSize = 3,
        @Fields = '*',
        @Filter = NULL,
        @Group = NULL,
        @TotalCount = @TotalCount OUTPUT

SELECT    @TotalCount as N'@TotalCount'

SELECT    'Return Value' = @return_value





SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--分页存储过程  
CREATE PROCEDURE [dbo].[sp_Paging] 
( 
@Tables nvarchar(1000),                --表名/视图名
@PrimaryKey nvarchar(100),             --主键
@Sort nvarchar(200) = NULL,            --排序字段(不带order by)
@pageindex int = 1,                    --当前页码
@PageSize int = 10,                    --每页记录数
@Fields nvarchar(1000) = N'*',         --输出字段
@Filter nvarchar(1000) = NULL,         --where过滤条件(不带where)
@Group nvarchar(1000) = NULL,          --Group语句(不带Group By)
@TotalCount int OUTPUT                 --总记录数
) 
AS  
 
DECLARE @SortTable nvarchar(100) 
DECLARE @SortName nvarchar(100) 
DECLARE @strSortColumn nvarchar(200) 
DECLARE @operator char(2) 
DECLARE @type nvarchar(100) 
DECLARE @prec int 

--设定排序语句
IF @Sort IS NULL OR @Sort = ''     
   SET @Sort = @PrimaryKey      
IF CHARINDEX('DESC',@Sort)>0   
BEGIN         
    SET @strSortColumn = REPLACE(@Sort, 'DESC', '')         
    SET @operator = '<='     
END 
ELSE     
BEGIN                
    SET @strSortColumn = REPLACE(@Sort, 'ASC', '')                
    SET @operator = '>='     
END 
IF CHARINDEX('.', @strSortColumn) > 0     
BEGIN         
    SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))     
END 
ELSE     
BEGIN         
    SET @SortTable = @Tables         
    SET @SortName = @strSortColumn  
END 

--设置排序字段类型和精度 
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 @strPageSize nvarchar(50) 
DECLARE @strStartRow nvarchar(50) 
DECLARE @strFilter nvarchar(1000) 
DECLARE @strSimpleFilter nvarchar(1000) 
DECLARE @strGroup nvarchar(1000)  
 
IF @pageindex <1     
   SET @pageindex = 1  
SET @strPageSize = CAST(@PageSize AS nvarchar(50)) 
--设置开始分页记录数 
SET @strStartRow = CAST(((@pageindex - 1)*@PageSize + 1) AS nvarchar(50))  
--筛选以及分组语句
IF @Filter IS NOT NULL AND @Filter != ''     
BEGIN         
    SET @strFilter = ' WHERE ' + @Filter + ' ' 
    SET @strSimpleFilter = ' AND ' + @Filter + ' ' 
END 
ELSE     
BEGIN         
    SET @strSimpleFilter = ''         
    SET @strFilter = ''     
END 
IF @Group IS NOT NULL AND @Group != ''  
   SET @strGroup = ' GROUP BY ' 
--计算总记录数
DECLARE @TotalCountSql nvarchar(1000)
SET @TotalCountSql=N'SELECT @TotalCount=COUNT(*)' +N' FROM ' + @Tables + @strFilter
EXEC sp_executesql @TotalCountSql,N'@TotalCount int OUTPUT',@TotalCount OUTPUT
--执行查询语句    
EXEC(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
srym 2014-05-04
  • 打赏
  • 举报
回复
Proc 万恶的6个字
帅得_被人砍 2014-05-04
  • 打赏
  • 举报
回复
还是得在数据处理,和数据库优化哪里下手,和MVC的程序确实关系不大
紫魂一号 2014-05-04
  • 打赏
  • 举报
回复
存储过程去处理.需要size,index 去筛选数据..每次查一页的数据
残月照我心 2014-05-04
  • 打赏
  • 举报
回复
@各位大神
myhope88 2014-04-30
  • 打赏
  • 举报
回复
每次就只取几条出来就行了嘛
残月照我心 2014-04-29
  • 打赏
  • 举报
回复
楼上各位大神如何控制代码 来点代码看看?
M依然 2014-04-29
  • 打赏
  • 举报
回复
千万数据库查询 主要的是选对数据库。其次才是代码控制好。和mvc什么的没关系。你从数据库就进行控制了 显示效率肯定没问题
bearfly2011 2014-04-29
  • 打赏
  • 举报
回复
“合理”完全取决于你的业务场景+你可使用的软硬件资源,你整个小霸王,神仙都没辙。 这样发散性的谈技术,其实没什么价值的,而且所有的”合理“都是建立在相应约束和规则的基础之上的,没有万能的良药。
bearfly2011 2014-04-29
  • 打赏
  • 举报
回复
表结构合理,索引合理,KW级的数据不应该是个问题(如果数据有规则可言,可以做表分区,那就更好了)
残月照我心 2014-04-29
  • 打赏
  • 举报
回复
引用 2 楼 diaodiaop 的回复:
这跟mvc好像没什么关系吧....无非就是分页top 或者row的方式..设计合理千万没什么问题的..
可以详细点吗?如何才算合理
by_封爱 2014-04-29
  • 打赏
  • 举报
回复
百度搬运工也能成为版主?也能有20多个勋章? 真搞笑呀...
by_封爱 2014-04-29
  • 打赏
  • 举报
回复
这跟mvc好像没什么关系吧....无非就是分页top 或者row的方式..设计合理千万没什么问题的..
我不懂电脑 2014-04-29
  • 打赏
  • 举报
回复
一般用sql只取几条数据,如 sql取分组的前几条/指定条数 注:sqlserver下 create table test ( areaid int, score int ) insert into test select 0,10 union all select 0,20 union all select 0,30 union all select 0,40 union all select 0,50 union all select 1,10 union all select 1,20 union all select 1,30 union all select 1,40 union all select 1,50 union all select 2,10 union all select 2,20 union all select 2,30 union all select 2,40 union all select 2,50 go select * from test --第一种方法适用于sql2000和,其代码如下: select * from test a where checksum(*) in (select top 3 checksum(*) from test b where a.areaid=b.areaid order by score desc) --sql中CheckSum的作用:http://hi.baidu.com/jhfcjl/blog/item/1ec9e83f74adabec828b13a5.html --第二种方法是利用sql2005的函数ROW_NUMBER,其代码如下: (1) WITH test1 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY areaid ORDER BY score desc) AS 'RowNumber' FROM test ) SELECT * FROM test1 WHERE RowNumber BETWEEN 1 AND 3; (2) select areaid,score from( select *,row_number() over(partition by areaid order by areaid desc) row_number from test) a where row_number<6 and row_number>2 --第三种方法是利用sql2005的cross apply来实现,其代码如下: select distinct t.* from test a cross apply (select top 3 areaid,score from test where a.areaid=areaid order by score desc) as T sql取每个分组的第一行数据 SELECT a.* FROM table1 a INNER JOIN ( SELECT MAX(a + b)TIME FROM table1 GROUP BY c ) b ON a.a + a.b = b.TIME 当然sql2005 的Row_Number让很多问题有多种解法: SELECT * FROM (SELECT t.*, RANK() OVER (PARTITION BY t.a ORDER BY t.b DESC) AS drank FROM table1 t) a WHERE drank=1 #Sql

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧