README
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. $Header: /usr/local/cvsroot/pgsql/src/backend/access/nbtree/README,v 1.1.1.1 1996/07/09 06:21:12 scrappy Exp $
  2. This directory contains a correct implementation of Lehman and Yao's
  3. btree management algorithm that supports concurrent access for Postgres.
  4. We have made the following changes in order to incorporate their algorithm
  5. into Postgres:
  6. +  The requirement that all btree keys be unique is too onerous,
  7.    but the algorithm won't work correctly without it.  As a result,
  8.    this implementation adds an OID (guaranteed to be unique) to
  9.    every key in the index.  This guarantees uniqueness within a set
  10.    of duplicates.  Space overhead is four bytes.
  11.    For this reason, when we're passed an index tuple to store by the
  12.    common access method code, we allocate a larger one and copy the
  13.    supplied tuple into it.  No Postgres code outside of the btree
  14.    access method knows about this xid or sequence number.
  15. +  Lehman and Yao don't require read locks, but assume that in-
  16.    memory copies of tree nodes are unshared.  Postgres shares
  17.    in-memory buffers among backends.  As a result, we do page-
  18.    level read locking on btree nodes in order to guarantee that
  19.    no record is modified while we are examining it.  This reduces
  20.    concurrency but guaranteees correct behavior.
  21. +  Read locks on a page are held for as long as a scan has a pointer
  22.    to the page.  However, locks are always surrendered before the
  23.    sibling page lock is acquired (for readers), so we remain deadlock-
  24.    free.  I will do a formal proof if I get bored anytime soon.
  25. In addition, the following things are handy to know:
  26. +  Page zero of every btree is a meta-data page.  This page stores
  27.    the location of the root page, a pointer to a list of free
  28.    pages, and other stuff that's handy to know.
  29. +  This algorithm doesn't really work, since it requires ordered
  30.    writes, and UNIX doesn't support ordered writes.
  31. +  There's one other case where we may screw up in this
  32.    implementation.  When we start a scan, we descend the tree
  33.    to the key nearest the one in the qual, and once we get there,
  34.    position ourselves correctly for the qual type (eg, <, >=, etc).
  35.    If we happen to step off a page, decide we want to get back to
  36.    it, and fetch the page again, and if some bad person has split
  37.    the page and moved the last tuple we saw off of it, then the
  38.    code complains about botched concurrency in an elog(WARN, ...)
  39.    and gives up the ghost.  This is the ONLY violation of Lehman
  40.    and Yao's guarantee of correct behavior that I am aware of in
  41.    this code.
  42. Notes to operator class implementors:
  43. With this implementation, we require the user to supply us with
  44. a procedure for pg_amproc.  This procedure should take two keys
  45. A and B and return < 0, 0, or > 0 if A < B, A = B, or A > B,
  46. respectively.  See the contents of that relation for the btree
  47. access method for some samples.
  48. Notes to mao for implementation document:
  49. On deletions, we need to adjust the position of active scans on
  50. the index.  The code in nbtscan.c handles this.  We don't need to
  51. do this for splits because of the way splits are handled; if they
  52. happen behind us, we'll automatically go to the next page, and if
  53. they happen in front of us, we're not affected by them.  For
  54. insertions, if we inserted a tuple behind the current scan location
  55. on the current scan page, we move one space ahead.