mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Improve scalability of md.c for large relations.
So far md.c used a linked list of segments. That proved to be a problem when processing large relations, because every smgr.c/md.c level access to a page incurred walking through a linked list of all preceding segments. Thus making accessing pages O(#segments). Replace the linked list of segments hanging off SMgrRelationData with an array of opened segments. That allows O(1) access to individual segments, if they've previously been opened. Discussion: <20140331101001.GE13135@alap3.anarazel.de> Reviewed-By: Peter Geoghegan, Tom Lane (in an older version)
This commit is contained in:
@@ -64,8 +64,12 @@ typedef struct SMgrRelationData
|
||||
*/
|
||||
int smgr_which; /* storage manager selector */
|
||||
|
||||
/* for md.c; NULL for forks that are not open */
|
||||
struct _MdfdVec *md_fd[MAX_FORKNUM + 1];
|
||||
/*
|
||||
* for md.c; per-fork arrays of the number of open segments
|
||||
* (md_num_open_segs) and the segments themselves (md_seg_fds).
|
||||
*/
|
||||
int md_num_open_segs[MAX_FORKNUM + 1];
|
||||
struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1];
|
||||
|
||||
/* if unowned, list link in list of all unowned SMgrRelations */
|
||||
struct SMgrRelationData *next_unowned_reln;
|
||||
|
||||
Reference in New Issue
Block a user