AND rcvblls.balance0
AND cust.postcode“98000”
ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
SELECT cust.name , rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:
SELECT * FROM cust_with_balance
WHERE postcode“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少 。
注意:临时表创建后不会反映主表的修改 。在主表中数据频繁修改的情况下,注意不要丢失数据 。
7.用排序来取代非顺序存取
非顺序磁盘存取是最慢的操作 , 表现在磁盘存取臂的来回移动 。SQL语句隐藏了这一情况 , 使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询 。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询 。
实例分析
下面我们举一个制造公司的例子来说明如何进行查询优化 。制造公司数据库中包括3个表 , 模式如下所示:
1.part表
零件号?????零件描述????????其他列
(part_num)?(part_desc)??????(other column)
102 , 032???Seageat 30G disk?????……
500,049???Novel 10M neork card??……
……
2.vendor表
厂商号??????厂商名??????其他列
(vendor _num)?(vendor_name) (other column)
910,257?????Seageat Corp???……
523,045?????IBM Corp?????……
……
3.parven表
零件号?????厂商号?????零件数量
(part_num)?(vendor_num)?(part_amount)
102,032????910,257????3,450,000
234,423????321,001????4 , 000,000
……
下面的查询将在这些表上定期运行 , 并产生关于所有零件数量的报表:
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万次 。
hibernate如何优化大数据量操作php如何优化数据库连接?
推荐阅读
- saphanatools的简单介绍
- 电商如何去起步,电商怎样起步
- 电商如何绕过监管售假,如何规避电商风险
- 主播怎么打开变声器直播,主播怎么打开变声器直播唱歌
- vb.net读取股票 vb读取数据
- java的伪代码怎么写,java伪代码是什么意思
- 不用密码的路由器怎么登陆,不用密码的路由器怎么登陆网页
- go语言ctrlb Go语言中文网
- 启动flutter总是报错,flutter run没反应