mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			540 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			540 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <HTML>
 | |
| <HEAD>
 | |
| 	<TITLE>The POSTGRES95 User Manual - ADMINISTERING POSTGRES</TITLE>
 | |
| </HEAD>
 | |
| 
 | |
| <BODY>
 | |
| 
 | |
| <font size=-1>
 | |
| <A HREF="pg95user.html">[ TOC ]</A> 
 | |
| <A HREF="rules.html">[ Previous ]</A> 
 | |
| <A HREF="refs.html">[ Next ]</A> 
 | |
| </font>
 | |
| <HR>
 | |
| <H1>15.  ADMINISTERING POSTGRES</H1>
 | |
| <HR>
 | |
|      In this section, we will discuss  aspects  of  POSTGRES
 | |
|      that are of interest to those who make extensive use of
 | |
|      POSTGRES, or who are the site administrator for a group
 | |
|      of POSTGRES users.
 | |
| 
 | |
| <H2>15.1.  Frequent Tasks</H2>
 | |
|      Here we will briefly discuss some procedures  that  you
 | |
|      should  be  familiar  with  in  managing  any  POSTGRES
 | |
|      installation.
 | |
| 
 | |
| <H3>15.1.1.  Starting the Postmaster</H3>
 | |
|      If you did not install POSTGRES exactly as described in
 | |
|      the  installation instructions, you may have to perform
 | |
|      some additional steps before  starting  the  postmaster
 | |
|      process.
 | |
|      <UL>
 | |
|       <LI>Even  if you were not the person who installed POSTGRES,  
 | |
|       you  should   understand   the   installation
 | |
|         instructions.  The installation instructions explain
 | |
|         some important issues with respect to where POSTGRES
 | |
|         places  some  important  files,  proper settings for
 | |
|         environment variables, etc. that may vary  from  one
 | |
|         version of POSTGRES to another.<p>
 | |
|       <LI>You must start the postmaster process with the userid 
 | |
|       that owns the installed database files.  In  most
 | |
|         cases,   if   you  have  followed  the  installation
 | |
|         instructions, this will be the user "<B>postgres</B>".   If
 | |
|         you do not start the postmaster with the right userid, 
 | |
|         the backend servers  that  are  started  by  the
 | |
|         postmaster will not be able to read the data.<p>
 | |
|       <LI>Make  sure that <CODE>/usr/local/postgres95/bin</CODE> is in your
 | |
|         shell command path, because the postmaster will  use
 | |
|         your <B>PATH</B> to locate POSTGRES commands.<p>
 | |
|       <LI>Remember  to  set the environment variable <B>PGDATA</B> to
 | |
|         the  directory  where  the  POSTGRES  databases  are
 | |
|         installed.   (This  variable is more fully explained
 | |
|         in the POSTGRES installation instructions.)<p>
 | |
|       <LI>If you do start the  postmaster  using  non-standard
 | |
|         options, such as a different TCP port number, remember 
 | |
|         to tell all users so that  they  can  set  their
 | |
|         <B>PGPORT</B> environment variable correctly.<p>
 | |
|      </UL>
 | |
| 
 | |
| <H3>15.1.2.  Shutting Down the Postmaster</H3>
 | |
|      If you need to halt the postmaster process, you can use
 | |
|      the <B>UNIX</B> <B>kill(1)</B> command.  Some people  habitually  use
 | |
|      the  <B>-9</B> or <B>-KILL</B> option; this should never be necessary
 | |
|      and we do not recommend that you do this, as the  postmaster  
 | |
|      will  be  unable  to  free  its  various shared
 | |
|      resources, its child processes will be unable  to  exit
 | |
|      gracefully, etc.
 | |
| 
 | |
| <H3>15.1.3.  Adding and Removing Users</H3>
 | |
|      The createuser and destroyuser commands enable and disable 
 | |
|      access to POSTGRES by specific users on  the  host
 | |
|      system.
 | |
| 
 | |
| <H3>15.1.4.  Periodic Upkeep</H3>
 | |
|      The vacuum command should be run on each database periodically.   
 | |
|      This  command  processes deleted instances<A HREF="#9"><font size=-1>[9]</font></A>
 | |
