日期:2014-05-18 浏览次数:20891 次
--建立测试环境
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指令
------解决方案--------------------
可以用程序来解决部分问题,例如:缓存
因为访问的大部分都是默认查询,很容易关键字重复,把数据放缓存里面就不消耗数据库资源了
------解决方案--------------------
索引和存储过程在加上缓存.
------解决方案--------------------