整取整存,尽可能的减少SQL连接数.
表:Users,Categories,Contents,Tags
UserContentRelatedship,CategoryContentRelatedship,ContentTagRelatedship(多对多关系)
不使用分页查询,条件查询只获取记录的标识字段,测试时100W记录首次查询时间为400ms,之后为80ms,
在查询Content与Category对映关系时.通常是多个Content的列表获取其Category信息
所以
在程序中创建一个IDictionary(Of Guid, IList(Of Guid))来表示当前Content与Category的对应关系.
将这些Content的Category关系一次性从数据库中取出,填充到IDictionary(Of Guid, IList(Of Guid))中.
将所有的Category标识去掉重复,一次性从数据库中取出Categories(这个步骤中可以加入缓存,对于已在缓存中存在的Category就不从数据库中取了.).
把取出的Categories填充到Content的Categories属性中.
到此则完成Content的Categories属性填充.
写的好像不怎么明白,只是个想法还没写成具体代码.
在Oxite中看到Post的FillTags的扩展方法,发现这是每个Post都要查询一次数据库.如果一个页面中要显示100个Post,那不就需要查询上100次?那还要加上FillUsers,FillCategories,Fill.....那相当恐怖了.虽然可以用缓存,但缓存多了这个筛选也是相当耗时的.还不如交给微软的SQL来做些工作.或者Oracle.
我改进一下,通过标识来决定一切,所有的查询我只有一个储存过程,并具只返回 标识字段(来自Openlab.Framework,他从来哪的我就不清楚了.),这样做的好处是可以充分利用MSSQL优化效果,如果你觉得不爽可以加入分页语句,但这样似乎就用不上MSSQL本身的缓存了,我在技术远远落后于MSSQL开发团队的情况下,还是把重要的事交给他们吧.
太晚了,不写了,明天把代码写上生成一些数据测试一下.