|      and, more importantly, updates  the  system  statistics
 | |
|      concerning the size of each class.  If these statistics
 | |
|      are permitted to become out-of-date and inaccurate, the
 | |
|      POSTGRES  query optimizer may make extremely poor decisions 
 | |
|      with  respect  to  query  evaluation  strategies.
 | |
|      Therefore,  we  recommend running vacuum every night or
 | |
|      so (perhaps in a script that is executed  by  the  <B>UNIX</B>
 | |
|      <B>cron(1)</B> or <B>at(1)</B> commands).
 | |
|      Do  frequent  backups.  That is, you should either back
 | |
|      up your database directories using  the  POSTGRES  copy
 | |
|      command  and/or  the  <B>UNIX</B>  <B>dump(1)</B> or <B>tar(1)</B> commands.
 | |
|      You may think, "Why am I backing up my database?   What
 | |
|      about crash recovery?"  One side effect of the POSTGRES
 | |
|      "no overwrite" storage manager is that it is also a "no
 | |
|      log" storage manager.  That is, the database log stores
 | |
|      only abort/commit data, and this is not enough information  
 | |
|      to  recover  the  database  if the storage medium
 | |
|      (disk) or the database files are corrupted!   In  other
 | |
|      words,  if a disk block goes bad or POSTGRES happens to
 | |
|      corrupt a database file, you cannot recover that  file.
 | |
|      This can be disastrous if the file is one of the shared
 | |
|      catalogs, such as pg_database.
 | |
| 
 | |
| <H3>15.1.5.  Tuning</H3>
 | |
|      Once your users start to load a significant  amount  of
 | |
|      data, you will typically run into performance problems.
 | |
|      POSTGRES is not the fastest DBMS in the world, but many
 | |
|      of  the  worst problems encountered by users are due to
 | |
|      their lack of experience with any DBMS.   Some  general
 | |
|      tips include:
 | |
|      <OL>
 | |
|       <LI>   Define indices over attributes that are commonly
 | |
|             used for qualifications.  For  example,  if  you
 | |
|             often execute queries of the form
 | |
|             
 | |
| <pre>                SELECT * from EMP where salary < 5000
 | |
| </pre>
 | |
|             then a B-tree index on the salary attribute will
 | |
|             probably be useful.  If scans involving equality
 | |
|             are more common, as in
 | |
|             
 | |
| <pre>                SELECT * from EMP where salary = 5000
 | |
| </pre>
 | |
|             then  you  should consider defining a hash index
 | |
|             on salary.  You can define both, though it  will
 | |
|             use  more disk space and may slow down updates a
 | |
|             bit.  Scans using indices are much  faster  than
 | |
|             sequential scans of the entire class.<p>
 | |
|       <LI>   Run  the  vacuum  command  a  lot.  This command
 | |
|             updates the statistics that the query  optimizer
 | |
|             uses  to  make  intelligent  decisions;  if  the
 | |
|             statistics are inaccurate, the system will  make
 | |
|             inordinately  stupid  decisions  with respect to
 | |
|             the way it joins and scans classes.<p>
 | |
|       <LI>   When specifying query qualfications  (i.e.,  the
 | |
|             where  part  of the query), try to ensure that a
 | |
|             clause involving a constant can be  turned  into
 | |
|             one  of  the  form  range_variable operator constant, e.g.,
 | |
|             
 | |
| <pre>                EMP.salary = 5000
 | |
| </pre>
 | |
|             The POSTGRES query optimizer will  only  use  an
 | |
|             index  with  a  constant  qualification  of this
 | |
|             form.  It doesn't hurt to write the clause as
 | |
|             
 | |
| <pre>                5000 = EMP.salary
 | |
| </pre>
 | |
|             if the operator (in this case, =) has a commutator   
 | |
|             operator  defined  so  that  POSTGRES  can
 | |
|             rewrite the query into the desired  form.   However,  
 | |
|             if such an operator does not exist, POSTGRES 
 | |
|             will never consider the use of an index.<p>
 | |
|       <LI>   When joining several  classes  together  in  one
 | |
|             query,  try  to  write  the  join  clauses  in a
 | |
|             "chained" form, e.g.,
 | |
