
以åã®èšäºã§ã¯ãPostgreSQLã®éçºããã»ã¹ãš ããã®RDBMSã§æè¿æ¡çšãããå®éã®ãããã®äŸãèŠãŠããŸãã ã åæã«ãèæ ®ããããããã¯ãççŽã«èšã£ãŠãã軜èããªãã®ã§ãã-ã¿ã€ããã¹ã®ä¿®æ£ãéçåæã䜿çšããŠèŠã€ãã£ãæãåçŽãªåŠšå®³ã®ä¿®æ£ãªã©ã§ãã
ä»æ¥ã¯ããã§ã«æ·±å»ãªãããã®äŸãèŠãŠãã³ãŒãã®ããã«ããã¯ã解æ¶ããããªãæ·±å»ãªãã°ãä¿®æ£ããæ¯èŒç倧ããªãªãã¡ã¯ã¿ãªã³ã°ãªã©ãè¡ããŸãã 以åãšåæ§ã«ããã®èšäºã®äž»ãªç®çã¯ãPostgreSQL 9.6ã§æ¡çšãããå€æŽã匷調ããããšã§ã¯ãªãããªãŒãã³ãœãŒã¹ãããžã§ã¯ããç¹ã«PostgreSQLã®éçºãèå³æ·±ããããªãã«ãšã£ãŠã¯ããã»ã©é£ãããªãããšã瀺ãããšã§ãã
ãã®ãããã¯ã«èå³ãããå Žåã¯ãç«ããé¡ãããŸãã
6.å€æ°ã®ãªãœãŒã¹ã«å¯ŸããResourceOwnerã®é«éå
ResourceOwnerã¯ãSQLã¯ãšãªã®å®è¡ããã»ã¹ã§ãªãœãŒã¹ã管çããããã«èšèšããããªããžã§ã¯ãã§ãïŒããªããžã§ã¯ãããšããåèªãæç¶ãåèšèªCã«é©çšãããéãïŒã ãã©ã³ã¶ã¯ã·ã§ã³ãšãµããã©ã³ã¶ã¯ã·ã§ã³ããšã«åå¥ã®ResourceOwnerãäœæãããŸãã ResourceOwnerã«ã¯ãRememberLock / ForgetLockãRememberFile / ForgetFileãªã©ã®å€ãã®ã¡ãœããããããŸãã ããã«ãResourceOwnersã¯éå±€åã§ããŸãã äœããã®çç±ã§ãã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ãçºçããå ŽåïŒãŠãŒã¶ãŒãããŒã«ããã¯ãäŸå€ãçºçãããªã©ïŒãResourceOwnerãåã«ãªãªãŒã¹ããŸãããã®ãªãªãŒã¹ã«ããããã®ResourceOwnerã§äœ¿çšãããŠãããã¹ãŠã®ãªãœãŒã¹ã解æŸãããŸãã圌ã®ãåäŸãã 詳现ã¯ã 察å¿ããREADMEãã¡ã€ã«ã«èšèŒãããŠããŸã ã
9.5ã§ã¯ãResourceOwnerã¯é åã䜿çšããŠãªãœãŒã¹ãä¿åããŸããã éåžžããªãœãŒã¹ã¯å²ãåœãŠãããé åºãšéã®é åºã§è§£æŸããããšæ³å®ãããŠãããããForget *ã¡ãœããã¯é åã®æåŸãããªãœãŒã¹ãæ¢ããŸããã ããããå®éã«ã¯ããã®ã¢ãããŒãã¯å¿ ãããããŸãæ©èœããªãããšãå€æããŸããã ãããã£ãŠã ãããã¡ã€ãªã³ã°ã¯ ããã®ã¢ãããŒãã§å€æ°ã®ããŒãã£ã·ã§ã³ãæã€ããŒãã«ã«å¯ŸããŠæãåçŽãªSELECTã¯ãšãªãå®è¡ãããšãPostgreSQLã¯ãããã®åãForget *ã¡ãœããã§ãã¹ãŠã®æéã®30ïŒ ãè²»ããããšã瀺ããŸããã
é åãããã·ã¥ããŒãã«ã«çœ®ãæããããšã§ãããã«ããã¯ã解æ¶ããããšãã§ããŸããã ããã«ãResourceOwnerã®ãªãœãŒã¹ã®éãå°ãªãå Žåã以åãšåæ§ã«é åã䜿çšãããŸãã
/* * ResourceArray is a common structure for storing all types of resource IDs. * * We manage small sets of resource IDs by keeping them in a simple array: * itemsarr[k] holds an ID, for 0 <= k < nitems <= maxitems = capacity. * * If a set grows large, we switch over to using open-addressing hashing. * Then, itemsarr[] is a hash table of "capacity" slots, with each * slot holding either an ID or "invalidval". nitems is the number of valid * items present; if it would exceed maxitems, we enlarge the array and * re-hash. In this mode, maxitems should be rather less than capacity so * that we don't waste too much time searching for empty slots. * * In either mode, lastidx remembers the location of the last item inserted * or returned by GetAny; this speeds up searches in ResourceArrayRemove. */ typedef struct ResourceArray { Datum *itemsarr; /* buffer for storing values */ Datum invalidval; /* value that is considered invalid */ uint32 capacity; /* allocated length of itemsarr[] */ uint32 nitems; /* how many items are stored in items array */ uint32 maxitems; /* current limit on nitems before enlarging */ uint32 lastidx; /* index of last item returned by GetAny */ } ResourceArray;
åããããã«ã¯ResourceOwnerãªãã¡ã¯ã¿ãªã³ã°ãå«ãŸããŠããŸãã 以åã¯ããªãœãŒã¹ã®ã¿ã€ãããšã«ãFilesãHeapTuplesãªã©ã®åå¥ã®é åã䜿çšãããŠããŸããã ãããã®åã¯ãã¹ãŠãã€ã³ã¿ãŒãŸãã¯æŽæ°ã§ãããããDatumïŒuintptr_tã®ããŒã«ã«å¯Ÿå¿ïŒã«æ ŒçŽã§ããŸãã æ°ããResourceArrayãšã³ãã£ãã£ãå°å ¥ãããŸãããããã«ããããªãœãŒã¹ãä¿åã§ããããã«ãªãã倧éã®éè€ã³ãŒããæé€ãããŸããã
ã³ãããïŒ cc988fbb0bf60a83b628b5615e6bade5ae9ae6f4
ãã£ã¹ã«ãã·ã§ã³ïŒ 20151204151504.5c7e4278@fujitsu
7.å ±æãã€ãããã·ã¥ã®ããŒãã£ã·ã§ãã³ã°ããªãŒãªã¹ã
DynahashïŒ dynahash.cãã¡ã€ã«ãåç §ïŒã¯ãããã·ã¥ããŒãã«ã®ããŒã«ã«å®è£ ã§ãã PostgreSQLããã·ã¥ããŒãã«ã¯ãäœæããããã©ã°ã«ãã£ãŠéåžžã«ç°ãªãåäœãããå¯èœæ§ããããŸãã ããšãã°ãããŒã«ã«ããã»ã¹ã¡ã¢ãªãšå ±æã¡ã¢ãªã®äž¡æ¹ã«ååšã§ããŸã ã åŸè ã䜿çšããå Žåãå ±æã¡ã¢ãªã¯ãã¹ãŠã®PostgreSQLããã»ã¹ã®åãä»®æ³ã¢ãã¬ã¹ã«ããããããŸãã å ±æã¡ã¢ãªã¯äžåºŠå²ãåœãŠããããã®ã¡ã¢ãªã®éã¯RDBMSã®æäœäžã«å€æŽã§ããŸããã
ãããã®çç±ãããããããããªãŒãªã¹ãã䜿çšããŠãå ±æããã·ã¥ããŒãã«ã®ç©ºãã¡ã¢ãªïŒç©ºãã¡ã¢ãªã®å°ããªæçã®ãªã¹ãïŒã远跡ããŸãã ã¡ã¢ãªã解æŸãããšã空ããªã¹ãã«è¿œå ãããŸãã ã¡ã¢ãªãå²ãåœãŠãå¿ èŠãããå Žåã空ããªã¹ãããååŸãããŸãã å ±æããã·ã¥ããŒãã«ãžã®ã¢ã¯ã»ã¹ã¯äžåºŠã«è€æ°ã®ããã»ã¹ã«ãã£ãŠå®è¡ããããããããªãŒãªã¹ããžã®ã¢ã¯ã»ã¹ã¯ã¹ãã³ããã¯ã䜿çšããŠåæãããŸãã ç¹å®ã®ããŒãããã®ã¹ãã³ããã¯ã®ããã¯ç«¶åãåŒãèµ·ããããšãå€æããŸããã
çµæã®ãããã¯ããã®åé¡ã次ã®ããã«è§£æ±ºããŸãã 1ã€ã®ããªãŒãªã¹ãã®ä»£ããã«ãããã€ãã®ïŒ32ïŒã䜿çšãããããããã«ç¬èªã®ã¹ãã³ããã¯ããããŸãã
ããã¯ïŒ
struct HASHHDR { slock_t mutex; /* unused if not partitioned table */ long nentries; /* number of entries in hash table */ HASHELEMENT *freeList; /* linked list of free elements */ /* ... */
次ã®ããã«ãªããŸããïŒ
#define NUM_FREELISTS 32 typedef struct { slock_t mutex; /* spinlock */ long nentries; /* number of entries */ HASHELEMENT *freeList; /* list of free elements */ } FreeListData; struct HASHHDR { FreeListData freeList[NUM_FREELISTS]; /* ... */
ããã©ã«ãã§ã¯ã空ããªã¹ãã¯ã¡ã¢ãªã®å²ãåœãŠã«äœ¿çšããããã®æ°ã¯ããŒããã®ããã·ã¥å€ã®äžäœãããã«ãã£ãŠæ±ºå®ãããŸãã
#define FREELIST_IDX(hctl, hashcode) \ (IS_PARTITIONED(hctl) ? hashcode % NUM_FREELISTS : 0)
ãã ãããç§ãã¡ã®ãããªãŒãªã¹ãã®ã¡ã¢ãªããªããªããšãä»ã®ããªãŒãªã¹ããããåçšããããŸãã
ãšãããããã®ãããã¯ãæ¡çšåã«çŽ15ã®ããŒãžã§ã³ãäœæããããªãŒãªã¹ãããã®æ°ãããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒã®å¯èœãªãã¹ãŠã®ã·ã£ãŒãã£ã³ã°æŠç¥ãå®éã«ãœãŒãããæé«ã®ããã©ãŒãã³ã¹ã瀺ãã1ã€ã®ãªãã·ã§ã³ãéžæããå¿ èŠããããŸããã ããšãã°ãæçµå®è£ ã§äœ¿çšããã32åã®ã¹ãã³ããã¯ã®ä»£ããã«ã1ã€ã®RWLockã䜿çšã§ããŸããRWLockã¯ããç§ãã¡ã®ãããªãŒãªã¹ãããã¡ã¢ãªãååŸããå Žåã¯èªã¿åãçšãä»ããåããå Žåã¯èšé²çšã«ãã£ããã£ãããŸãã ããã«ãã¹ãã³ããã¯ã¯ããã£ãã·ã¥ã©ã€ã³ã®é 眮ã®æç¡ã«ããããããã¡ã¢ãªå ã§ããŸããŸãªæ¹æ³ã§é 眮ã§ããŸãã
ã³ãããïŒ 44ca4022f3f9297bab5cbffdd97973dbba1879ed
ãã£ã¹ã«ãã·ã§ã³ïŒ 20151211170001.78ded9d7@fujitsu
8. RBããªãŒã§ã®è€æ°ã®ã€ãã¬ãŒã¿ãŒã®ãµããŒã
å¥ã®æ©èœã«åãçµãã§ãããšãã«ãPostgreSQLã®èµ€é»ããªãŒïŒçŸåšã¯GINã€ã³ããã¯ã¹ã§ã®ã¿äœ¿çšãããŠããŸãïŒã®å埩ã€ã³ã¿ãŒãã§ã€ã¹ã次ã®ããã«ãªã£ãŠããããšã«æ°ä»ããŸããã
void rb_begin_iterate(RBTree *rb, RBOrderControl ctrl); RBNode *rb_iterate(RBTree *rb);
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãããªãŒå ã«è€æ°ã®ã€ãã¬ãŒã¿ãäœæã§ããªããããããªãäžäŸ¿ã§ãã ããã«ãå®è£ ã¯éåžžã«å¥åŠã§ããã ããšãã°ã圌女ã¯ããªãŒã®ããŒãã«å埩ç¶æ ãä¿åããŸããã
å°ãèããŠããã®çµæžããã¹ãŠæžãçŽããåŸãã€ã³ã¿ãŒãã§ãŒã¹ã¯æ¬¡ã®ããã«ãªããŸããã
void rb_begin_iterate(RBTree *rb, RBOrderControl ctrl, RBTreeIterator *iter); RBNode *rb_iterate(RBTreeIterator *iter);
PostgreSQLã§äœ¿çšãããããŸããŸãªã³ã³ããã®è©³çŽ°ã«ã€ããŠã¯ã Cãªã¹ããšæ€çŽ¢ããªãŒã«é¢ããå調ãªèšäºã§ã¯ãããŸãã ã ããã«ããã®ã¿ã¹ã¯ã«åãçµãéçšã§äœæããGitHubãªããžããªã«èå³ããããããããŸããã ãã®äžã«ã¯ãCã®åäžããã³äºéãªã³ã¯ãªã¹ããèµ€é»ããªãŒãããã·ã¥ããŒãã«ã®å®è£ ããããŸããã©ã€ãã©ãªã¯ããã¹ãã§ååã«ã«ããŒãããMIT / BSDã©ã€ã»ã³ã¹ã®äžã§é åžãããŠããŸãã
ã³ãããïŒ 9f85784cae4d057f307b83b0d33edede33434f04
ãã£ã¹ã«ãã·ã§ã³ïŒ 20160727172645.3180b2e0@fujitsu
9.ããã€ãã®ã»ã°ã¡ã³ããæã€ããŒãã«ã®pg_filedumpã®ãã§ãã¯ãµã ã®æ€èšŒã®ä¿®æ£
PostgreSQLã¯ãããŒãã«ãšã€ã³ããã¯ã¹ã®ããŒã¿ãããããããŒãžã«ä¿åããŸãã 1ããŒãžã®ããã©ã«ããµã€ãºã¯8 Kbã§ãã ããŒãžã¯ãã»ã°ã¡ã³ããšåŒã°ãããã£ã¹ã¯äžã®ãã¡ã€ã«ã«ä¿åãããŸãã 1ã€ã®ã»ã°ã¡ã³ãã®ãµã€ãºã¯ããã©ã«ãã§1 GBã§ãã é¢ä¿ãšã€ã³ããã¯ã¹ãã»ã°ã¡ã³ãã«åæãããšãPostgreSQLã¯1 GBãè¶ ãããã¡ã€ã«ããµããŒãããªããã¡ã€ã«ã·ã¹ãã ã§ãåäœããŸãã ããŒãžã䜿çšããŠãã¡ã¢ãªå ã®é »ç¹ã«äœ¿çšãããããŒã¿ã®ãã£ãã·ã¥ã¯ããããããããã¡ãããŒãžã£ã«ãã£ãŠå®è£ ããããã£ã¹ã¯ã¢ã¯ã»ã¹ã®æ°ãå€§å¹ ã«åæžãããŸãã
pg_filedumpãŠãŒãã£ãªãã£ã䜿çšãããšãã»ã°ã¡ã³ããšããŒãžã§ããŸããŸãªäŸ¿å©ãªããšãã§ããŸãã ããšãã°ã圌女ã¯ã»ã°ã¡ã³ãå ã®ãã¹ãŠã®ããŒãžã®ãã§ãã¯ãµã ããã§ãã¯ã§ããŸãã ããŒã¿ããŒã¹ã-kãã©ã°ãæå®ããŠinitdbãåŒã³åºããŠäœæãããå Žåããã§ãã¯ãµã ã¯ããŒãžã«æžã蟌ãŸããŸãã
-k, --data-checksums use data page checksums
èå³æ·±ãããšã«ãããŒãžã®ããã·ã¥é¢æ°ãèšç®ããpg_checksum_pageããã·ãŒãžã£ã¯ãããŒãžã®ã³ã³ãã³ãã ãã§ãªããããã¯çªå·ã«ãäŸåããŸãã
uint16 pg_checksum_page(char *page, BlockNumber blkno)
ããã«ãããããŒãžã«æ£ããããŒã¿ãä¿åãããã ãã§ãªããã»ã°ã¡ã³ãå ã®æ£ãããªãã»ããã«èšé²ãããããšã確èªã§ããŸãã
ãã®ãããæè¿ãpg_filedumpã§ãã°ãçºèŠãããŸããã ãŒãã»ã°ã¡ã³ãã®ãã§ãã¯ãµã ã¯æ£ãããã§ãã¯ãããŸãããã1çªç®ã2çªç®ãªã©ã®ã»ã°ã¡ã³ãã§ã¯ãpg_filedumpã«ãã£ãŠèªã¿åããããã§ãã¯ãµã ã¯ãPostgreSQLèªäœã«ãã£ãŠèšç®ããããã§ãã¯ãµã ãšäžèŽããŸããã§ããã çµå±ã®ãšãããpg_filedumpã¯ã©ã®ã»ã°ã¡ã³ãã§ããããã¯çªå·ããŒãããã«ãŠã³ããå§ããŸããã æ£ããæ¹æ³ã¯ã以åã®ãã¹ãŠã®ã»ã°ã¡ã³ããèæ ®ãããçžå¯Ÿçãªããã®ã§ã¯ãªãããã®ã»ã°ã¡ã³ãã«ã絶察çãªãããã°çªå·ã䜿çšããããšã§ãã
æãããªçç±ã«ãããåããããã§ãpg_filedumpã«ä»¥åã¯æ¬ èœããŠãã2ã€ã®ãã©ã°ã®ãµããŒããè¿œå ãããŸããã
-s Force segment size to [segsize] -n Force segment number to [segnumber]
ã³ãããïŒ 052ed0112967dd1e9b0e2cbe54821c04475f1a3a
ãã£ã¹ã«ãã·ã§ã³ïŒïŒ æä»çã«ãªããªã¹ãïŒ
10. mallocïŒïŒãreallocïŒïŒãããã³ãã®ä»ã®ããã·ãŒãžã£ã«ãã£ãŠè¿ãããå€ã確èªãã
çµå±ãç§ã¯èªåã§ã¯ãªããã¬ãã¥ã¢ãŒãšããŠè¡åããããããæžããŠæ®ãããšã«ããŸããã ã³ãŒãã¬ãã¥ãŒã®éçšã§ããã®ãããã®å€ãã®æ¹åãææ¡ããŸããã
Michael Paquierã¯ãPostgreSQLãmallocïŒïŒãreallocïŒïŒãããã³strdupïŒïŒããã·ãŒãžã£ã®ãªã¿ãŒã³ã³ãŒãããã§ãã¯ããªãå Žæããããšããäºå®ã«æ³šç®ããŸããã ãããã®äœæ¥äžã«ãããã·ãŒãžã£ã®ãªã¹ãã¯callocïŒïŒã§è£å®ãããå ±æã¡ã¢ãªãæäœããããã®ããã·ãŒãžã£ãè¿œå ãããŸããã
ãã®çµæãå¯èœãªå ŽåãåŒã³åºãã¯åæ§ã®å®å šãªPostgreSQLã®é¡äŒŒç©ïŒpg_strdupãpg_mallocãªã©ïŒã«çœ®ãæããããŸããã
- steps = malloc(sizeof(Step *) * nsteps); + steps = pg_malloc(sizeof(Step *) * nsteps);
ä»ã®å Žæã§ã¯ããã§ãã¯ãåã«è¿œå ãããŸããã
new_environ = (char **) malloc((i + 1) * sizeof(char *)); + if (!new_environ) + { + write_stderr("out of memory\n"); + exit(1); + }
ãã€ã±ã«èªèº«ã®æçš¿-Postgres 10ãã€ã©ã€ã-ShmemAllocããã³ShmemAllocNoErrorãåç §ããŠãã ããã
ã³ãããïŒ 052cc223ã6c03d981
ãã£ã¹ã«ãã·ã§ã³ïŒ CAB7nPqRu07Ot6iht9i9KRfYLpDaF2ZuUv5y_+72uP23ZAGysRg@mail.gmail.com
ç¶è¡ããã«ã¯...
ãã¡ããããã®ãããªæçš¿ã誰ãã«èå³ããããšããæ¡ä»¶ã§:)ãããããååã®1人ã«æè¿äœæ¥ããããããã«ããŒããããã«èª¬åŸããããšãã§ããã§ãããã çµå±ã®ãšããããã®æŽæ°ããã°ã©ã ã®éçºè ãããããã®æŽæ°ããã°ã©ã ã«ã€ããŠèª°ãããããç¥ãããšãã§ããŸããïŒ
ãã€ãã®ããã«ãç§ã¯ããªãã®è³ªåã楜ãã¿ã«ããŠãããã³ã¡ã³ãã§ãããã«çãããã§ãã ãããŠäžè¬çã«ãã³ã¡ã³ããè¿œå ããããããªãã§ãã ããïŒ
ç¶ãïŒ PostgreSQLã®å®éã®ãããã®äŸïŒNã®ããŒã3