最近在做一个网游发号系统。需求很简单,就是将厂商给的N个卡号导入到库里在固定的时间为用户提供领取。这个系统最大的亮点应该就是这个N的不确定性,不同的厂商提供的卡数量不同,N可能是10也可能是10W。下图是表结构
山人我做了一个简单的测试,在这个表里插入2000W条数据,然后根据ActivityID随机查询一条数据出来,居然需要4秒多。。于是决定尝试用分区表来优化查询效率。
分区函数如下:
CREATE PARTITION FUNCTION [Card_PF](int)
AS
RANGE LEFT FOR VALUES (500, 1000, 1500, 2000, 2500, 3000)
这里我是用的ActivityID作为分区的条件。每500个活动一个区。
分区方案如下:
CREATE PARTITION SCHEME [Card_PS]
AS
PARTITION [Card_PF] TO ([Card1], [Card2], [Card3], [Card4], [Card5], [Card6], [Card7])
下图是对应的文件和文件组:
接下来就是最关键的一步,为这个表增加一个聚合索引,并且采用上面创建的分区方案:
到此为止分区表已经创建完毕,为了更好的测试效果我在这个新建立的表里从新插入2000W条数据,同样的SQL语句运行时间在1秒左右。
分表前:
分表后:
分表后的IO操作很低:
总结一下:在这里我的需求很适合用到分区表,因为系统的SQL请求很单一,都是按照ActivityID这个聚合索引取数据。但如果实际情况会产生检索其他字段的话需要酌情考虑一下,据我测试在分区表上按照其他字段检索数据反而没有不分区的速度快。
分区表的理论知识请参考:
http://blog.csdn.net/smallfools/article/details/4930810
http://www.cnblogs.com/Mattcoder/archive/2007/02/08/644824.html