|             
 | |
| <pre>                where A.a = B.b and B.b = C.c and ...
 | |
| </pre>
 | |
|             Notice that relatively few clauses  refer  to  a
 | |
|             given  class  and  attribute; the clauses form a
 | |
|             linear sequence connecting the attributes,  like
 | |
|             links in a chain.  This is preferable to a query
 | |
|             written in a "star" form, such as
 | |
|             
 | |
| <pre>                where A.a = B.b and A.a = C.c and ...
 | |
| </pre>
 | |
|             Here, many clauses refer to the same  class  and
 | |
|             attribute  (in  this case, A.a).  When presented
 | |
|             with a query of this form,  the  POSTGRES  query
 | |
|             optimizer will tend to consider far more choices
 | |
|             than it should and may run out of memory.<p>
 | |
|       <LI>   If you are really desperate to  see  what  query
 | |
|             plans look like, you can run the postmaster with
 | |
|             the -d option and then run monitor with  the  -t
 | |
|             option.  The format in which query plans will be
 | |
|             printed is hard to read but you should  be  able
 | |
|             to  tell  whether any index scans are being performed.<br>
 | |
| </OL>
 | |
| 
 | |
| <H2>15.2.  Infrequent Tasks</H2>
 | |
| 
 | |
|      At  some  time or another, every POSTGRES site 
 | |
|      administrator has to perform all of the following actions.
 | |
| 
 | |
| 15.2.1.  Cleaning Up After Crashes
 | |
|      The <B>postgres</B> server and the <B>postmaster</B> run as two  
 | |
|      different   processes.    They  may  crash  separately  or
 | |
|      together.  The housekeeping procedures required to  fix
 | |
|      one  kind of crash are different from those required to
 | |
|      fix the other.
 | |
|      The message you  will  usually  see  when  the  backend
 | |
|      server crashes is:
 | |
|      
 | |
| <pre>         FATAL: no response from backend: detected in ...
 | |
| </pre>
 | |
|      This  generally means one of two things: there is a bug
 | |
|      in the POSTGRES server, or there is a bug in some  user
 | |
|      code  that  has  been dynamically loaded into POSTGRES.
 | |
|      You should be able  to  restart  your  application  and
 | |
|      resume processing, but there are some considerations:
 | |
|      <OL>
 | |
|       <LI>   POSTGRES  usually  dumps a core file (a snapshot
 | |
|             of process memory used  for  debugging)  in  the
 | |
|             database directory
 | |
| <pre>                /usr/local/postgres95/data/base/<database>/core
 | |
| </pre>
 | |
|             on the server machine.  If you don't want to try
 | |
|             to debug the problem or produce a stack trace to
 | |
|             report  the  bug to someone else, you can delete
 | |
|             this file (which is probably around 10MB).<p>
 | |
|       <LI>   When one backend crashes in an uncontrolled  way
 | |
|             (i.e.,  without  calling  its  built-in  cleanup
 | |
|             routines), the postmaster will detect this situation, 
 | |
|             kill all running servers and reinitialize
 | |
|             the state shared among all backends  (e.g.,  the
 | |
|             shared  buffer  pool and locks).  If your server
 | |
|             crashed, you will get the "no response"  message
 | |
|             shown  above.  If your server was killed because
 | |
|             someone else's server crashed, you will see  the
 | |
|             following message:
 | |
|             
 | |
| <pre>                I have been signalled by the postmaster.
 | |
|                 Some backend process has died unexpectedly and possibly
 | |
|                 corrupted shared memory.  The current transaction was
 | |
|                 aborted, and I am going to exit.  Please resend the
 | |
|                 last query. -- The postgres backend
 | |
| </pre><br>
 | |
|       <LI>   Sometimes shared state is not completely cleaned
 | |
|             up.  Frontend applications may see errors of the
 | |
|             form:
 | |
|             
 | |
| <pre>                WARN: cannot write block 34 of myclass [mydb] blind
 | |
| </pre>
 | |
|             In this case, you should kill the postmaster and
 | |
|             restart it.<p>
 | |
|       <LI>   When the system crashes while updating the  system  
 | |
