Loading

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秒

三、反思总结

在进行业务表设计时,需要考虑不同区域的数据是否有必要放在一张表中。若一股脑将所有数据放在一张表,会给后续的业务查询带来较大的压力。

若已经将所有区域数据放在一张表了,那么要及时根据区域剥离数据(分表),提高业务查询效率。

四、参考引用

posted @ 2023-02-09 09:25  eiSouthBoy  阅读(256)  评论(0)    收藏  举报