科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道大批量的数据应当怎样进行数据库的优化

大批量的数据应当怎样进行数据库的优化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

许多程序员在利用一些前端数据库开发工具开发数据库应用程序时只注重用户界面的华丽,不重视查询语句的效率问题,本文以应用实例为基础,介绍查询优化技术在现实系统中的运用。

作者:赛迪网 yashi 来源:天新网 2008年4月22日

关键字: SQL Server SQL Mssql 数据库

  • 评论
  • 分享微博
  • 分享邮件

下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:

SELECT part_desc,vendor_name,part_amount 

FROM part,vendor,parven 

WHERE part.part_num=parven.part_num 

AND parven.vendor_num = vendor.vendor_num 

ORDER BY part.part_num

如果不建立索引,上述查询代码的开销将十分巨大。为此,我们在零件号和厂商号上建立索引。索引的建立避免了在嵌套中反复扫描。关于表与索引的统计信息如下:

表    行尺寸  行数量   每页行数量  数据页数量 

(table)(row size)(Row count)(Rows/Pages)(Data Pages) 

part   150    10,000    25      400 

Vendor  150    1,000    25      40 

Parven  13     15,000   300      50 

索引   键尺寸  每页键数量  页面数量 

(Indexes)(Key Size)(Keys/Page)   (Leaf Pages) 

part    4     500       20 

Vendor   4     500       2 

Parven   8     250       60

看起来是个相对简单的3表连接,但是其查询开销是很大的。通过查看系统表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理顺序存放的。parven表没有特定的存放次序。这些表的大小说明从缓冲页中非顺序存取的成功率很小。此语句的优化查询规划是:首先从part中顺序读取400页,然后再对parven表非顺序存取1万次,每次2页(一个索引页、一个数据页),总计2万个磁盘页,最后对vendor表非顺序存取1.5万次,合3万个磁盘页。可以看出在这个索引好的连接上花费的磁盘存取为5.04万次。

实际上,我们可以通过使用临时表分3个步骤来提高查询效率:

(1).从parven表中按vendor_num的次序读数据:

SELECT part_num,vendor_num,price 

FROM parven 

ORDER BY vendor_num 

INTO temp pv_by_vn

这个语句顺序读parven(50页),写一个临时表(50页),并排序。假定排序的开销为200页,总共是300页。

(2).把临时表和vendor表连接,把结果输出到一个临时表,并按part_num排序:

SELECT pv_by_vn,* vendor.vendor_num 

FROM pv_by_vn,vendor 

WHERE pv_by_vn.vendor_num=vendor.vendor_num 

ORDER BY pv_by_vn.part_num 

INTO TMP pvvn_by_pn 

DROP TABLE pv_by_vn

这个查询读取pv_by_vn(50页),它通过索引存取vendor表1.5万次,但由于按vendor_num次序排列,实际上只是通过索引顺序地读vendor表(40+2=42页),输出的表每页约95行,共160页。写并存取这些页引发5*160=800次的读写,索引共读写892页。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章