|       catalogs  (e.g.,  when  you  are creating a
 | |
|             class, defining  an  index,  retrieving  into  a
 | |
|             class,  etc.)  the B-tree indices defined on the
 | |
|             catalogs are sometimes corrupted.   The  general
 | |
|             (and  non-unique)  symptom  is  that all queries
 | |
|             stop working.  If you  have  tried  all  of  the
 | |
|             above  steps and nothing else seems to work, try
 | |
|             using the reindexdb command.  If reindexdb  succeeds  
 | |
|             but  things  still  don't  work, you have
 | |
|             another problem; if it fails, the  system  catalogs  
 | |
|             themselves were almost certainly corrupted
 | |
|             and you will have to go back to your backups.<p>
 | |
|      </OL>
 | |
|      The postmaster does not usually crash  (it  doesn't  do
 | |
|      very  much  except start servers) but it does happen on
 | |
|      occasion.  In addition, there are a few cases where  it
 | |
|      encounters  problems  during  the  reinitialization  of
 | |
|      shared resources.  Specifically, there are race  conditions  
 | |
|      where  the  operating system lets the postmaster
 | |
|      free shared resources but then will not  permit  it  to
 | |
|      reallocate  the  same  amount of shared resources (even
 | |
|      when there is no contention).
 | |
|      You will typically have to run the ipcclean command  if
 | |
|      system  errors  cause the postmaster to crash.  If this
 | |
|      happens, you may find (using the UNIX ipcs(1)  command)
 | |
|      that  the  "<B>postgres</B>"  user  has  shared  memory and/or
 | |
|      semaphores allocated even though no postmaster  process
 | |
|      is  running.   In this case, you should run ipcclean as
 | |
|      the  "<B>postgres</B>"  user  in  order  to  deallocate  these
 | |
|      resources.   Be warned that all such resources owned by
 | |
|      the "<B>postgres</B>" user will be deallocated.  If  you  have
 | |
|      multiple  postmaster  processes  running  on  the  same
 | |
|      machine, you should kill all  of  them  before  running
 | |
|      ipcclean  (otherwise, they will crash on their own when
 | |
|      their shared resources are suddenly deallocated).
 | |
| 
 | |
| <H3>15.2.2.  Moving Database Directories</H3>
 | |
|      By default, all POSTGRES databases are stored in  
 | |
|      separate subdirectories under
 | |
|      <CODE>/usr/local/postgres95/data/base</CODE>.<A HREF="#10"><font size=-1>[10]</font></A>  At  some point, you
 | |
|      may find that you wish to move one or more databases to
 | |
|      another  location (e.g., to a filesystem with more free
 | |
|      space).
 | |
|      If you wish to move all of your databases  to  the  new
 | |
|      location, you can simply:
 | |
|      <UL>
 | |
|       <LI>Kill the postmaster.<p>
 | |
|       <LI>Copy  the  entire data directory to the new location
 | |
|         (making sure that the new files are  owned  by  user
 | |
|         "<B>postgres</B>").
 | |
|         
 | |
| <pre>            % cp -rp /usr/local/postgres95/data /new/place/data
 | |
| </pre><p>
 | |
|       <LI>Reset your PGDATA environment variable (as described
 | |
|         earlier in  this  manual  and  in  the  installation
 | |
|         instructions).
 | |
|         
 | |
| <pre>            # using csh or tcsh...
 | |
|             % setenv PGDATA /new/place/data
 | |
| 
 | |
|             # using sh, ksh or bash...
 | |
|             % PGDATA=/new/place/data; export PGDATA
 | |
|             
 | |
| </pre><p>
 | |
|       <LI>Restart the postmaster.
 | |
|       
 | |
| <pre>            % postmaster &
 | |
| </pre><p>
 | |
|       <LI>After  you  run  some  queries and are sure that the
 | |
|         newly-moved database works, you can remove  the  old
 | |
|         data directory.
 | |
| <pre>            % rm -rf /usr/local/postgres95/data
 | |
| </pre><p>
 | |
| </UL>
 | |
|      To  install a single database in an alternate directory
 | |
|      while leaving all other databases in place, do the following:
 | |
| <UL>
 | |
