原远(Q6):有个问题:分类表TQueCategory,问题表TQuestion(T-SQL)  
CREATE TABLE TQueCategory  
(  
ID INT IDENTITY(1,1) PRIMARY KEY,        –问题分类ID  
NAME VARCHAR(20)        –问题分类名称  
)  
CREATE TABLE TQuestion  
(  
ID INT IDENTITY(1,1) PRIMARY KEY,        –问题ID  
CateID INT NOT NULL,        –问题分类ID  
TITLE VARCHAR(50),        –问题标题  
CONTENT VARCHAR(500)        –问题内容  
)  
当前要统计某个分类下的问题数,有两种方式:  
1.每次统计,在TQuestion通过CateID进行分组统计  
SELECT CateID,COUNT(1) AS QueNum FROM TQuestion GROUP BY CateID WHERE 1=1  
2.在TQueCategory表增加字段QueNum,用于标识该分类下的问题数量  
ALTER TABLE TQueCategory ADD QueNum INT   
SELECT CateID,QueNum FROM TQueCategory  
问:在哪种业务应用场景下采用上面哪种方式性能比较好,为什么?  
玄惭(A6):方案 一 需要对 TQuestion 的 CateID字段 进行分组 ,可以在CateID上创建一个索引,这样就可以索引扫描来完成查询;  
方案 二 需要对 TQueCategory 进行扫描就可以得出结果,但是必须在问题表有插入,删除的时候维护quenum数量;  
单单从SQL的性能来看,分类表的数量应该是远远小于问题表的数量的,所以方案二的性能会比较好;  
但是如果TQuestion 的插入非常频繁的话,会带来对TQueCategory的频繁更新,一次TQuestion 的insert或deleted就会带来一次TQueCategory 的update,这个代价其实是蛮高的;  
如果这个分类统计的查询不是非常频繁的话,建议还是使用方案一;  
同时还可能还会其他的业务逻辑统计需求(例如:CateID +时间),这个时候在把逻辑放到TQueCategory就不合适了。  

发表评论

电子邮件地址不会被公开。 必填项已用*标注