日期:2014-05-18  浏览次数:20453 次

数据库优化问题
本人做了个网上书店,图书大概20万左右。但是现在数据库sql   server占用的CPU很严重。CPU占用在90%的持续时间比较长,我用sql事件探查器观察了一下,主要是下面这个sql语句
select   distinct   a.bookId,a.bookName,a.bookpic,a.ISBN,a.cbs,a.shichangjia,a.huiyuanjia,a.VIPjia,a.VIP2jia,a.bookdate,a.bookzz   from   books   a   With   (nolock)     inner   Join   BookType   b   With   (nolock)     on   a.bookid=b.PId   inner   Join   types   c   With   (nolock)     on   b.TypeId=c.Tid   where   c.TypeId   like   '0.1% '   order   by   a.bookdate   desc
这个sql语句表示查找类别在0.1(计算机图书)下的所有图书。books为图书信息表,booktype为图书分类对应表。因为一本图书可能会对应好几个分类。types为图书分类表。typeid为分类规则编码。下级分类通过0.1.XX扩充。在sql事件探查器中,这个sql语句中cpu字段和read字段的值分别为:3218和20107。另外我对这几个表分别建立了以下几个索引:除开主键外所有索引都为非聚合索引,因为对索引了解得不是很透彻,填充因子都是默认0%。
books表:1.bookdate(出版日期,因为需要根据出版日期进行排序)   2.bookname(图书名称,因为提供了根据图书名称检索)   3.cbs(出版社,需要根据出版社搜索)   4.isbn(需要根据图书isbn搜索)。4个索引都是单独建立的。
types表:typeid(分类编码,上面的sql语句中的like用到)
另外,我的sql语句中,根据图书名称,图书isbn,出版社等的查询条件都是模糊查询,即前后都有%,这样好像导致索引不起作用了,有没有什么办法可以解决?
希望有人解决下,分析下我的sql语句和索引是否合理,如果谁能帮我解决好,我愿意再加100分,如果需要有偿解决,我也愿意,可以细谈。谢谢各位了。

------解决方案--------------------
%是一个很不好的东西,你看一下有没有可能把你的like '0.1% '换成> = '0.1 ' and < '0.2 '。
我手头没有数据库,不确定这样是不是可以改善索引的使用。

另外如果开头的地方用%,是一个很糟糕的开始。但是业务往往需要这样也没办法。加大内存,尽可能cache咯
------解决方案--------------------
like '0.1% ',索引仍旧会起作用的

我想也不是內存上的問題吧