查询类:random_page_cost参数和effective_cache_size参数
索引可以增加查询效率,而该参数的设置会影响数据库是否积极地使用索引。
默认的索引是树状结构,根据索引来检索数据的时候,是根据索引的匹配结果再到实际表中的对应位置读取数据。从磁盘的角度来讲,这种读取数据的方式叫做乱序读取(正式叫法不清楚...)。 相反,不利用索引,直接扫描表的方式叫做顺序读取。
乱序读取当然比顺序读取要慢。而postgresql用random_page_cost参数来设置乱序读取要比顺序读取慢多少(倍)。
现在我们使用的新服务器的内存比数据库要大3倍,所以理论上所有的数据都能放入内存。这样的话,乱序读取和顺序读取的效率不会差多少。而默认的4倍就不合适了。这次我们把它设置为1,也就是说和顺序读取一样的效率,让数据库积极的使用索引来检索数据。
另外,effective_cache_size参数是告诉数据库,OS的缓存大小。越大,数据库使用索引的积极性就越高。因为数据很可能在os的缓存里,乱序读取的效率也不差。这个值理论上等于OS可以使用的缓存大小。
验证方法:
一个很简单的方法就是查看是否使用了Bitmap位图扫描规划。
位图扫描规划是Bitmap Index Scan和Bitmap Heap Scan的组合。先用Bitmap Index Scan通过索引,把匹配结果放到位图表(这个表会使用work_mem设置的大小,超过就要写入到临时文件,影响效率),在通过这个位图表循序读取数据库表(Bitmap Heap Scan),返回最终结果。
从理论上来说,性能按照 索引扫描 > 位图扫描 > 顺序扫描 的顺序由高到低排列。
如果你的服务器的内存没这么富裕,可以通过pg_statio_user_tables和pg_statio_user_indexes表查看每个表和索引的缓存程度。
根据表的缓存程度,调节相关的SQL语句查询时的设置值。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/378235/viewspace-680709/
,如需转载,请注明出处,否则将追究法律责任。