|       <LI>Create  the  database  (if it doesn't already exist)
 | |
|         using the createdb command.  In the following  steps
 | |
|         we will assume the database is named foo.<p>
 | |
|       <LI>Kill the postmaster.<p>
 | |
|       <LI>Copy the directory
 | |
|         <CODE>/usr/local/postgres95/data/base/foo</CODE> and its contents
 | |
|         to  its  ultimate  destination.   It should still be
 | |
|         owned by the "<B>postgres</B>" user.
 | |
|         
 | |
| <pre>            % cp -rp /usr/local/postgres95/data/base/foo /new/place/foo
 | |
| </pre>
 | |
|       <LI>Remove the directory
 | |
|         <CODE>/usr/local/postgres95/data/base/foo</CODE>:
 | |
|         
 | |
| <pre>            % rm -rf /usr/local/postgres95/data/base/foo
 | |
| </pre>
 | |
|       <LI>Make a symbolic link from
 | |
|         <CODE>/usr/local/postgres95/data/base</CODE> to  the  new  directory:
 | |
|         
 | |
| <pre>            % ln -s /new/place/foo /usr/local/postgres95/data/base/foo
 | |
| </pre>
 | |
|       <LI>Restart the postmaster.
 | |
| </UL>
 | |
| <p>
 | |
| <H3>15.2.3.  Updating Databases</H3>
 | |
|      POSTGRES  is  a  research system.  In general, POSTGRES
 | |
|      may not retain the same binary format for  the  storage
 | |
|      of  databases from release to release.  Therefore, when
 | |
|      you update your POSTGRES software,  you  will  probably
 | |
|      have  to modify your databases as well.  This is a common 
 | |
|      occurrence  with  commercial  database  systems  as
 | |
|      well;  unfortunately,  unlike commercial systems, POSTGRES 
 | |
|      does not come with user-friendly utilities to make
 | |
|      your life easier when these updates occur.
 | |
|      In  general,  you  must do the following to update your
 | |
|      databases to a new software release:
 | |
|      <UL>
 | |
|       <LI>Extensions (such as user-defined  types,  functions,
 | |
|         aggregates,  etc.)  must be reloaded by re-executing
 | |
|         the <B>SQL CREATE</B> commands.  See Appendix  A  for  more
 | |
|         details.
 | |
|       <LI>Data  must be dumped from the old classes into ASCII
 | |
|         files (using the <B>COPY</B> command), the new classes created 
 | |
|         in the new database (using the <B>CREATE TABLE</B> 
 | |
|         command), and the data reloaded from the ASCII files.
 | |
|       <LI>Rules  and  views  must  also  be  reloaded  by  
 | |
|       reexecuting the various CREATE commands.
 | |
|      </UL>
 | |
|      You  should  give  any new release a "trial period"; in
 | |
|      particular, do not delete the old  database  until  you
 | |
|      are  satisfied that there are no compatibility problems
 | |
|      with the new software.  For example, you do not want to
 | |
|      discover  that  a  bug  in a type's "input" (conversion
 | |
|      from ASCII) and "output" (conversion to ASCII) routines
 | |
|      prevents  you  from  reloading your data after you have
 | |
|      destroyed your old databases!  (This should be standard
 | |
|      procedure  when updating any software package, but some
 | |
|      people try to economize on disk space without  applying
 | |
|      enough foresight.)
 | |
| 
 | |
| <H2>15.3.  Database Security</H2>
 | |
| 
 | |
|      Most  sites  that  use  POSTGRES  are  educational   or
 | |
|      research  institutions and do not pay much attention to
 | |
|      security in their POSTGRES installations.  If  desired,
 | |
|      one  can install POSTGRES with additional security 
 | |
|      features.  Naturally, such features come  with  additional
 | |
|      administrative overhead that must be dealt with.
 | |
| 
 | |
| <H3>15.3.1.  Kerberos</H3>
 | |
|      POSTGRES can be configured to use the <B>MIT</B> <B>Kerberos</B> network  
 | |
|      authentication  system.   This  prevents  outside
 | |
|      users  from  connecting to your databases over the network 
 | |
|      without the correct authentication information.
 | |
| <p>
 | |
