日期:2014-05-18 浏览次数:20804 次
--建立测试环境 IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB GO CREATE TABLE TB( ID UNIQUEIDENTIFIER PRIMARY KEY ,TITLE VARCHAR(100) ,CONTENT VARCHAR(MAX) ,UPDATE_DATE DATETIME ) GO INSERT INTO TB SELECT TOP 1000000 NEWID(),NEWID(),NEWID(),GETDATE() FROM MASTER..SPT_VALUES T1 CROSS JOIN MASTER..SPT_VALUES T2 GO CREATE INDEX INX_TB_UPDATE_DATE ON TB(UPDATE_DATE) GO SELECT COUNT(1) FROM TB GO --1000000 --CTE分页查询,取第1W页开始的20行 SET NOCOUNT ON SET STATISTICS IO ON SET STATISTICS TIME ON GO ;WITH MU AS ( SELECT ID ,ROW_NUMBER() OVER(ORDER BY UPDATE_DATE DESC) AS ROW_NUM FROM DBO.TB WITH(NOLOCK) ) SELECT ID FROM MU WHERE ROW_NUM BETWEEN 10001 AND 10020 GO /* SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 表 'TB'。扫描计数 1,逻辑读取 45 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 */ SET STATISTICS IO OFF SET STATISTICS TIME OFF SET NOCOUNT OFF
------解决方案--------------------
首先你要说一下你的带宽
自己的服务器?
独享?还是共享?
多人多次,主要开始看你的并发能力
------解决方案--------------------
DECLARE @BEGIN INT,@END INT SELECT @BEGIN=900080,@END=1000000 --SELECT TOP (@END-@BEGIN) ID FROM ( --SELECT TOP (@END) UPDATE_DATE,ID FROM TB ORDER BY UPDATE_DATE DESC --) T ORDER BY UPDATE_DATE ASC ;WITH MU AS ( SELECT ID ,ROW_NUMBER() OVER(ORDER BY UPDATE_DATE DESC) AS ROW_NUM FROM DBO.TB WITH(NOLOCK) ) SELECT ID FROM MU WHERE ROW_NUM BETWEEN @BEGIN AND @END GO /* SQL Server 执行时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 表 'TB'。扫描计数 1,逻辑读取 3737 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 */
------解决方案--------------------
------解决方案--------------------
能不能用数据库分区表来解决这个问题呀。
------解决方案--------------------
100万并不多,这点数据量不建议分区
仔细设计好是正道,从CPU、HDD、数据库结构、SQL指令
------解决方案--------------------
可以用程序来解决部分问题,例如:缓存
因为访问的大部分都是默认查询,很容易关键字重复,把数据放缓存里面就不消耗数据库资源了
------解决方案--------------------
索引和存储过程在加上缓存.
------解决方案--------------------