SQL Server教程:水平分表
一、问题引入
本地拥有一张学生表,表中存放学生信息(学号s_no、姓名s_name、性别s_sex、出生年月s_birthday、地址s_adress、联系方式s_phone、学校s_school)
表中的数据已经达到\(10^9+\),且这些学生所在的大学不会产生业务逻辑关系,那么把不同学校的学生放在一张表便会增加查询负担。这时应以学生所在的学校进行分表,用学校名作为表名(注意:不要用汉字作为表名,用学校的英文名)。

二、解决过程
DECLARE @oid UNIQUEIDENTIFIER,
@s_no int,
@s_name varchar(50),
@s_sex nvarchar(10),
@s_birthday char(10),
@s_adress nvarchar(50),
@s_phone char(11),
@s_school nvarchar(50);
DECLARE @rowNum int;
DECLARE myCursor CURSOR
FOR
SELECT oid,s_no,s_name,s_sex,s_birthday,s_adress,s_phone,s_school FROM 学生表 WHERE s_school='河北大学';
-- 定义变量,用来统计结果集数量
SET @rowNum = 0;
OPEN myCursor --打开游标
FETCH NEXT FROM myCursor INTO @oid,@s_no,@s_name,@s_sex,@s_birthday,@s_adress,@s_phone,@s_school;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @rowNum = @rowNum + 1;
INSERT INTO HeBeiUniversity (s_no,s_name,s_sex,s_birthday,s_adress,s_phone,s_school) VALUES (@s_no,@s_name,@s_sex,@s_birthday,@s_adress,@s_phone,@s_school);
-- DELETE FROM 学生表 WHERE oid=@oid;
FETCH NEXT FROM myCursor INTO @oid,@s_no,@s_name,@s_sex,@s_birthday,@s_adress,@s_phone,@s_school;
END
PRINT(@rowNum)
CLOSE myCursor; --关闭游标
DEALLOCATE myCursor --撤销游标,释放资源
经过测试,在总表(约 2千万 条数据)中剪切 4889866条数据共花费时间:36分43秒
三、反思总结
在进行业务表设计时,需要考虑不同区域的数据是否有必要放在一张表中。若一股脑将所有数据放在一张表,会给后续的业务查询带来较大的压力。
若已经将所有区域数据放在一张表了,那么要及时根据区域剥离数据(分表),提高业务查询效率。
四、参考引用
无

浙公网安备 33010602011771号