| <H2>15.4.  Querying the System Catalogs</H2>
 | |
|      As an administrator (or sometimes as a plain user), you
 | |
|      want to find out what extensions have been added  to  a
 | |
|      given  database.  The queries listed below are "canned"
 | |
|      queries that you can run on any database to get  simple
 | |
|      answers.  Before executing any of the queries below, be
 | |
|      sure to execute  the  POSTGRES  <B>vacuum</B>  command.   (The
 | |
|      queries  will  run  much more quickly that way.)  Also,
 | |
|      note that these queries are also listed in
 | |
| <pre>         /usr/local/postgres95/tutorial/syscat.sql
 | |
| </pre>
 | |
|      so use cut-and-paste (or the  <B>\i</B>  command)  instead  of
 | |
|      doing a lot of typing.
 | |
|      This  query prints the names of all database adminstrators 
 | |
|      and the name of their database(s).
 | |
| <pre>         SELECT usename, datname
 | |
|              FROM pg_user, pg_database
 | |
|              WHERE usesysid = int2in(int4out(datdba))
 | |
|              ORDER BY usename, datname;
 | |
| </pre>
 | |
|      This  query  lists  all  user-defined  classes  in  the
 | |
|      database.
 | |
| <pre>         SELECT relname
 | |
|              FROM pg_class
 | |
|              WHERE relkind = 'r'           -- not indices
 | |
|                and relname !~ '^pg_'       -- not catalogs
 | |
|                and relname !~ '^Inv'       -- not large objects
 | |
|              ORDER BY relname;
 | |
| </pre>
 | |
|      This  query  lists all simple indices (i.e., those that
 | |
|      are not defined over a function of several attributes).
 | |
| <pre>         SELECT bc.relname AS class_name,
 | |
|                   ic.relname AS index_name,
 | |
|                   a.attname
 | |
|              FROM pg_class bc,             -- base class
 | |
|                   pg_class ic,             -- index class
 | |
|                   pg_index i,
 | |
|                   pg_attribute a           -- att in base
 | |
|              WHERE i.indrelid = bc.oid
 | |
|                 and i.indexrelid = ic.oid
 | |
|                 and i.indkey[0] = a.attnum
 | |
|                 and a.attrelid = bc.oid
 | |
|                 and i.indproc = '0'::oid   -- no functional indices
 | |
|              ORDER BY class_name, index_name, attname;
 | |
| </pre>
 | |
|      This   query   prints  a  report  of  the  user-defined
 | |
|      attributes and their types for all user-defined classes
 | |
|      in the database.
 | |
| <pre>         SELECT c.relname, a.attname, t.typname
 | |
|              FROM pg_class c, pg_attribute a, pg_type t
 | |
|              WHERE c.relkind = 'r'     -- no indices
 | |
|                and c.relname !~ '^pg_' -- no catalogs
 | |
|                and c.relname !~ '^Inv' -- no large objects
 | |
|                and a.attnum > 0       -- no system att's
 | |
|                and a.attrelid = c.oid
 | |
|                and a.atttypid = t.oid
 | |
|              ORDER BY relname, attname;
 | |
| </pre>
 | |
|      This  query  lists  all  user-defined  base  types (not
 | |
|      including array types).
 | |
| <pre>         SELECT u.usename, t.typname
 | |
|              FROM pg_type t, pg_user u
 | |
|              WHERE u.usesysid = int2in(int4out(t.typowner))
 | |
|                and t.typrelid = '0'::oid   -- no complex types
 | |
|                and t.typelem = '0'::oid    -- no arrays
 | |
|                and u.usename <> 'postgres'
 | |
|              ORDER BY usename, typname;
 | |
| </pre>
 | |
|      This query lists all left-unary (post-fix) operators.
 | |
| <pre>         SELECT o.oprname AS left_unary,
 | |
|                   right.typname AS operand,
 | |
|                   result.typname AS return_type
 | |
|              FROM pg_operator o, pg_type right, pg_type result
 | |
|              WHERE o.oprkind = 'l'           -- left unary
 | |
|                and o.oprright = right.oid
 | |
|                and o.oprresult = result.oid
 | |
|              ORDER BY operand;
 | |
| </pre>
 | |
