排序既然需要磁盘工作量也需要内存中的工作量。内存中的工作量取决于排序的列数、组合的排序键的宽度和通过查询过滤器的行组合的数量。可以减少排序的成本。
可以使用以下公式来计算排序操作所需的内存中的工作量:
Wm = (c * Nfr) + (w * Nfrlog2(Nfr))
- Wm
- 是内存中的工作量。
- c
- 是要排序的列数并代表从行中抽取列值以及将它们连接成一个排序键的成本。
- w
- 与组合的排序键的宽度成比例(以字节为单位)并代表复制或比较一个排序键所做的工作量。w 的数字值很大程度上取决于使用中的计算机硬件。
- Nfr
- 是通过查询过滤器的行数。
如果要排序的数据量很大,那么排序可能需要将信息临时写入磁盘。您可以将磁盘写入安排在操作系统文件空间或者数据库服务器管理的数据库空间中进行。有关详细信息,请参阅为临时表和排序文件配置数据库空间。
磁盘工作量取决于行所出现的磁盘页的数量、满足查询谓词条件的行数、可放置于排序的页上的行数和必须执行的合并操作的数量。使用以下公式计算排序操作所需要的磁盘工作量:
Wd = p + (Nfr/Nrp) * 2 * (m - 1))
- Wd
- 是磁盘工作量。
- p
- 是磁盘页数。
- Nfr
- 是通过过滤器的行数。
- Nrp
- 是可以放置于一页上的行数。
- m
- 代表排序必须使用的合并级别数。
系数 m 取决于可存放在内存中的排序键数。如果没有过滤器,那么 Nfr/Nrp 等于 p。
当所有键都可以存放在内存中时,m=1
且磁盘工作量等于 p。换句话说,行在内存中被读取并排序。
对于中大型表,行将按满足内存的批进行排序,然后再合并各批。当
m=2 时,行将分批进行读取、排序并写入。然后各批将再次被读取并合并,这样将导致磁盘工作量与以下值成比例:
Wd = p + (2 * (Nfr/Nrp))
过滤器条件越具体,排序的行数越少。
随着行数的增加和内存量的减少,磁盘工作量会增加。
要减少排序的成本,请使用以下方法:
- 使您的过滤器条件尽可能具体(可选择的)。
- 将计划列表限制到那些与您的问题相关的列。