海量数据多表查询的问题,超有难度!!急求高手指教!!

时间:2022-09-29 23:45:52
现有一个文章数据库,要实现查询指定记录数的数据(如select top 200),又要查询与其相关的表,最后实现输出指定记录的功能。
与之相关的数据库结构如下:
作品表:books(bookid,btitle,classid,hits)记录数 万级
分卷表:bookj(jid,jtitle,bookid)    记录数 十万级
章节表:bookz(zid,ztitle,bookid,jid,updates)   记录数 百万级
分类表:class(classid,classname)
(主键、索引都是默认id,递增,其他均未做任何索引或优化等)
具体描述:要查询按点击数(hits)降序的前200部作品,并显示

作品名称(btitle),所属分类(classname,class.classid=books.classid),该作品最新章节(ztitle,bookz.bookid=books.bookid,按updates降序),最新章节所属分卷(jtitle,bookj.jid=bookz.jid)

这样的sql语句该怎么写??如果用存储过程又该怎么写?

原先用的是,嵌套循环,即,查询作品->查询所属分类->查询最新章节->查询其所属分卷,
用while循环,嵌套查询,输出(我用asp编写的)。
发现当要显示的记录数较大(200)的时候,速度很慢,效率太低(mssql占用cpu近100%,几乎死掉,最后用时近30秒),不得不放弃了。还有,随着要查询的记录增大,耗时几乎平方级增加!

然后改写后,大致如下(还未包含查询分类)
select top 100 a.bookid,a.btitle,b.jtitle,c.zid,c.ztitle from books as a join bookj as b on a.bookid=b.bookid join bookz as c on a.bookid=c.bookid where zid = (select top 1 zid from bookz as c where c.bookid=a.bookid  order by c.updates desc,c.zid desc) and b.jid = c.jid order by a.hits desc,a.bookid desc

当查询较大记录时(同样200),效率提高很多(用时3-4秒),而且不管要查询的记录数多少,时间都差不多。
已经优化不少了,但是个人觉得远远不够!!(因为结果是秒级,而不是毫秒级的~~)我对sql语句研究不深,以上代码仅仅是经过多番网上搜索相关资料总结得来的,现学现用的,应该存在不少问题或者弯路。我发现没有经过系统的学习,自行泛泛搜索、研究是一件极度不明智的行为。有时候高手的一句有针对性的指点可以事半功 N 倍!!!
因此,在此恳请高手指点一下,如何设计代码,或者改动数据库,效率可以更高一些??用mssql存储过程最好。而且最好能给出asp的调用代码(我用asp写的程序)

7 个解决方案

#1


建立索引bookid,估計能提高查詢效率

#2


To:playwarcraft

建立索引bookid,估計能提高查詢效率

======
在books表中有bookid的索引,但是其他的都不是,因为不能只针对一个查询语句特地去优化某数据库的。。。
======
继续求教高手!!!

#3


加索引:

作品表:books(hits)
章节表:bookz(bookid), bookz(updates)

#4


To:Haiwer

加索引:

作品表:books(hits)
章节表:bookz(bookid), bookz(updates)

======
索引有聚集和非聚集。我的mssql数据库设计的时候,基本没什么考虑优化。作品表books,按bookid递增,章节表按zid递增,默认应该都是聚集索引了吧?

然后我应该如何增加其它索引呢?不是说聚集索引只能有一个吗?但是我在“设计表”的属性框里面,可以将默认的索引扩充成很多个字段(默认的只有对例如id这样一个字段的索引),请问怎么解释?

还有,比如作品表中,我要排序的不仅仅是hits,我还有其它的参数,字段,都要建立索引么?会不会有什么影响?
======

我很菜,继续求教!!

#5


建立合理的索引可以成倍提高搜索速度。
我曾开发的一个系统,数据量也很大,最后也是通过建立索引解决的。
把在条件中用到的字段建立索引,可以提高速度。

#6


建立索引

作品表:books(hits)
分卷表:bookz(bookid)
章节表:bookz(bookid)

select top 100 
a.bookid,
a.btitle,
(select jtitle from bookj where bookid = a.bookid) as jtitle,
(select top 1 zid from bookz where bookid = a.bookid order by zid desc) as zid,
(select top 1 ztitle from bookz where bookid = a.bookid order by zid desc) as ztitle,
from books as a
order by a.hits desc, a.bookid desc

#7


LZ有没有考虑过分成两个查询呢?把查询结果先放到temp table中去,再进行联合查询呢?
我是说建了索引之后的.

#1


建立索引bookid,估計能提高查詢效率

#2


To:playwarcraft

建立索引bookid,估計能提高查詢效率

======
在books表中有bookid的索引,但是其他的都不是,因为不能只针对一个查询语句特地去优化某数据库的。。。
======
继续求教高手!!!

#3


加索引:

作品表:books(hits)
章节表:bookz(bookid), bookz(updates)

#4


To:Haiwer

加索引:

作品表:books(hits)
章节表:bookz(bookid), bookz(updates)

======
索引有聚集和非聚集。我的mssql数据库设计的时候,基本没什么考虑优化。作品表books,按bookid递增,章节表按zid递增,默认应该都是聚集索引了吧?

然后我应该如何增加其它索引呢?不是说聚集索引只能有一个吗?但是我在“设计表”的属性框里面,可以将默认的索引扩充成很多个字段(默认的只有对例如id这样一个字段的索引),请问怎么解释?

还有,比如作品表中,我要排序的不仅仅是hits,我还有其它的参数,字段,都要建立索引么?会不会有什么影响?
======

我很菜,继续求教!!

#5


建立合理的索引可以成倍提高搜索速度。
我曾开发的一个系统,数据量也很大,最后也是通过建立索引解决的。
把在条件中用到的字段建立索引,可以提高速度。

#6


建立索引

作品表:books(hits)
分卷表:bookz(bookid)
章节表:bookz(bookid)

select top 100 
a.bookid,
a.btitle,
(select jtitle from bookj where bookid = a.bookid) as jtitle,
(select top 1 zid from bookz where bookid = a.bookid order by zid desc) as zid,
(select top 1 ztitle from bookz where bookid = a.bookid order by zid desc) as ztitle,
from books as a
order by a.hits desc, a.bookid desc

#7


LZ有没有考虑过分成两个查询呢?把查询结果先放到temp table中去,再进行联合查询呢?
我是说建了索引之后的.