|      This query lists all right-unary (pre-fix) operators.
 | |
| <pre>         SELECT o.oprname AS right_unary,
 | |
|                   left.typname AS operand,
 | |
|                   result.typname AS return_type
 | |
|              FROM pg_operator o, pg_type left, pg_type result
 | |
|              WHERE o.oprkind = 'r'          -- right unary
 | |
|                and o.oprleft = left.oid
 | |
|                and o.oprresult = result.oid
 | |
|              ORDER BY operand;
 | |
| </pre>
 | |
|      This query lists all binary operators.
 | |
| <pre>         SELECT o.oprname AS binary_op,
 | |
|                   left.typname AS left_opr,
 | |
|                   right.typname AS right_opr,
 | |
|                   result.typname AS return_type
 | |
|              FROM pg_operator o, pg_type left, pg_type right, pg_type result
 | |
|              WHERE o.oprkind = 'b'         -- binary
 | |
|                and o.oprleft = left.oid
 | |
|                and o.oprright = right.oid
 | |
|                and o.oprresult = result.oid
 | |
|              ORDER BY left_opr, right_opr;
 | |
| </pre>
 | |
|      This  query  returns  the  name,  number  of  arguments
 | |
|      (parameters)  and  return  type  of  all user-defined C
 | |
|      functions.  The same query can  be  used  to  find  all
 | |
|      built-in  C  functions if you change the "<B>C</B>" to "<B>internal</B>", 
 | |
|      or all <B>SQL</B> functions if you  change  the  "<B>C</B>"  to
 | |
|      "<B>sql</B>".
 | |
| <pre>         SELECT p.proname, p.pronargs, t.typname
 | |
|              FROM pg_proc p, pg_language l, pg_type t
 | |
|              WHERE p.prolang = l.oid
 | |
|                and p.prorettype = t.oid
 | |
|                and l.lanname = 'c'
 | |
|              ORDER BY proname;
 | |
| </pre>
 | |
|      This  query  lists  all of the aggregate functions that
 | |
|      have been installed and the types to which they can  be
 | |
|      applied.  count is not included because it can take any
 | |
|      type as its argument.
 | |
| <pre>         SELECT a.aggname, t.typname
 | |
|              FROM pg_aggregate a, pg_type t
 | |
|              WHERE a.aggbasetype = t.oid
 | |
|              ORDER BY aggname, typname;
 | |
| </pre>
 | |
|      This query lists all of the operator classes  that  can
 | |
|      be  used  with each access method as well as the operators 
 | |
|      that can be  used  with  the  respective  operator
 | |
|      classes.
 | |
| <pre>         SELECT am.amname, opc.opcname, opr.oprname
 | |
|              FROM pg_am am, pg_amop amop, pg_opclass opc, pg_operator opr
 | |
|              WHERE amop.amopid = am.oid
 | |
|                and amop.amopclaid = opc.oid
 | |
|                and amop.amopopr = opr.oid
 | |
|              ORDER BY amname, opcname, oprname;
 | |
| </pre>
 | |
| <p>
 | |
| 
 | |
| <HR>
 | |
| <A NAME="9"><B>9.</B></A>
 | |
| This may mean different things depending on the archive
 | |
| mode  with  which each class has been created.  However, the
 | |
| current implementation of the vacuum command does  not  perform  any  compaction or clustering of data.  Therefore, the
 | |
| UNIX files which store each POSTGRES class never shrink  and
 | |
| the space "reclaimed" by vacuum is never actually reused.
 | |
| 
 | |
| <HR width=50 align=left>
 | |
| <A NAME="10"><B>10.</B></A>
 | |
| Data for certain classes may  stored  elsewhere  if  a
 | |
| non-standard  storage  manager  was specified when they were
 | |
| created.  Use of non-standard storage managers is an experimental feature that is not supported outside of Berkeley.
 | |
| <HR>
 | |
| <font size=-1>
 | |
| <A HREF="pg95user.html">[ TOC ]</A> 
 | |
| <A HREF="rules.html">[ Previous ]</A> 
 | |
| <A HREF="refs.html">[ Next ]</A> 
 | |
| </font>
 | |
| 
 | |
| 
 |