| *** This document is formatted for a FIXED PITCH FONT and ***
| *** an 80 CHARACTER display ***
I N G R E S
F R E Q U E N T L Y A S K E D Q U E S T I O N S ( F A Q )
| This version: 1.8 08SEP97
| Last version: 1.7 21MAY95
| Archived at ftp.naiua.org in /pub/ingres
| Copyright (C) 1997 by Roy Hann
This document is COPYRIGHTED to control its distribution and to prevent
it from being used for profit. PLEASE DO NOT DISTRIBUTE IT WITHOUT THIS
DISCLAIMER OR THE COPYRIGHT NOTICE. Replication of this document by any
means is explicitly encouraged, provided that the content is not altered
in any way.
------------------------ D I S C L A I M E R --------------------------
| BKB ENGINEERING LTD., COMMON SENSE COMPUTING INC., RAYTHEON CO., AND THE
| NAIUA WILL TAKE ABSOLUTELY NO RESPONSIBILITY FOR THE CONTENT OF THIS FAQ.
| I PREPARED IT ON MY OWN TIME, WITHOUT THE PERMISSION, ENDORSEMENT OR
| KNOWLEDGE OF ANY REPRESENTATIVE OF BKB ENGINEERING. This is a
voluntary effort by many contributors, coordinated by me, who may or
may not be identified in "Contributors." Their respective employers are
in no way responsible for the content of this FAQ. Nothing in this FAQ
should be regarded as true. Any item of information may become
obsolete or out of date at any time. Information about undocumented
features should always be regarded as potentially harmful.
The coordinator, contributors, and distributors of this document make
no representations as to the correctness of the information contained
herein, and make no promises to correct any errors or ommissions. You
use this information at your own peril.
| Roy Hann rhann@tnc.com
| BKB Engineering Ltd., (comments on FAQ to: ingfaq@naiua.org)
11211-76th Avenue,
| Edmonton, Alberta Tel: (403)497-2409
| T6G 0K2 FAX: (403)436-6055
| Canada
-----------------------------------------------------------------------
If you don't see the '---- END OF FAQ ----' line, something is missing.
-----------------------------------------------------------------------
TABLE OF CONTENTS
00. Notes
00.001 Contributors
00.002 Notations
00.003 Acronyms and Abbreviations
00.004 Changes in this Version
00.005 Useful telephone numbers and E-mail addresses
| 01. Ingres
01.001 What is Ingres?
01.002 Where can I get PD Ingres?
| 01.003 Where can I get CA-Ingres?
| 01.004 How much does Ingres cost?
| 01.005 Does Ingres support SQL?
| 01.006 What are the features of Ingres?
| 01.007 What platform should I run Ingres on?
| 01.008 Can I run Ingres on machine ABC?
| 01.009 Can I run Ingres over network ABC?
| 01.010 Where is the Ingres FAQ?
| 01.011 Where can I get the Ingres TPC benchmark results?
| 01.012 Is Postgres anything to do with Ingres?
| 01.013 Is Ingres secure?
| 01.014 Does Ingres run on the PC under MS-DOS or MS-Windows?
| 01.015 Where can I subscribe to the Info-Ingres mailing list?
01.016 Can I get the FAQ by E-mail?
01.017 Can I get the FAQ on discette?
01.018 Is the FAQ available on WWW?
| 01.019 Where can I get a comparison of RDBMS products?
| 01.020 Can I use a RAID with Ingres?
|
| 02. Miscellaneous date questions
|
| 02.001 Is 2000 A.D. a leap year?
| 02.002 Are there any Y2K (Year 2000) problems with Ingres?
03. Contributed software
| 03.001 ftp site for Ingres tools
03.002 ingperl, sqlperl and DBperl
03.003 tclsql
03.004 $II_SYSTEM/ingres/sig
| 03.005 NAIUA tool set
03.006 onyx
04. Third-Party Software
04.002 Can I use ODBC (MS-Windows Open Data Base Connectivity)?
04.003 What is Grafsman?
04.004 What is GQL?
| 04.005 Can I use JDBC (Java connectivity)?
05. Books
| 05.001 What is a good book on Ingres?
05.002 What is a good book on relational databases?
05.003 Where can I get a description of the SQL standard?
05.004 Where can I get a (BNF) definition of SQL syntax?
06. Reviews/Articles
| 06.001 Are there any Ingres periodicals?
| 06.002 What are sources of reports on Ingres?
| 06.003 Where can I find recent articles about Ingres?
| 07. Ingres/Advisor and Tech support
| 07.001 What is Ingres/Advisor?
| 07.002 How can I access Ingres/Advisor?
07.003 What is ProAlert?
07.004 How do I log trouble calls?
07.006 How do I vote on a SIR?
07.007 Tech support is useless, what do I do now?
| 07.008 What is CA-TCC?
| 07.009 How do I find out about patches?
08. General Frequently-Asked-Questions
| 08.001 How can I store a large object in an Ingres database?
08.002 How can I suppress execution (I only want to see the QEP)?
08.003 Other than this FAQ, what is a good source of practical info?
| 08.005 Why is Ingres reporting an incorrect row count?
| 08.006 Can I do an outer join?
08.007 How can I add/delete/alter a column in a table?
08.008 How can I grant other people access to my tables?
08.009 How can I change the ownership of a table/report/form?
08.010 What is a QEP and how do I interpret it?
08.011 How can I ask for just the first N rows?
08.012 Can I override the optimizer with my own execution plan?
08.013 How can I tell why my search is taking so long?
08.014 What are TIDs?
08.015 How can I display the proper Fkey labels using an emulator?
| 08.016 Does Ingres support row-level locking?
08.017 How can I invoke emacs (or any other editor) within isql?
08.018 How can I change the displayed precision in isql?
08.019 How can I change the destructive behaviour of the Return key?
08.020 Does anyone at CA read comp.databases.ingres?
08.021 Is it possible to generate FRS forms dynamically at run-time?
08.022 Why are modifications allowed to the system catalogs...?
| 08.023 How can I bulk authorize Ingres users?
08.024 How can I load ASCII-delimited files created by PC `X' base?
08.025 How can I import dates from PC `X' base?
08.026 How can I create export files for a PC application?
| 08.027 What Ingres files can I delete (to recover space)?
08.028 How can I assign sequential record numbers?
08.029 How can I do a case-insensitive string match with wild-cards?
| 08.030 How can I generate surrogate keys for best performance?
08.031 How do I find rows that don't match a row in another table?
08.032 Why do I have a SWAP and a NOSWAP authorization string?
08.033 How can I automatically report the location of an ESQL error?
08.034 What are some good trace points?
| 08.035 Does Ingres have an API I can use?
08.036 How can I find duplicate rows in a table?
| 08.037 How can I create a WWW interface to an Ingres database?
| 08.038 Is there any point in doing REPEATED INSERT?
| 08.039 Can you get unloaddb to go directly to tape?
09. RDBMS
09.001 What processes do what?
09.002 How are extra iislave (disc) processes started?
09.003 How do I recover an inconsistent database?
09.004 What are "compressed" table structures?
09.005 Why might I configure more than 1 DBMS server process?
09.006 How can I direct batch or reports to a particular server?
| 09.007 How does Ingres use sort space?
| 09.008 When does Ingres switch to a new journal?
09.009 Should I use mirroring on my data locations?
09.010 Can I use mirroring as a super-fast checkpoint?
09.011 Can I mirror my log file?
09.012 Can I have more than 1 DBMS page cache?
09.013 Can I have more than 1 fast commit server?
| 09.014 What is the Ingres Search Accelerator?
| 09.015 When and how do I use the Ingres Search Accelerator?
| 09.016 How can I find out more about the Ingres Search Accelerator?
09.017 Why am I running out of QSF memory (E_OP0886 and E_QS0001)?
| 09.018 How can I assign particular jobs to particular servers?
| 09.019 Should I set II_DMFRCP_STOP_ON_INCONS_DB?
| 09.020 How do I recover after a fire/flood in the machine room?
10. QUEL
10.001 What is QUEL?
10.002 How different is QUEL from SQL?
10.003 Should I learn QUEL?
10.004 Should I convert my QUEL to SQL?
10.005 Are there any utilities for converting QUEL to SQL?
11. VIFRED
12. Report Writer
12.001 How can I put ASCII TABs in a report?
12.002 How do I put escape characters in a report?
12.003 How can I number pages as "Page n of m"
12.004 How do I submit a report to run at a given time?
13. QBF
14. ABF
14.002 What causes C compilation errors while building an ABF image?
15. RBF
| 16. OpenROAD/Windows4GL/W4GL
16.001 Why is Windows4GL so slow to react to database events?
16.002 How can I force a window to stay visible on top?
| 16.003 Is anyone working on an OpenROAD/W4GL FAQ?
| 16.004 How easily can I use the OpenROAD-Oracle driver?
| 16.005 Where can I get more information about OpenROAD?
17. VISION
18. NET
18.001 What do I do if I can't connect?
18.002 How do I configure NET?
18.003 What is the 'ingvalidpw' program for?
| 18.004 How can I restart NET without restarting Ingres?
18.005 How can I shut down the communications servers?
| 18.006 Which Ingres processes do I need on a client system?
18.007 How do I configure different protocols?
18.008 What is the address and listen information in netu?
18.009 How does NET figure out its TCP port numbers?
18.010 Can I have 2 installations running NET on the same system?
18.011 How can I use different protocol...to access the same server?
18.012 Can NET use all of my LAN boards?
18.013 Can I use NET over a LAN bridge?
18.014 What about NET over WANs?
18.015 What if I change my password on my NET server username?
18.016 What do communication servers do?
18.017 Will my applications run over NET unchanged?
18.018 Will my applications perform over NET unchanged?
18.019 What's the GCA protocol?
18.020 Does NET present any special security problems?
| 18.021 Can I run Ingres clients without NET?
19. STAR
20. Embedded
20.001 What C compilers are supported?
20.002 Can I use C++?
21. Database Procedures
21.001 What are database procedures?
21.002 Database Procedures and QEP's
21.003 Database Procedures and Locking
21.004 Can I flush out procedures without shutting down the server?
21.005 Database Procedures and Security
21.006 Database Procedures and Cacheing
30. errlog.log
30.001 My error log is full of E_SC022F_BAD_GCA_READ. What's wrong?
30.002 How can I trim errlog.log?
| 90. Ingres on Unix (Solaris, AIX, OSF/1 etc.)
90.001 How can I un-nice iidbms (Ultrix)?
| 90.002 Can Ingres make use of PrestoServe (Ultrix)?
90.003 What do the iislave processes do?
90.004 How many iislaves do I need?
90.005 Why is a raw log file faster on UNIX?
90.006 Should I stripe my raw log file on UNIX?
| 90.007 How do Ingres processes communicate on UNIX?
| 90.008 How does Ingres maintain database integrity on UNIX?
90.009 Should I stripe my data locations on UNIX?
90.010 Where do I start looking with a Unix performance problem?
90.011 Which filesystem type should I choose? (SVR4)
90.012 Will VxFS give me better performance? (SVR4)
| 90.013 What kernel resources does Ingres need? (SVR4)
| 90.014 What process limits could affect Ingres? (SVR4)
90.015 What CPU scheduler parameters should I set up? (SVR4)
90.016 Should I run the DBMS server as a real time process? (SVR4)
| 90.017 Why can't Ingres allocate shared memory? (SunOS/Solaris)
| 91. Ingres on VMS/OpenVMS
| 92. Ingres on OS/2
| 93. Ingres on Windows NT
| 93.001 How can I keep Ingres running after the user ingres logs off?
93.002 Do I need NT Server (formerly NTAS)?
99. User Groups
99.001 How can I contact the NAIUA? (North America)
99.002 How can I contact the UKIUA? (United Kingdom)
99.003 How can I contact my local users group? (US)
99.004 How can I contact my local users group? (Canada)
99.005 How can I contact my users group? (South Africa)
| 99.006 How can I contact my users group? (Europe)
99.007 How can I contact my users group? (Irish Republic)
99.008 How can I contact my local user group? (Australia)
| 99.009 How can I contact my local user group? (India)
| SECTION 0 -- NOTES
|
00.001 Contributors
This FAQ is the work of numerous individuals working on it on their
own time. (At least) the following people contributed:
Steve Caswell sfc@tpghq.com
Darrin Chaney
Laurie Comeau lcomeau@unb.ca
Michael Dorfman MDORFMAN@hamp.hampshire.edu
| Robert Griffith rcg@swl.msd.ray.com
Tracy Gulliver tmg@unb.ca
Roy Hann rhann@tnc.com
John Hascall john@iastate.edu
Tim Holmes timh@psammead.demon.co.uk
Jeffrey Horn horn@cs.wisc.edu
Bruce Horrocks bh@granby.demon.co.uk
Angela Lamb
| Mike Leo mal@visi.com
Brig McCoy brigc@world.std.com
Carole McMillan carole@cent1.lancs.ac.uk
Bob Salnick salnick@dejavu.spk.wa.us
| Please direct all corrections, suggestions and complaints to the following
| email address: ingfaq@naiua.org
| At this time, that will direct the messages to Bob Griffith and Roy Hann.
| Roy still hopes to be involved with the FAQ, but it will be to a lesser
| degree.
| New contributors are always welcome. General expressions of praise
| and gratitude can be directed to any and all of the above.
|
None of these people presently are employees of Computer Associates;
they may or may not have other official links to the company.
00.002 Notations
Any non-trivial changes made since the immediately preceding version of
the FAQ are identified by a `|' at the left of the page. (If anyone
misses some issues and wants a custom marked-up version, send mail to
rhann@tnc.com indicating the version number of the last version you saw.
Version 1.0 is the first version ever.)
There are certainly numerous references to trademarked terms in this
document. Failure to acknowledge the registered owner of the trademark
should not be construed as an attempt to contest or userp the trademark.
00.003 Acronyms and Abbreviations
| 3GL so-called 3rd generation language (eg C, Cobol, FORTRAN)
ANSI American National Standards Institute
API Application Programming Interface
BBS Bulletin Board System
| CA Computer Associates International, Inc.
DBA Data Base Administrator
DBMS Data Base Management System
DML Data Manipulation Language
FAQ Frequently Asked Questions (Answered)
FRS (INGRES) Forms Run-Time System
ISO International Standards Organization
ITSEC International Technology Security Evaluation Criteria
LAN Local Area Network
NAIUA North American INGRES Users Association
NCSC National Computer Security Center
OLTP On-Line Transaction Processing
PC (IBM-style) Personal Computer
PD Public Domain
RDBMS Relational Data Base Management System
SIR System Improvement Request
TPC Transaction Processing Council (and its benchmarks -A, -B, -C)
Dramatis Personae
RTI Relational Technology Inc.
ASK The ASK Group (f. A. Sandra Kurtzig, founder)
CA Computer Associates
Internet Shorthand (by popular demand)
AFAIK ...as far as I know...
BTW ...by the way...
FWIW ...for what it's worth...
IMHO ...in my [anything but] humble opinion...
IMO ...in my opinion...
RTFM Read the manual!
TIA ...thanks in advance...
| YMMV ...your mileage may vary--indicates uncertainty
:-) smiley face--indicates levity
;-) wink--indicates irony
:-( sad face--indicates regret
00.004 Changes in this Version
(All minor corrections and clarifications are indicated with a vertical
bar at the left of the page. This section lists only changes which
are not signalled sufficiently clearly with the bar at the the left.)
| ** All references to CA-OpenIngres and CA-OpenROAD have been changed to
| OpenIngres and OpenROAD respectively, consistent with current CA
| practice.
| 01 Sections 01.019 and 01.020 have been added.
| 02 Sections 02.001 and 02.002 have benn added.
| 03 Section 03.005 has been added.
| 04 Section 04.005 has been added.
| 07 Section 07.004 has been restored, Section 07.009 has been added.
| 08 Sections 08.030, 08.037, 08.038 and 08.039 have been added.
| 09 Mike Leo has replaced section 09.010
| 14 Section 14.001 has been deleted.
| 16 Section 16.005 has been added.
| 91 All sections deleted.
|
| 92 All sections deleted.
|
| 99 Major revisions to virtually all sections; section 99.009 has been added
|
|
00.005 Useful telephone numbers and E-mail addresses
Phone Numbers
===== =======
Computer Associates sales information . . . . . . . . . . . 1-800-CALL-CAI
| CA-World '97 conference and reservation information . . . . 1-800-CA-INFO97
| INGRES Technical Support . . . . . . . . . . . . . . . . . (516)342-5500
| E-Mail Addresses & URLs
| ====== ========= = ====
| mgmt@naiua.org . . . . . . . . . . . NAIUA info and membership enquiries
| ftp.naiua.org (/pub/ingres) . . . . . . . . . . . . . . . INGRES ftp site
| http://www.naiua.org . . . . . . . . . . . . . . . . . . . NAIUA Web site
| http://www.cai.com . . . . . . . . . . . . . Computer Associates Web site
| http://www.caworld.com. . . . . . . . . . . . . . . CA World '97 Web site
Also see section 99 of the FAQ for the address and telephone number of
IUA officers in various countries.
| SECTION 1 -- INGRES
| 01.001 What is INGRES? %Roy Hann
| INGRES is a relational database management system.
|
There are two distinct strains of INGRES; there is so-called
"University" Ingres, which is in the public domain, and there is a
| commercial version of INGRES developed and marketed by Computer
| Associates. Most of this FAQ is devoted to the commercial version
| which is called OpenIngres.
University Ingres is also known as Berkeley Ingres, Ingres89, and
"distributed" Ingres. (The latter term is unfortunate because it is
hard to know whether someone is talking about public domain
"University" Ingres, or the distributed database management
| capabilities of OpenIngres. The term "distributed" should probably be
| avoided.) University Ingres is the original version of Ingres
| developed at UC Berekely during the 1970s to demonstrate the concept of
| a relational database. It has a plausible claim to being the first
| implementation of a relational database management system since it
| pre-dates IBM's System R. This program eventually evolved into the
| first versions of the commercial product marketed by Relational
| Technology Inc. (eventually bought by The ASK Group and then by
| Computer Associates). It has some of the features of the currently
available commercial version, but is architecturally different; the DML
is QUEL, and the performance and reliability are only fair to
adequate. NB: NONE of this FAQ is related to University Ingres unless
EXPLICITLY noted.
| OpenIngres is a commercial product and costs money to buy. It is a
| robust, state-of-the-art RDBMS with a reputation for including
| first-class development tools. The database server component runs on
| all the major Unix derivatives, as well as VMS, Microsoft Windows NT,
| and even on Novell Netware as an NLM. The Ingres client components run
| on all of these too, and also on AXP VMS, Microsoft DOS and Microsoft
| Windows.
| As well as a database engine, the OpenIngres product suite includes a
| range of development and enquiry tools and components for implementing
| distributed databases. The database engine and tools are usually
| referred to collectively as "Ingres" without distinction.
| --------------------
| Trivium: INGRES is an acronym for INteractive Graphics REtrieval System
| (revealing the nature of the project out of which the experiments with
| relational databases arose). By happy accident, there was also a
| French artist by the same name: Jean Auguste Dominique Ingres
| (1780-1867). (A highly placed source who wishes to remain anonymous
| confirms that the selection of the name WAS an accident.) Warning to
| those with no social life: The book entitled "Ingres's Eroticized
| Bodies" by Carol Ockman, ISBN: 0300059612, has nothing to do with
| software.
01.002 Where can I get PD Ingres?
University Ingres 8.9 is in the public domain. It is available for
anonymous ftp from many sites around the world. It is also distributed
as unsupported or contributed software by some vendors, such as
Digital Equipment Corporation.
ftp Sites:
==========
s2k-ftp.cs.berkeley.edu pub/ingres
This site also has the `linux' port of Ingres 8.9. Many additional
sites can be located using "archie" and other mechanisms.
Contact: ingres@postgres.berkeley.edu
There are no known ports of University Ingres to Xenix, MS-DOS,
Windows NT, or any other non-Unix operating system. [If you are aware
of counter-examples please let me know at rhann@tnc.com] There have been
various bold announcements of efforts to do some of these other ports,
but so far none has come to fruit.
| 01.003 Where can I get OpenIngres?
| OpenIngres is a commercial product. For information, pricing and
authoritative availability information contact your local Computer
Associates office.
| Australia: (61)(2)923-2066
Austria: (43)(1)894-1913
Belgium: (32)(2)773 28 11
Canada: (905)676-6700
Denmark: (45)(42)95 86 00
France: (33)(1)40-97-50-50
Germany: (49)(6151)949-0
Holland: (31)(3402)483 45
Ireland: (353)(1)478 0800
New Zealand: (64)(4)801-7654
UK: (44)(753)5777 33
US: 1-800-225-5224
Or call International Operations at 1-516-342-5224 for the number of
your local office.
01.004 How much does INGRES cost?
| University Ingres is free. OpenIngres is not.
The cost varies a lot depending on the class of machine you intend
| to use, the number of users, and what components of OpenIngres you want.
| It can be a little or a lot. Contact your Computer Associates office.
| 01.005 Does OpenIngres support SQL?
| OpenIngres supports SQL. OpenIngres 1.x is compliant with the ANSI/ISO
| Entry-Level SQL92 (SQL2) standard and also has some of the
| Intermediate-Level features. Embedded SQL and embedded Dynamic SQL are
| also fully supported. (See section 05.003 below for SQL2 references.)
| Note that OpenIngres also supports QUEL and embedded QUEL, which it
inherits from University Ingres. Computer Associates de-emphasizes
QUEL for obvious commercial reasons. Because QUEL has considerable
| technical advantages over SQL, OpenIngres adopted SQL relatively late
| (c. 1986) and perhaps for this reason there is a lingering
| misapprehension that OpenIngres still does not support SQL.
University Ingres supports only QUEL and embedded QUEL. (See 03.006
for a description of `onyx' which provides an SQL to QUEL interface for
University Ingres.)
| 01.006 What are the features of OpenIngres?
DATATYPES
=========
| OpenIngres supports the following native datatypes:
i1 1-byte signed integers
i2 2-byte signed integers
i4 4-byte signed integers
f4 4-byte floating point
f8 8-byte floating point
cN N-byte fixed length PRINTING character strings (1<=N<=2000)
char(N) N-byte fixed length ASCII character strings (1<=N<=2000)
varchar(N) N-byte variable length ASCII strings (1<=N<=2000)
text(N) N-byte variable length ASCII, except NUL (1<=N<=2000)
date 12-byte date and/or time (absolute or interval)
money 8-byte money type (locally defined currency)
| byte 1-byte unsigned quantity
| decimal N-byte fixed decimal
| long varchar N-byte variable length ASCII strings (1<=N<=2Gb)
| long byte N-byte variable length binary data (1<=N<=2Gb)
Columns of the above types may be made nullable, or may be assigned a
| default value. OpenOpenIngres 1.x allows user definable default values.
table_key 8-byte surrogate key (optionally system maintained)
object_key 16-byte surrogate key (optionally system maintained)
| In addition, an optional OpenIngres component, the Object Management
Extension, allows the programmer to define abstract datatypes and
operators on those datatypes and the native datatypes. The new types
and operators can be used in any context without restriction.
TABLE ORGANIZATION
==================
| OpenIngres allows base tables (and secondary indices) to be organized as:
ISAM
compressed ISAM
hash tables
compressed hash tables
heaps
compressed heaps
sorted heaps
compressed sorted heaps
B-trees
compressed B-trees
Tables may have up to 300 columns, and a row may be up to 2000 bytes.
Tables may have up to 8 million pages of 2kb each (16Gb). The number
of rows that will fit in 8 million pages depends on the row size.
There is no practical limit on the number of tables in a database.
There is no practical limit on the number of databases on a system.
Tables may be reorganized, relocated and re-indexed on-line.
| A table may be distributed over multiple OpenIngres locations.
| OpenIngres locations can be defined on an unlimited number of physical
drives.
| OpenIngres uses the native file system of the platform on which it is
running. A "database" is (one or more) directories, and tables
are files within the directory.
OPERATORS
=========
| OpenIngres supports all the SQL92 operators, and QUEL.
DISTRIBUTED DATABASE CAPABILITIES
=========== ======== ============
| OpenIngres applications can connect over a network to remote databases
| using OpenIngres/Net. That is to say that the application does not
necessarily have to be running on the same machine as the database.
| An application can use OpenIngres/Net to connect to more than one remote
database simultaneously (BUT NOT INTEROPERATIVELY; ie. it can't join
together two tables, one from each database.) More importantly changes
made to the databases cannot be guaranteed to have referential
integrity. To achieve this, special coding is required, or the
| application should use OpenIngres/Star.
| Using OpenIngres/STAR databases can be distributed over multiple host
| systems. Using OpenIngres/STAR a table in database `A' CAN be joined with
a table in database `B'.
| OpenIngres also provides gateway products that allow OpenIngres to access
"foreign" databases. Gateways exist for a number of products such
as Rdb, DB2 and IMS.
| OpenIngres can act as an ODBC server.
SECURITY
========
| Using SQL OpenIngres provides the usual per-user security constraints.
Users can be selectively permitted to read, update, append and
delete, on a table by table basis.
| Using the optional OpenIngres/Knowledge Management Extensions it
is also possible to define and manage groups of users and user roles.
Both of these make security management much simpler.
QUEL users can additionally control access by time of day, day of
the week, terminal used, and the content of the record. These
extra QUEL constraints ARE NOT IMPOSED ON SQL USERS.
For users with special security needs, there is a secure version
| of OpenIngres called OpenIngres/Enhanced Security.
See section 01.013 for further information.
INTEGRITY
=========
Integrity constraints on the data are imposed at the level of the
database engine and cannot be subverted, except that integrity
constraints are not enforced during table load operations using the
`copy' command. Integrity constraints can also be imposed in form
definitions, but these are imposed only if the user happens to use
form which includes the constraints (or validations as they are
called in `vifred'.)
| Declarative referential integrity constraints are supported.
Checkpoints of the database can be done on-line and can be written
to disc or tape.
| 01.007 What platform should I run OpenIngres on?
| There is no single good answer to this question, although it pops up
regularly. It depends on dozens, maybe even hundreds of factors.
| The best you can probably hope for is some advice on the KIND of system
| to run. You can then contemplate factors like the vendor's quality of
| service, the operating costs, the kind of deal you can cut, and a host
| of intangibles--like do you feel comfortable dealing with the company?
| No one can help you with these.
| If you are going out to buy hardware to run OpenIngres, and you don't
have an installed base or any other factors affecting your decision
| other than just finding the "best" OpenIngres platform, then you should
| first decide how you want to run OpenIngres.
| You have three or four choices: (1) you can run the OpenIngres server
| and the OpenIngres applications on a central system in the traditional
| mainframe style. (2) You can run the OpenIngres server on a central
| database host and have one or more OpenIngres application servers
| accessing the database through OpenIngres/NET. (3) You can have the
| OpenIngres server run on a database host and have the applications run
| on desktop clients such as PCs or Unix workstations. (4) You can do a
| mix of all of the above, with X-terminals thrown in to cloud the issue
| still further.
The pros and cons of the various approaches are too numerous to go
| through in detail here now (a future version of the FAQ may attempt a
| discussion of this subject). For now, suffice it to say that a single
| central system and a number of "dumb" character-cell terminals will
| probably be the cheapest solution and will not raise any networking
| issues. A client/server solution with a dedicated central database
| host and intelligent desk-top clients will probably get the best
| performance out of any given database host but could be expensive if
| the clients aren't already in place.
Neither of these generalizations will always be true of course, but
| they may serve to help the hardware selection process. If the database
| server and the applications are going to run on a central system, you
| may need a more powerful machine. If you just run the database server
| on the central system and have smart clients, you may be able to get
| away with a more modest machine. Maybe. As always, job mix, work load
| peaks, access patterns and a myriad other things can influence what you
| need.
Having selected your strategy, you can move on to select specific
hardware. If the decision is unconstrained by any requirement for
compatibility with existing hardware or the need to exploit existing
expertise, you could look at benchmark results. The "benchmark"
benchmark is the suite of TPC benchmarks (TPC-A, -B and -C).
| Unfortunately OpenIngres is not submitted to the Transaction Processing
Council for evaluation. Furthermore, these are presently regarded with
some suspicion because -A and -B have been accused of being open to
manipulation. Indeed the same claim has been made about the whole TPC
organization. Eventually these issues will be resolved, but for now,
the benchmarks are probably still quite useful for comparing hardware
platforms running a specific DBMS product, even if they are not
reliable for comparing different DBMS products. Even if the benchmarks
were above suspicion, they should still only figure as one factor among
many.
| No matter what platform you choose, you must configure it correctly to
| get the best performance out ot it. A good hardware vendor will be
| willing to help you with this, indeed their willingness to help could
| reasonably be a selection criterion. Proper configuration can include
| tuning system software parameters, installing optional software
| designed to improve database performance, and choosing the right
| hardware components in the first place. It is possible to misconfigure
| any system. Note that workstations are generally designed and
| configured to optimize number crunching and sequential access to
| contiguous regions of disc--for signal and image processing
| applications. A database server has very different needs.
| A relational database application will be disc bound (usually), so it
| pays to buy fast discs. In most relational databases you tend to get
| lots of little records spread all over the disc so transfer time will
| usually be irrelevant--access time (rotational latency and seek-time)
| will dominate. Fast discs are currently able to achieve average seek
| times of 8-9msec and average rotational latency of 4.3msec.
| A fast disc is wasted without a controller that can take advantage of
| its speed. Choose a fast controller too. The controller should not
| only be fast with one disc, it should exhibit a linear increase in
| throughput as discs are added.
| No OpenIngres system should have fewer than 3 physical discs. To
| achieve the maximum level of security from disaster you will want to
| ensure that you can keep your database, your transaction log and your
| journal files physically separate. If this is done, then even in the
| event of a catastrophic failure of a disc drive you would be able to
| recover the database to the state in which it was at the precise
| instant of the failure. A RAID might be a very good alternative.
Some routine database operations require space equal to 3 times the
| space occupied by the largest table. Plan to have sufficient free disc
| space at ALL times to allow you to do a "modify" on your largest
| table.
| Extra RAM is never wasted.
A high-capacity tape back-up device would be convenient.
| 01.008 Can I run OpenIngres on machine ABC?
| It is believed that the entire OpenIngres product is presently available
for at least the following machines/operating systems:
Intel machines running Windows NT
| Intel machines running OS/2 (strictly Net) --OpenROAD/W4GL in beta
Bull DPX/20
Convex (** see below)
DEC Alpha OSF/1
DEC VAX BSD
DEC VAX Ultrix
DEC VAX VMS
DG AViiON DG/UX
HP 9000 HP/UX
IBM HACMP/6000
IBM RS/6000 AIX
ICL DRS 6000
ICL VME
MOTOROLA 88000 System V
NCR Series 3000
NCR Series 3600 (massively parallel)
PYRAMID OSx BSD
PYRAMID SYSTEM V
SCO Open Desktop
SCO UNIX
SEQUENT DYNIX/PTX
SIEMENS MX
Sun SPARCsystems Solaris 2.x
Sun SPARCsystems SunOS 4.1.x
TANDEM Integrity Nonstop-UX
| In addition, the OpenIngres clients are available for:
386/486 machines running MS-DOS
386/486 machines running MS-Windows
DEC AXP OpenVMS
There is NO server product available for MS-DOS or MS-Windows.
| There is NO OpenIngres product available for Silicon Graphics, but this
| is under development and should be available by late 97/early 98.
|
| [** OpenIngres 6.3 runs on the Convex C2 and C3 under Covex OS 10.1
but the current/future status of this product is unknown to me. Check
with your local Computer Associates office.]
| The NAIUA web site currently lists platforms where OpenIngres products were
| recently made generally available, as well as platforms which are
| currently in Beta release. This information is furnished to the NAIUA
| by Computer Associates representatives. You can find this information
| on the following web page:
|
| http://www.naiua.org/faqs.html
|
Be sure to contact your local Computer Associates office for
authoritative information.
| 01.009 Can I run OpenIngres over network ABC?
| There are OpenIngres/NET network adaptors for at least:
TCP/IP
DECnet
SNA LU0
SNA LU62
Wollongong TCP/IP
DEC UCX TCP/IP
IBM TCP/IP
KNET TCP/IP
Be sure to contact your Computer Associates office for authoritative
information.
01.010 Where is the INGRES FAQ?
| The INGRES FAQ (~300kb) is archived at:
| ftp.naiua.org in /pub/ingres
| Updates to the FAQ seem to get posted very infrequently at the moment,
| especially when I am distracted by actual work.
The following is an example of the dialogue with the FTP server; lines
that include user input are marked with a `->' symbol:
-> ftp ftp.naiua.org
| Connected to ftp.naiua.org.
...
-> Name (ftp.naiua.org:): anonymous
331 Guest login ok, send your complete e-mail address as password.
-> Password: juser@somewhere.org
...
230 Guest login ok, access restrictions apply.
-> ftp> cd /pub/ingres
...
250 CWD command successful.
-> ftp> get Ingres-FAQ
200 PORT command successful.
150 Opening ASCII mode data connection for Ingres-FAQ (234847 bytes).
226 Transfer complete.
local: Ingres-FAQ remote: Ingres-FAQ
240460 bytes received in 45 seconds (5.2 Kbytes/s)
-> ftp> quit
221 Goodbye.
| 01.011 Where can I get the OpenIngres TPC benchmark results?
| Ingres is not submitted for TPC benchmarking (or at least the
| results are not submitted to TPC for publication). This may soon change;
| see below.
| You can get the TPC bylaws and the specifications for TPC-A, TPC-B, and
| TPC-C, as well as the results for systems that ARE tested from the
| Transaction Processing Council web site:
| http://www.tpc.org/bench.descrip.html
| The Transaction Processing Council (TPC) can be contacted c/o
| Shanley Public Relations
| 777 N. First Street, Suite 600
San Jose, CA 95112-6311
|
| Tel (408) 295-8894
| FAX (408) 295-9768
shanley@cup.portal.com
| The Transaction Processing Council is a non-profit organization formed
| in 1988 to develop standard benchmarks for transaction processing
systems. The council has more than 40 members consisting of RDBMS
vendors and hardware vendors.
Be aware that there is presently considerable controversy surrounding
the validity of the TPC-A and TPC-B benchmarks. Some commentators have
asserted that certain vendors were able to exploit unrealistic features
of the benchmark specifications to achieve results that are better than
they would have obtained with a less imaginative interpretation of what
was required. So far the same criticism has not been made about the
more realistic TPC-C benchmark.
| The thing to keep in mind when looking at some of these results is that
| a system's performance is expressed (among other ways) as a ratio of
| the number of transactions per second per dollar (tps/$). This means
| that if you can get tps high enough, you can spend ridiculous amounts
| of money and still get a pretty good tps/$ ratio. For instance, if you
| have a really fast 64-bit CPU it may be advantageous to spend an
| astronomical sum to eliminate disc I/O entirely by buying enough RAM to
| load the entire database into memory--say 40Gb of RAM--because the tps
| will be so high that it will still yield a reasonable--even
| attractive--tps/$ ratio. It remains to be shown that this gives any
| insight into the performance to be expected from the same software
| running on more pedestrian hardware.
|
While this may make the TPC-A and -B benchmarks less useful for
comparing different database products, they may still be useful for
comparing different hardware platforms for the same database product,
| ie for helping with the question: what is the best hardware to run DBMS
| X on?
| Interestingly, CA management have twice committed to performing and
| publishing TPC benchmarks for OpenIngres 2.0, once at Ingres World
| '95, and again at Ingres World '96. They would probably only do this
| if they seriously expect to blow someone out of the water.
| As of Ingres World '97, CA management is now stating that they expect
| TPC benchmarks to be published by late this year (1997). Assuming they
| are as good as CA believes they will be, you should certainly hear about
| it when they come out.
|
01.012 Is postgres anything to do with INGRES?
Postgres is an experimental relational database management system
| developed at UC Berkeley. It is intended to demonstrate how object
| oriented data management can be accomplished without discarding the
| relational model. (See Stonebraker's writings on the subject,
| under the heading The Third Generation Database System Manifesto.)
| The project is directed by Professor Michael Stonebraker, one of
the originators of Ingres. Postgres is a spiritual descendent of
University Ingres but is not truly related to INGRES.
| Some very exciting news on the Postgres front is the release of
| PostgresSQL (or Postgres95 as it was initially known). PostgresSQL has
| many fascinating features, and it is the only public domain database
| software with a native SQL interface. (Which is not to suggest that
| having an SQL interface is in any way a good thing, but many people
| have been asking for a PD RDBMS that supports SQL.) PostgresSQL runs
| on AIX, Linux, and possibly NT.
| It is now available for ftp as
| ftp://ftp.postgreSQL.org/pub/postgresql-v6.1.1.tar.gz
| For full information, see:
| http://www.postgresql.org
| http://s2k-ftp.cs.berkeley.edu:8000/postgres95
| Potentially even more exciting is that OpenLink Software offers a native
| PostgresSQL JDBC driver to allow Java applications to run against
| PostgresSQL databases. See http://www.openlinksw.com for more information.
| Mailing Address Purpose
| ======= ======= =======
| pgsql-announce@postgresql.org Postgres discussion and announcements
| pgsql-bugs@postgresql.org Postgres bug reports
| pgsql-questions@postgresql.org Questions to the developers of Postgres
|
| More info, including how to subscribe-unsubscribe to various Postgres
| mailing lists, can be found on this web page:
|
| http://www.postgresql.org/supp-mlists.shtml
|
| [Thanks to Paul M. Aoki and Jolly Chen of UC Berkeley for some of this
| information.]
|
| There is a commercial version of postgres called `Illustra' (at one time
| called `Montage' and also `Miro'). Illustra was recently acquired by
| Informix. You can find more info at the Informix web site:
|
| http://www.illustra.com
|
-------------------
Trivium: Illustra was originally called `Miro'; evidently the joke of
naming products after artists lived on briefly--Miro was a student of
Ingres'.
|
01.013 Is INGRES secure?
| OpenINGRES claims to provide C2 levels of security functionality.
The multi-level secure variant of INGRES (INGRES/Enhanced Security) has
already been certified to provide F-B1 levels of functionality at the
E3 ITSEC assurance level. OpenINGRES/Enhanced Security (the next
release) will shortly be submitted to the US NCSC for B1 evaluation.
INGRES/Enhanced Security is NOT presently certified to be NCSC B1
secure.
To find out what the NCSC security designations mean, consult the
"Orange Book":
Department of Defense Trusted Computer System Evaluation Criteria
DoD Directive 5200.28-STD
National Computer Security Center,
Fort Meade,
MD 20755-6000,
USA
Attn: Chief, Computer Security Standards.
Office of Standards and Products
There is also a "Red Book" covering network security.
01.014 Does INGRES run on the PC under MS-DOS or MS-Windows?
The server does not run under DOS or Windows (but it DOES run under
Windows NT). The INGRES tools do run under DOS and Windows and use
INGRES/Net to access a remote database on a server.
Relational Technology did briefly market a DOS version of INGRES
Release 5 that included the "engine", ABF, QBF and Report Writer, but
that was discontinued.
01.015 Where can I subscribe to Info-Ingres mailing list?
http://planetingres.org/mailman/listinfo/info-ingres
|
|
01.016 Can I get the FAQ by E-mail?
| The FAQ is posted irregularly. Between postings it is
available from the archive site using ftp (see section 01.010). If
you do not have ftp access to the archive site, you can obtain the
| FAQ by mail using one of the many ftpmail servers.
[The following information is provided by Bruce Horrocks and Tom Northey.]
The ftpmail servers use different software and the commands required
will differ from server to server. Try sending a message consisting of
just the word "help".
For some systems, the body of the message should be something like this:
open address [username [password]]
mode ascii
cd /pub/directory/etc
get filename
where address is an IP address, username and password are the username
and password to log into that machine as. Normally these are omitted
and they default to "anonymous" and your own mail address as the
password. Default transfer mode seems to be binary with files coming
over uuencoded, hence the switch into ascii mode.
In reply you get a confirmation of receipt mail message with an ID
number that lets you cancel your request. Assuming all goes well you
get the file requested as a mail message sometime later. Large files
are blocked up into 64k messages and need to be reassembled before
uudecoding.
Here is a list of ftpmail servers:
USA
===
ftpmail@decwrl.dec.com
ftpmail@sunsite.unc.edu
bitftp@pucc.princeton.edu
Europe
======
bitftp@vm.gmd.de
ftpmail@ftp.uni-stuttgart.de
ftpmail@ftp.inf.tu-dresden.de
ftpmail@grasp.insa-lyon.fr
bitftp@plearn.edu.pl
ftpmail@ftp.inf.tu-dresden.de
ftpmail@ftp.uni-stuttgart.de
ftpmail@doc.ic.ak.uk
Australia
=========
ftpmail@cs.uow.edu.au
01.017 Can I get the FAQ on discette?
Yes. As of release 1.5 (13JUL94) it is available on discette at no
| charge from Quest Software or Common Sense Computing. To get a copy, write
| to: info@oz.quests.com or
| Europe Elsewhere
| ====== =========
| Common Sense Computing Quest Software Pty Ltd
| Canada House 10 illowa St
| 272 Field End Rd East Malvern Vic 3145
| Eastcote, Middx. HA4 9NA Australia
| UK
| Phone: 081 866 4400 Phone: 03 885 5829
| FAX: 081 429 2848 FAX: 03 885 0116
| NOTE: Common Sense Computing and Quest Software distribute the FAQ at no
| charge as a service to the user community and are not in any way responsible
| for the content of the FAQ. All corrections and flames should be
| directed to ingfaq@naiua.org
01.018 Is the FAQ available on WWW?
Yes, but not in a really convenient form.
You can try looking at
| http://www.naiua.org/faqs.html
| A much better implementation of the FAQ in hypertext format will
| be announced soon.
| 01.019 Where can I get a comparison of RDBMS products?
| In November of 1996 Martin Rennhackkamp published a comparison of Oracle,
| Informix, DB2, OpenIngres, Sybase, and Microsoft SQL Server in DBMS
| Magazine. See:
|
| http://www.dbms.mfi.com/9611d52.html
|
|
| 01.020 Can I use a RAID with Ingres?
|
| Yes. As far as Ingres is concerned it is just disk space.
|
| RAID stands for Redundant Array of Inexpensive Disks. Just what it means
| beyond that is up to you. There are generally held to be 6 non-trivial
| variants of RAID, each with different properties. All offer some degree
| fault-tolerance and redundancy, but there are performance and price
| tradeoffs.
|
| For many people RAID means RAID 5. RAID 5 has many virtues but write
| performance is not one of them. Write-intensive applications would do
| well to choose another configuration. Also, anecdotal evidence claims
| that RAID 5 is not as reliable as theory predicts--possibly just due to
| complexity.
|
| RAID 0+1 is comparitively expensive (duplicate drives) but it offers
| outstanding performance both reading and writing, and reliability is
| claimed to be very good. Those who advocate using large numbers of
| smaller drives instead of a few large drives, but who worry about the
| the short MTBF (Mean Time Between Failures) when using many drives,
| should find RAID 0+1 quite attractive.
|
| For more information on RAID consult:
|
| http://www.compumedia.com/~kkirk/raid.html or
| http://www.storage.com
|
|
|
| SECTION 2 -- MISCELLANEOUS DATE QUESTIONS
|
| 02.001 Is 2000 A.D. a leap year?
|
| [I cannot see any way to improve on this posting taken verbatim from
| comp.databases.ingres. --Roy Hann]
|
| From agnew@gems.vcu.edu
| Date: 18 Oct 96 16:11:02 -0400
| From: Brainwave Surfer
| Newsgroups: comp.databases.ingres
| Subject: Year 2000 is a LEAP Year!!
|
| well, guys about 2000 as the leap or non-leap year, here is the
| DEFNINITIVE response.... Jim
|
| X-News: gems comp.os.vms:29785
| From: Paul S Winalski
| Subject:Re: RE: YEAR 2000
| Date: 24 Feb 1996 05:31:01 GMT
| Message-ID:<4gm7ql$kkv@zk2nws.zko.dec.com>
|
| OBRIEN wrote:
| >
| >
| >On this issue, there is a wonderful SPR which I have seen copies on DECUS
| >collections and Compuserve .. and possibly was posted here at some time. I
| >cannot remember the references, but have kept my own local copy, gleaned from
| >one of these sources, and which I always give a copy of to anyone who argues
| >that 2000 is not a leap year.
|
| You refer to the famous SPR response drafted by Stan Rabinowitz in response
| to an SPR filed against VMS V3.2 claiming that the LIB$DAY RTL function was
| incorrect in treating the year 2000 as a leap year. Here, published for
| the first time anywhere, is the unexpurgated first draft of the SPR
| response. DEC SPR Administration made him remove the bit at the end
| about WWV and atomic clocks, and the reference to VMS V4.0. I had the
| honor of being the technical reviewer for the answer.
|
| It is probably the only response to a software bug report ever to mention
| Sosigines, Regiomontanus, and the Council of Trent.
|
| --PSW
| =========================================================================
| D I G I T A L
|
| SPR ANSWER FORM
|
| SPR NO. 11-60903
|
|
| SYSTEM VERSION PRODUCT VERSION COMPONENT
| SOFTWARE: VAX/VMS V3.2 VAX/VMS V3.2 Run-Time Library
|
|
|
| PROBLEM:
|
| The LIB$DAY Run-Time Library service "incorrectly" assumes the year
| 2000 is a leap year.
|
|
| RESPONSE:
|
| Thank you for your forward-looking SPR.
|
| Various system services, such as SYS$ASCTIM assume that the year 2000
| will be a leap year. Although one can never be sure of what will
| happen at some future time, there is strong historical precedent for
| presuming that the present Gregorian calendar will still be in effect
| by the year 2000. Since we also hope that VMS will still be around by
| then, we have chosen to adhere to these precedents.
|
| The purpose of a calendar is to reckon time in advance, to show how
| many days have to elapse until a certain event takes place in the
| future, such as the harvest or the release of VMS V4. The earliest
| calendars, naturally, were crude and tended to be based upon the
| seasons or the lunar cycle.
|
| The calendar of the Assyrians, for example, was based upon the phases
| of the moon. They knew that a lunation (the time from one full moon
| to the next) was 29 1/2 days long, so their lunar year had a duration
| of 354 days. This fell short of the solar year by about 11 days.
| (The exact time for the solar year is approximately 365 days, 5 hours,
| 48 minutes, and 46 seconds.) After 3 years, such a lunar calendar
| would be off by a whole month, so the Assyrians added an extra month
| from time to time to keep their calendar in synchronization with the
| seasons.
|
| The best approximation that was possible in antiquity was a 19-year
| period, with 7 of these 19 years having 13 months (leap months). This
| scheme was adopted as the basis for the religious calendar used by the
| Jews. (The Arabs also used this calendar until Mohammed forbade
| shifting from 12 months to 13 months.)
|
| When Rome emerged as a world power, the difficulties of making a
| calendar were well known, but the Romans complicated their lives
| because of their superstition that even numbers were unlucky. Hence
| their months were 29 or 31 days long, with the exception of February,
| which had 28 days. Every second year, the Roman calendar included an
| extra month called Mercedonius of 22 or 23 days to keep up with the
| solar year.
|
| Even this algorithm was very poor, so that in 45 BC, Caesar, advised
| by the astronomer Sosigenes, ordered a sweeping reform. By imperial
| decree, one year was made 445 days long to bring the calendar back in
| step with the seasons. The new calendar, similar to the one we now
| use was called the Julian calendar (named after Julius Caesar). Its
| months were 30 or 31 days in length and every fourth year was made a
| leap year (having 366 days). Caesar also decreed that the year would
| start with the first of January, not the vernal equinox in late March.
|
| Caesar's year was 11 1/2 minutes short of the calculations recommended
| by Sosigenes and eventually the date of the vernal equinox began to
| drift. Roger Bacon became alarmed and sent a note to Pope Clement IV,
| who apparently was not impressed. Pope Sixtus IV later became
| convinced that another reform was needed and called the German
| astronomer, Regiomontanus, to Rome to advise him. Unfortunately,
| Regiomontanus died of the plague shortly thereafter and the plans died
| as well.
|
| In 1545, the Council of Trent authorized Pope Gregory XIII to reform
| the calendar once more. Most of the mathematical work was done by
| Father Christopher Clavius, S.J. The immediate correction that was
| adopted was that Thursday, October 4, 1582 was to be the last day of
| the Julian calendar. The next day was Friday, with the date of
| October 15. For long range accuracy, a formula suggested by the
| Vatican librarian Aloysius Giglio was adopted. It said that every
| fourth year is a leap year except for century years that are not
| divisible by 400. Thus 1700, 1800 and 1900 would not be leap years,
| but 2000 would be a leap year since 2000 is divisible by 400. This
| rule eliminates 3 leap years every 4 centuries, making the calendar
| sufficiently correct for most ordinary purposes. This calendar is
| known as the Gregorian calendar and is the one that we now use today.
| (It is interesting to note that in 1582, all the Protestant princes
| ignored the papal decree and so many countries continued to use the
| Julian calendar until either 1698 or 1752. In Russia, it needed the
| revolution to introduce the Gregorian calendar in 1918.)
|
| This explains why VMS chooses to treat the year 2000 as a leap year.
|
| Despite the great accuracy of the Gregorian calendar, it still falls
| behind very slightly every few years. If you are very concerned about
| this problem, we suggest that you tune in short wave radio station
| WWV, which broadcasts official time signals for use in the United
| States. About once every 3 years, they declare a leap second at which
| time you should be careful to adjust your system clock. If you have
| trouble picking up their signals, we suggest you purchase an atomic
| clock (not manufactured by Digital and not a VAX option at this time).
|
| END OF SPR RESPONSE
|
|
| 02.002 Are there any Y2K (Year 2000) problems with Ingres?
|
| The OpenIngres DATE data type handles dates in the range 01-jan-1582
| (the beginning of the Gregorian era) to 31-dec-2382 with a resolution
| of 1 second. Dates represented using the DATE datatype will therefore
| be unaffected by the turn of the century.
|
| However there may be problems displaying dates or entering dates in
| Ingres applications if the application programmer has used date
| templates that omit the century (eg: d"03FEB01" or d"02/03/01").
| As a temporary solution OpenIngres supports an environment variable
| called II_DATE_CENTURY_BOUNDARY that controls the interpretation of
| the year part by the front-end. If this environment variable is set
| to 50 (say), an input value of less than 50 will be interpreted as
| being in the 21st century, and a value of more than 50 will be
| interpreted as being in the 20th century. For example, an input of
| 03 will be interpreted as 2003, and an input of 99 will be interpreted
| as 1999. Note that this strictly a display issue; dates are stored
| correctly in the OpenIngres database.
|
| While not a Y2K problem, note that SELECT dbmsinfo('_bintim') returns
| the number of seconds since January 1st, 1970. Many programmers
| convert this to a 4 byte integer and use it as a compact time stamp.
| In mid-2035 this will roll over and cease to work.
|
|
|
| SECTION 3 -- CONTRIBUTED SOFTWARE
|
03.001 ftp site for INGRES tools
| A number of INGRES tools (including the NAIUA tools) are
| available to NAIUA members from the NAIUA web site:
| http://www.naiua.org
You are strongly encouraged to contribute tools. If you have useful
tools but are concerned about your employer's proprietary rights to
the tools you've developed: ask--you never know...
| Contact Bob Griffith (rcg@swl.msd.ray.com; see also section 99.001) to
arrange a donation.
03.002 ingperl, sqlperl and DBperl
There is a variant of Larry Wall's popular `perl' language that
provides a full-function (ie read/write) SQL interface to CA-INGRES
(and significantly NOT to University Ingres). It is referred to
by all of the above names by different people in different posts.
| The INGRES-friendly variant is available from the NAIUA tools archive,
| or for anonymous ftp from:
ftp.demon.co.uk (/pub/perl/db/perl4/ingperl)
As mentioned in the README file at that location, and it bears
repeating here, there is an effort underway to define a standard API
that will allow perl to access ALL the popular RDBMSs and it would be
well to keep an eye on that process so that you don't end up being
surprised that you've written a lot of non-standard code.
| When a DBD::Ingres module for Perl5 arrives it will be supplied with
| an Ingperl emulation layer so old code will run without changes.
| The current rev with Ingres support is perl 4. perl 5 has been
| waiting for the OpenIngres 1.1 API.
| Once you load this software, you will probably want to buy the two
| excellent O'Reilly books on perl (although the Ingres extensions
| are not mentioned in them):
|
| Learning perl ISBN 1-56592-042-2
| Programming perl ISBN 0-937175-64-1
|
|
|
03.003 tclsql
tcl is an acronym for "Tool Command Language". The version
extended to talk to INGRES is `tclsql' and it is thought to
| be CA-Ingres 6.4 specific.
It is available for anonymous ftp from:
harbor.ecn.purdue.edu (/pub/tcl/extensions/tclsql-1.0.tar.Z)
There have been reports that some sites have been unable to uncompress
the files from this archive. It seems likely that the problems were
local though. [Further information on this is solicited.]
03.004 $II_SYSTEM/ingres/sig
There are a number of unsupported utilities in the sig directory
| that is part of the standard distribution.
Some of these tools may not be compiled and may require either or both
of ABF and ESQL/C to create an executable.
| 03.005 NAIUA tool set
| The NAUIA tools committee now makes its collection available to NAIUA
| members only via the NAIUA's web site. A password is required to
| access the Members-only area of the web site where the tools archive
| is stored (the password is available from the NAIUA Management office,
| which can be contacted by email at mgmt@naiua.org). Start at www.naiua.org
| to enter the Members Only section and access the Tools Archive.
| Ingres users anywhere in the world are welcome to join the NAIUA.
| See section 99.001 for details or write to mgmt@naiua.org
| New contributions to the NAIUA tool set are always welcome.
| The archive is maintained by Bob Griffith; see section 99.001 for how
| to contact Bob.
|
|
| 03.006 onyx
|
| Onyx is a PD 4GL/terminal monitor for linux that provides SQL access to
| a variety of data repositories. University Ingres is one of the
| engines supported by Onyx; SQL is translated into QUEL.
|
Onyx contains an SQL compiler, a distributed transaction manager and a
4GL.
ftp Sites:
==========
wowbagger.pc-labor.uni-bremen.de pub/unix/databases
incoming/databases
ftp.germany.eu.net pub/comp/i386/Linux/Local.EUnet/Applications/Database
Contact Michael Koehne at:
kraehe@bakunin.north.de
for further and better information.
| NOTE: If you are interested in Onyx as a way to get a public domain SQL
| database interface, you should probably also look at PostgresSQL. See
| section 01.012 for more information on Postgres95 and where to get it.
| Also consider SOLID. See http://www.solidtech.com for more information.
| SECTION 4 -- THIRD-PARTY SOFTWARE
|
04.002 Can I use ODBC?
ODBC is Microsoft's implementation of the Call Level Interface
specification defined by the SQL Access Group. INGRES can act as
an ODBC server.
The INGRES driver is a Level 1 ODBC driver. This provides MS-Windows
applications with transparent access to INGRES databases. The ODBC
driver and the MS Driver Manager are available at no charge for the
INGRES/Net product for MS-Windows but must be EXPLICITLY requested .
| The CA-INGRES ODBC driver is NOT bundled with INGRES/NET.
| Refer to Jon Machtynger's INGRES ODBC FAQ at ftp.naiua.org /pub/ingres
| for full information on using ODBC with INGRES.
| See also the ODBC FAQ maintained by Microsoft, which you can FTP from
| ftp.microsoft.com in /bussys/sql_odbc/odbc/faq.doc
| Suggested site for a compendium of information about ODBC (performance
| info, ODBC Hall of Fame, links to articles, ODBC vendor info, benchmarks,
| myths and facts, database conference presentations and workshops, etc.):
| http://ourworld.compuserve.com/homepages/Ken_North
| Follow the Data Access Roadmap to the ODBC-related pages. This site also
| includes JDBC and OLE DB info.
|
|
|
04.003 What is Grafsman?
| GRAFSMAN, an OpenIngres third-party application, lets developers add
graphics to their applications on any of 35 platforms, ranging from
DOS, to Windows, OS/2, UNIX, and VMS. Output can be directed to
character terminals, X, DOS E/VGA, DEC REGis, Tektronix mono/color,
Epson dot matrix, HP LaserJet, or PostScript, among many others.
| GRAFSMAN can be built into OpenIngres/ABF, OpenIngres/Vision, and
| OpenROAD applications. On UNIX and VMS platforms, it is also
possible to embed calls to GRAFSMAN in text files (such as reports
produced with Report Writer) which can be interpreted by a suppplied
filter before printing.
| There is also a version of Grafsman for the web.
| See http://www.soft-tek.com for more information.
|
04.004 What is GQL?
GQL is a third-party graphical query language that has support for
| OpenIngres (among many others). There is a read-only version called
GQL/User and a read/write version called GQL/Update.
Each site also needs at least a single copy of the GQL/Admin module
to control the client GQLs.
GQL/Design assists with database design and table definition.
GQL is capable of accessing all the popular database management systems
| as well as OpenIngres, and a future version is expected to be able to
join tables from disparate systems.
The vendor has established a Gopher/FTP site for product support and
information.
The relevant info:
FTP: bbs.andyne.on.ca (IP:198.96.20.209)
Gopher: bbs.andyne.on.ca
BBS: (613)548-1032 2400bps/14.4kbps/N,8,1
WWW: http://bbs.andyne.on.ca/
| 04.005 Can I use JDBC (Java connectivity)?
|
| JDBC provides Java applications and applets with access to databases
| in much the same way that ODBC does. For information on JDBC consult:
|
| http://splash.javasoft.com/jdbc
|
| At the time of writing there are three vendors of JDBC drivers for
| OpenIngres.
|
| Caribou Lake Software, Inc.
|
| http://www.cariboulake.com
|
| Intersolv (DataDirect Java JDBC solutions)
|
| http://www.intersolv.com
|
| Openlink Software
|
| http://www.openlinksw.com
|
| All these sites offer downloadable demo versions of the respective
| vendor's products. Caribou Lake specializes in Java/OpenIngres
| solutions.
|
|
|
| SECTION 5 -- BOOKS
|
05.001 What is a good book on INGRES?
A Guide to Ingres
= ===== == ======
Chris Date
Addison-Wesley
ISBN-0-201-06006-X
1987
This book is getting badly out of date but it does give a nice
introduction to the older INGRES tools. It concentrates on QUEL (it
treats SQL only in passing and with barely suppressed scorn). It has a
good description of QUEL aggregate functions. University Ingres users
may find this book marginally more useful than users of CA-INGRES
would, especially because of the emphasis on QUEL.
Ingres: Tools for Building an Information Architecture
======= ===== === ======== == =========== ============
Carl Malamud
Van Nostrand Reinhold
ISBN 0-442-31800-6
1988
According to Pamela Barker's review in the February 1993 NAUIA
Newsletter, since 6.4 came out this book is a little stale too.
It is recommended for readers who already have a basic knowledge
of INGRES.
INGRES SQL Developer's Guide
====== === =========== =====
Carolyn and Jack Hursch
Windcrest/TAB/MacGraw Hill
ISBN 0-8306-2564-X (harcover)
ISBN 0-8306-2528-3 (paperback)
1992
Covers the INGRES implementation of SQL and embedded SQL. Examples
of embedded SQL use C.
Programming in SQL with Oracle, INGRES, and dBASE IV
=========== == === ==== ====== ====== === ===== ==
John Carter
Blackwell Scientific Publications,
ISBN 0-632-03136-0
1992
| Roger Hill says of this book:
| "It has proven invaluable to me...lots of examples of code for eg. doing
| outer joins etc. The tuturial stuff on setting up databases I found to
| be superfluous, but the SQL stuff was pretty good. Basic and recommended
| for new DBA's (like me!)."
|
Introduction to INGRES
============ == ======
Margaret A. Zinky, James W. Everett, Linda J. Hawbaker
PWS-Kent Pub. Co.
ISBN 0-534-92869-2
1992
This book has examples from a complete ABF application. Students like
it, and after working through the application should gain a basic
understanding of ABF. The book is good value for money.
INGRES & Relational Databases
====== = ========== =========
D. Rothwell
McGraw-Hill
ISBN 0-07-707482-3
1992
[No first-hand reviews available.]
INGRES User Guide: Visual Programming Tools
====== ==== ====== ====== =========== =====
Peter Mathews
Prentice-Hall
ISBN 0-13-463720-8
1991
[No first-hand reviews available.]
Database Tuning: A Principled Approach
======== ======= = ========== ========
Dennis E. Shasha
Prentice Hall
ISBN: 0-13-205246-6
1992
$32.00US
Discusses INGRES (amongst other products).
The INGRES papers: anatomy of a relational database system
=== ====== ====== ======= == = ========== ======== ======
Michael Stonebraker, editor.
Addison-Wesley
ISBN 0-201-07185-1
1986
A collection of scholarly papers on University Ingres, edited by
one of the chief architects, Professor Stonebraker. These papers
are literally only of academic interest (in the best sense of the
term).
05.002 What is a good book on relational databases?
An Introduction to Database Systems, Vols 1 and 2
== ============ == ======== ======== ==== = === =
C. J. Date
Addison-Wesley
ISBN 0-201-14201-5
Now venerable, this still seems to be the standard work. Volume 1 is
| in its 6th edition. This is a two volume set. The essential one is
Volume 1. This book covers all the major data management models, not
just the relational model. These books have very nice annotated
bibliographies. Fairly rigorous and academic.
Fundamentals of Database Systems
============ == ======== =======
R. Elmasri and S. B. Navathe
The Benjamin/Cummings Publishing Company
ISBN 0-8053-0145-3
This book compares favorably with the Date books above. It covers
all the major data models, not just the relational model. Extremely
rigorous and academic.
SQL and Relational Basics
=== === ========== ======
Fabian Pascal
M&T Books
501 Galveston Drive
Redwood City, CA 94063
ISBN 1-55851-063-X
$28.95
This is a superb book for the practitioner and novice alike. It
cannot be recommended too strongly. It is nominally aimed at the
PC database market, but there is little or nothing in it that is
really specific to PCs. The three striking features of this book
are: (1) it describes the database software selection process
using tests for relational fidelity; (2) it describes in terms
even your management can understand WHY relational fidelity is
important and why you can't get away with playing fast and loose
with Codd's rules forever, and (3) it describes how to live with
SQL's manifold defects, in a refreshingly candid way. Highly
recommended.
A Guide To The SQL Standard (Third Edition)
= ===== == === === ========
C. J. Date with Hugh Darwen
Addison-Wesley
ISBN 0-201-55822-X
Covers SQL2 (SQL/92) with an overview of SQL3. Good thorough book that
does exactly what its title says: interprets the (sometimes
impenetrable) language of the official standard in a straightforward
and lucid manner. Recommended if you wish to fully understand every
aspect of the SQL language.
05.003 Where can I get a description of the SQL standard?
There are two practically identical version of the SQL2 standard
description: one from ANSI (ANSI X3.135-1992) and one from ISO
(ISO/IEC 9075:1992(E)). However, because the sale of standards
documents is a major revenue source for standards organizations,
neither version is available on-line nor in any other machine-readable
form.
A printed copy may be purchased from:
Customer Service
American National Standards Institute
1430 Broadway,
New York
NY 10018
Tel: (212)642-4900
The cost is about $230US each, plus shipping and handling. Outside
the US, the ISO document will be available from your own national
standards body.
The latest working draft [in, I believe, encapsulated Postscript] of
the SQL3 standard (X3H2-93-091/YOK-003) is available for anonymous ftp
from:
gatekeeper.dec.com (16.1.0.2) /pub/standards/sql
There is also WWW site with information on SQL and conformance testing:
http://speckle.ncsl.nist.gov/
The Validated Products List for SQL can be accessed as:
http://speckle.ncsl.nist.gov/~kailey/sql.htm
Finally, ANSI has granted NIST a non-transferable license to make an
HTML translation of SQL-86, the most obsolete of the SQL standards,
available for demonstration purposes. It will be reachable at
http://case50.ncsl.nist.gov/sql-86/
It is not a funded project and is not expected to be completed soon.
PS: ISO now has a home page at:
http://www.iso.ch/welcome.html
The ordering information for the ISO version should be there.
05.004 Where can I get a (BNF) definition of SQL syntax?
The book "lex & yacc" in the wonderful O'Reilly and Associates
Nutshell series has an SQL grammar.
lex & yacc
O'Reilly and Associates
ISBN 1-56592-000-7
$29.95
Source code examples from the book can be anonymously ftp'd from:
ftp.uu.net (192.48.96.9) /published/oreilly/nutshell/lexyacc
| SECTION 6 -- REVIEWS/ARTICLES
|
06.001 Are there any INGRES periodicals?
Software vendors, consultants and others who publish INGRES related
newsletters which can be made available at no charge are invited to
submit information about their publication(s) for inclusion here.
| Send details to ingfaq@naiua.org
NAIUA Newsletter
===== ==========
The North American INGRES Users Association publishes the NAIUA
| Newsletter 3 times a year for all OpenIngres customers in North
| America. You do not need to be an NAIUA member to receive this
| publication unless you are outside North America.
The newsletter is largely filled with the comings-and-goings of
the executive; useful advertising (sometimes including Help-Wanted);
helpful hints, and information about imminently forthcoming new features
and products.
Articles can be submitted to:
| Mike Greene
| Bowater Mersey Paper Co., Ltd.
| PO Box 1150
| Liverpool, Nova Scotia B0T 1K0
| Canada
| merseyis@atcon.com
| FAX 902-354-7480
|
| NAIUA SELECT
| ===== ======
|
| The North American INGRES Users Association publishes a bi-monthly
| newsletter exclusively for members called NAIUA SELECT. This
| newsletter includes information about the NAIUA and the OpenIngres
| product set. Because it is sent only to NAIUA members it treats
| sensitive issues somewhat more frankly than the newsletter above can.
| It also includes late-breaking news, the latest information on upgrade
| availability, and even relevant juicy rumours. Some of the information
| contained in the NAIUA SELECT would not find its way onto the Internet,
| so it is a valuable additional source of information about developments
| that probably affect you.
|
| Membership in the NAIUA is NOT automatic any more; to receive the NAIUA
| SELECT you must join. See section 99.001 for details and instructions
| for making a membership application.
|
|
comp.databases.ingres
=====================
There are two Usenet newsgroups of interest to INGRES users:
comp.databases and comp.databases.ingres
comp.databases carries postings on miscellaneous database products
that may be of interest to database programmers and DBAs in
general, though there are only infrequently postings relating
specifically to INGRES.
comp.databases.ingres is specific to INGRES, and is devoted almost
| exclusively to the commercial OpenIngres variant. On the whole this
seems to be a fairly responsive group with a moderate amount of
traffic.
| See also section 01.015 for the INFO-INGRES mailing list, which carries
| the same material for people who do not have access to an NNTP news
| server.
| DBA reQuest Newsletter
| === ======= ==========
A newsletter providing updated information on Common Sense Computing's
INGRES tools, with comments on current INGRES DBA and development
issues.
| This newsletter is now available to the public on the World Wide Web.
| You can find it at the following URL:
| http://www.comsense.com/comsense/newslet.html
|
| If you would like to receive a free copy of the newsletter by mail,
| you can request it by sending:
|
Your Name
Company Name & Address
Contact Phone or E-Mail (in case of problems with address)
E-mail to:
| subscribe@oz.quests.com
06.002 What are sources of reports on INGRES?
Independent, in-depth reports on commercial software are very
| expensive. Your local CA sales office will probably be able to
provide free reprints of the relevant sections of favorable reports
such as the ones by The Aberdeen Group and ButlerBloor.
Aberdeen Group, Inc.
92 State Street
Boston, Massachusetts 02109
Tel (617) 723 7890
FAX (617) 723 7897
ButlerBloor Ltd
Challenge House
Sherwood Drive
Bletchley, Milton Keynes
MK3 6DP, England
Tel +44 (0)908 373311
FAX +44 (0)908 377470
| 06.003 Where can I find recent articles about OpenIngres?
Please send the title, periodical name, date and page number of any
| interesting OpenIngres articles appearing in the trade press (or other
| publications not exclusively devoted to OpenIngres) to
| ingfaq@naiua.org
for inclusion here. "Articles" which are merely Computer Associates
press releases will not be listed here. These are readily available
| from CA's web site (www.cai.com).
| In addition to the articles listed below, a good column to check out is
| "Server Side" by Martin Rennhackkamp in DBMS Magazine. This is a monthly
| column by Martin, and usually his topic-of-the-month includes
| OpenIngres in the discussion.
| Publication Issue Article
| ----------- ----- -------
| Data Management Review Feb-97 Inside Ingres: Storage Options for
| Peak Performance
| Data Management Review Mar-97 Inside Ingres: Data Storage Options
|
| Computer Reseller News 12-May-97 CA Launch Pushes DBMS to workgroup
|
| Information Week 9-Jun-97 CA Expands Database Management
|
| Computerworld 9-Jun-97 CA Adds Internet Features to OpenIngres
|
| Infoworld 9-Jun-97 CA hopes to gain market share with an
| update to OpenIngres
|
| PC Week 7-Jul-97 OpenIngres Starts Catching Up
|
| Computer Reseller News 7-Jul-97 CA Takes Wraps Off OpenIngres Database
| Version 2.0
|
| Data Management Review Jul/Aug 97 Inside Ingres: Data Storage Options
|
| Computerworld Canada 1-Aug-97 Jasmine, OpenIngres play supporting
| roles at CA World
|
| Government Computer 4-Aug-97 Computer Associates Releases Version
| News 2 of OpenIngres
|
| Database Programming Sep-97 CA Takes OpenIngres to the Web
| & Design
|
|
| SECTION 7 -- INGRES/ADVISOR AND TECH SUPPORT
|
07.001 What is INGRES/Advisor?
| INGRES/Advisor is an on-line technical support service. It is
| gradually being replaced by the web-based tool CA-TCC (see item 07.008),
| available from the Computer Associates web site (www.cai.com).
| CA-TCC is now the primary on-line technical support service.
| INGRES/Advisor includes tools for accessing the
| so-called Knowledge Base, for viewing technical notes, for
| accessing the comp.databases.ingres newsgroup, and for monitoring
| the progress of a technical support call. Virtually all of the above
| functions are now set up in read-only mode; no updates or new items
| can be created.
| See the Advisor User Guide for detailed descriptions and instructions.
|
07.002 How can I access INGRES/Advisor?
It is available to users on the Internet by
| telnet advisor.cai.com
| and (at no charge) through CompuServe (host name is ADVISOR).
| Note that if you post to the comp.databases.ingres newsgroup using
INGRES/Advisor, your posting really will get out into the Usenet.
You must be a CA-INGRES customer with a support agreement in order
| to access the system. You will be prompted for your site ID and PIN
| number, and a password. Initially, until you change it, the password
| will be your last name in lowercase; eg hann.
| INGRES/Advisor is available to all North American INGRES customers,
| but it may not be available to customers elsewhere. Contact your
| local CA office or your CA-Ingres distributor if you have trouble
| accessing Advisor.
07.003 What is ProAlert?
| ProAlert is a service of INGRES/Advisor which provides access to documents
| describing SIRs and known INGRES bugs and anomalies. Where possible, the
documents describe work-arounds. [IMO some of the workarounds sound
| not quite right though--use your own good judgement, or call tech
| support to confirm. --Roy Hann]
A VERY valuable but underused feature of ProAlert is the ability to
locate and vote on System Improvement Requests (SIRs). This allows you
to see a logged request for an enhancement to the product and to see
how much support there is for it.
On the basis that there are some SIRs for features which repeatedly
crop up as requests on comp.databases.ingres but which have only a
handful of votes, it seems reasonable to say that we don't make as much
use of this valuable opportunity as we should.
| Note: Since CA-TCC has replaced INGRES/Advisor as the current online
| tech support tool, there are no new documents being added to ProAlert.
| If you wish to see recent documents from the Knowledge Base, you must
| use CA-TCC and select the "Search CA Knowledge Base" link.
07.004 How do I log trouble calls?
| OpenIngres users who have support agreements will have designated
technical support contacts who are authorized to place trouble calls.
Trouble calls can be placed by calling Technical Support at
| (516)342-5500, or through the "Open A New Issue" link on CA-TCC (see
| item 07.008).
| At this time it is not possible to start a call via email, but Technical
| Support hopes to restore this capability at some time in the future.
07.006 How do I vote on a SIR?
| Until a few months ago, it was possible to do this via the ProAlert
| function of INGRES/Advisor. This is no longer possible.
| At the moment, the best mechanism available is to contact your local
| Ingres users group, or even better, your national users group.
| They should have access to the current SIRs, and on occasion they
| will solicit votes on the most popular/needed SIRs and forward that
| vote on to Computer Associates management. A request from a users
| group to implement a SIR has considerable clout, since the users
| group represents many customers.
| The NAIUA hopes to establish a page on their web site where SIRs can
| be listed and voted on. This may be limited to NAIUA members only.
| Watch the web site or comp.databases.ingres for any news on if and
| when this capability is implemented.
| If you have any questions concerning SIRs, you can contact the chair
| of the NAIUA Product Directions Committee. See section 99.001 for details.
|
07.007 Tech support is useless, what do I do now?
| This seems to be a favorite carp, and to be sure, there have been some
problems with tech support in the past, but CA and the NAIUA are
making great strides in this area.
Here are a few tips to help get the best out of tech support (if you
haven't tried all of these then the problem is not just with tech
support...):
1. If you have a production system down (Rank 1 call), MAKE THAT
CLEAR TO THE DISPATCHER so that your call goes straight to the
level 2 support team.
2. If you think you have identified a bug, try to find the simplest
recipe that re-creates it before calling tech support.
3. If you don't think your problem is being resolved quickly enough,
| or you don't think the analyst handling the call is knowledgeable
| enough, or if you can't make the suggested remedies work, take the
| initiative and TELL the support analyst to escalate the call.
| It will be promoted to a Rank 1 call, no questions asked. This
| is your most powerful option--use it.
4. If you want to escalate a call, or change support analyst for ANY
| reason, feel free to call Brian Dempster, Level 1 Support Manager,
| at (516) 342-2192.
5. Don't close the call till you're satisfied. Especially don't
close the call and immediately open it again as a new one; that
| just skews the response time statistics and conceals the problem.
| Use option 3 above.
6. If all else fails, and you are an NAIUA member, contact one of the
NAIUA Members-at-Large (see section 99.001 for details), who will
attempt to get some sort of resolution for you. Be ready to
provide your call reference number and a history of the call.
7. If you are not satisfied with the handling of your call, make
sure someone at CA knows about it. Complete your satisfaction
survey that is sent to you when you close the call, and tell them
| EXACTLY what wasn't right. It is in everyone's interests to
| make sure problems are identified and resolved. For the sake of
| all of us, don't just go away angry.
|
| 07.008 What is CA-TCC?
|
| CA-TCC (Total Client Care) is now the on-line technical support service
| for OpenIngres. It provides access to the Computer Associates
| centralized client support database via the World Wide Web. This
| service allows the user to: open new issues; browse existing issues to
| check on current status and send in additional information; search through
| CA's "Knowledge Base" for problems, solutions, issues.
|
| In order to use CA-TCC you must use a web browser that supports the HTML
| specification 2.0 or above, such as Netscape Navigator 2.0 or higher or
| Microsoft Internet Explorer 3.0 or higher. This is necessary because
| the CA-TCC web pages support several advanced functions: secure sockets
| layer (SSL) for encrypting transaction traffic (you may need to make
| changes to your browser's options before accessing CA-TCC for the first
| time); "Cookies", or encrypted data records requred by CA-TCC; and
| HTML tables.
|
| All first-time users of CA-TCC must register. Begin by going to the
| following web page - http://www.cai.com/catotalclientcare.htm .
| Click on the link for CA-TCC Registration, then enter all requested
| information, including your site id, pin number, and desired password.
| Once you have submitted the form, your registration will be verified
| and you should be notified of this by CA (by email) within 24 hours.
|
| Issues opened via CA-TCC should get a response just as fast, if not
| faster, than one opened via phone. Also, once an issue is open, use of
| CA-TCC to check on progress and send messages can help alleviate the
| problems of time-zone difference and phone tag that frequently occurs
| when dealing with Tech Support.
|
| While CA-TCC is working pretty well so far, it is still a young product,
| and is missing features that users have grown accustomed to with
| INGRES/Advisor. CA personnel have stated that they have plans to make
| a number of improvements to CA-TCC. If you have suggestions, there is
| a mechanism within CA-TCC for submitting these. Select the link to
| Open a New Issue, then select the option for "Enhancement Request" rather
| than the usual "Issue", and within the Product pull-down select "WEBTRK".
| Fill in all other required fields, put your suggestion in the Issue
| Activity Text area, and then click on the "Create Issue" button.
|
| 07.009 How do I find out about patches?
|
| The best and most reliable way to find out what patches apply for the
| OS platform and Ingres version you are using is to talk to Tech Support,
| either by phone (516-342-5500) or via CA-TCC on CA's web site. If you
| need a patch sent to you, normally they can arrange to have it arrive
| at your site within a day or two.
|
| There is now another method available, via the Internet. CA has an ftp
| site where you can check for (and download, if needed) patches which
| may apply to your installation. This site is still a work in progress:
| currently there are only a few patches available there, and only for
| Windows operating systems. Hopefully more patches, and more platforms,
| will be available soon.
|
| The address of CA's ftp site is: mf.cai.com
|
| If you are accessing this site via the web, you can go straight to the
| start of the Ingres patches by entering the following URL:
|
| ftp://mf.cai.com/CAproducts/ingres
|
| If you are accessing this site via anonymous ftp, then move to the start
| of the Ingres patches by typing "cd CAproducts/ingres" once you have
| logged on.
|
------------------------ END OF PART 1 ------------------------------
| SECTION 8 -- GENERAL FREQUENTLY-ASKED-QUESTIONS
| 08.001 How can I store a large object in an Ingres database?
| (The Fall 1993 issue of inquire_ingres has an article starting on p.6
| that covers this issue at length.)
| OpenIngres 1.x supports BLOb columns up to 2Gb wide called LONG VARCHAR
| and LONG BYTE. Before this, the biggest object Ingres 6.4 could cope
| with was an object that could be crammed into a char(2000) or
| varchar(2000). If you are using OpenIngres and embedded SQL in a host
| 3GL you can use the native BLOb types; see the documentation for more
| details. If you are using Ingres 6.4 or you are not using a 3GL some
| alternate strategies are described here.
| OpenROAD has some methods for manipulating objects of up to 64kb, but
| if it isn't possible to use OpenROAD or if the objects in question are
| bigger than 64kb, then other techniques are required.
| There are three approaches that can be used. The first is to write a
| procedure that takes the large object and encodes it in the ASCII
| character set, and then stores it in (multiple, numbered) rows in a
| varchar(1996) column. Another procedure is needed to extract the rows
| in the proper order and to decode the ASCII to recover the original
| object.
| Another approach with MUCH more overhead, but which does at least work,
| is to create a separate table for EACH instance of an object. The
| table is defined as a heap with a single i1 column. Each byte of the
| object is written to its own row. The advantage of this approach is
| that there is no need to write software for encoding and decoding the
| object.
|
A third technique is "horizontal decomposition" which involves encoding
the object in ASCII, then splitting it into chunks of 2000 characters
or less, and storing the chunks in two or more tables. If you imagine
the tables pasted up side by side then the large object appears as one
long row spanning the separate tables. This is preferable to the first
| technique above because there are no worries about numbering and
| sorting the rows to ensure that the rows comprising the object are
| retrieved in the correct order, you just need a common key.
08.002 How can I suppress execution (I only want to see the QEP)?
Use the 'set optimizeonly' command.
To turn this feature off use the command 'set nooptimizeonly'. This
can be useful when you may wish to execute the SQL and display the QEPs
in just the section of code being debugged, not the whole program up to
that point.
08.003 Other than this FAQ, what is a good source of practical info?
| If you still have an Ingres 6.4 database (that is 6.4/02 or later)
| then you will find a number of useful notes located in
$II_SYSTEM/ingres/advisor
The drift of some of these notes is repeated in some of the
| FAQs answered here. Usually the Ingres note is referenced in that
case.
| NB: Prior to release 6.4/02, the notes were supplied in the
$II_SYSTEM/ingres/notes
directory and were numbered differently.
| In OpenIngres installations, the advisor directory no longer exists.
| The best current source of notes is available in either INGRES/Advisor
| (see sections 07.001 and 07.002 for more information) or in CA's web
| utility CA-TCC. If you want the most recent notes, your best bet is
| in CA-TCC, however you may need some patience: CA has a large backlog
| of notes that they plan to install here, but they cannot be made available
| until they have been reviewed and approved.
| 08.005 Why is Ingres reporting an incorrect row count?
The rowcount reported by the 'help table' command is only an
| ESTIMATE of the number of rows in the table. Ingres updates this
information opportunistically. It updates the information when
a `modify' is done on the table, or when a sufficient number of
rows in a table are updated by a single transaction, but it will quickly
become stale again.
It is slow, but you can ALWAYS get an accurate row count by doing:
select count(*) from
| 08.006 Can I do an outer join?
| Outer joins (left-, right-, and full-) are available in OpenINGRES 1.x
| using the ANSI SQL92 syntax.
| Outer joins are not directly supported in Ingres 6.4 but they can be
| coded by hand. If you are still running 6.4, as an interim solution a
| sufficient number of unions may achieve the required effect. Note
| us_13272.doc in $II_SYSTEM/ingres/advisor (or r6032.dbms in
| $II_SYSTEM/ingres/notes) suggests three other possible solutions as
| well.
08.007 How can I add/delete/alter a column in a table?
| With the recent release of OpenIngres 2.0, the ALTER TABLE capability
| is now available. The documentation for this release should describe
| how to perform these functions.
| If you do not yet have OpenIngres 2.0, then there is no supported tool
| for this operation. What are your alternatives? Read on:
|
One common approach is to replicate the table using `create table XXX
as select'; drop the table, and then create it again using `create
table YYY as select' from the copy.
Another (better) approach is to copy the table out of the database
using `copydb -c ' to generate a pair of SQL
scripts called copy.out and copy.in (NOTE the -c argument to copydb.)
copy.out is executed by `sql':
sql < copy.out
The copy.in file contains commands to recreate and load the table and
can be edited to drop the original table and re-declare it as required.
The copy.in script is executed the same way:
sql < copy.in
The advantage of the latter approach is that any grants, integrity
constraints and secondary indices on the table are re-created too.
NOTE that views ARE NOT re-created. If the deleted table is involved
in any views the views are automatically and silently destroyed when the
table is destroyed. They must be identified and preserved manually
before starting.
| The third, and probably best, approach is to use the 'tblmnt' utility
| from the NAIUA tool archive (see section 03.001).
08.008 How can I grant other people access to my tables?
| OpenIngres 1.x allows users to grant access rights to their tables,
| which other users can then access by referring to the table as
| username.tablename.
|
| Ingres releases prior to and including 6.4 do not allow users other
than the database DBA (usually the user `ingres') to grant access
to tables. Only tables owned by the DBA may have permissions
granted on them. Tables created by ordinary users are private for
all time.
If you want to make a private table accessible, the only remedy
presently available is to unload the table and reload it logged in as
the DBA. The following procedure will serve:
1. login in as tha DBA for the database (usually ingres)
2. copydb -u
3. sql -u < copy.out
4. sql < copy.in
5. go into isql and grant permissions as required
******************************* NB *********************************
This procedure will NOT copy any associated views, integrity
constraints, or rules. If you intend to destroy the original table,
BE SURE to preserve/copy the views etc. first. Destroying a table
silently destroys all the associated views etc.
********************************************************************
| OpenIngres 1.1 makes it possible for users to grant permissions on
| their tables and for other users to address those tables as
| `owner_name.table_name'
08.009 How can I change the ownership of a table/report/form?
| At present the only way to change the ownership of Ingres
objects is to copy them out of the database with the appropriate
tool and then reload them. Generally this question arises when a
private object must be shared, therefore the procedure described
here is to change the owner to the DBA so that the object can
be visible to everyone.
Changing the ownership of tables is covered in section 08.008 above.
An analogous procedure is used for forms.
1. Log in as the DBA (usually `ingres')
2. copyform -u
2. copyform -i
And for reports:
1. Log in as the DBA
2. copyrep -u
3. sreport
08.010 What is a QEP and how do I interpret it?
| A QEP is a "query execution plan" and is the algorithm that the
| Ingres optimizer selects for satisfying a "query." In this context
a query is anything that requires locating rows the database, whether it
be to select, update, or delete them.
The term is also used to refer to the displayed representation of
the query plan produced when the `set qep' command has been given.
A thorough explanation of how to interpret a QEP is beyond the scope
of the FAQ. Note US-38697 supplied in the $II_SYSTEM/ingres/advisor
directory provides an explanation (formerly r6004.dbms in
$II_SYSTEM/ingres/notes). This document is also available from
| Ingres/Advisor.
A careful study of the QEP is a good way to identify problems in a
badly behaved query. Tech support may ask for a QEP to help isolate a
problem.
08.011 How can I ask for the first N rows?
It can't be done. The request is meaningless within the relational
model. All operations in a relational database are described in terms
of mathematical set operations. Sets do not incorporate the notion of
ordering.
What is meant by the "first" N rows? Are these the first N rows
according to the order they were entered? Or the order in which they
appear in the file where the base table resides? (What happens when
the table is re-organized?) Or are the rows to be ordered according to
the value of some explicit sort key on the data?
Only the latter ordering makes any sense in a relational database.
However, to ask for anything less than all the rows described by
the WHERE clause violates the relational principle of atomicity,
which has it that all operations are executed completely or not at
all.
Extracting a subset of data at random, ie without an EXPLICIT
WHERE clause and an EXPLICIT ordering, is very bad practice and
is a sure sign that you are up to no good or that you are about to
find out the hard way why the model includes the requirement for
atomicity.
If it is not possible to contrive a suitable restriction (WHERE
clause) then one may have to suspect that the data model OR THE
INTENTION is defective.
Unfortunately, embedded SQL does provide a means of violating
atomicity using cursors. Cursors return rows one at a time and they
can be closed at any time. In a select loop atomicity can be violated
by issuing EXEC SQL ENDSELECT. There are no doubt any number of
pragmatic reasons for wanting to do this in an application, but
careful reflection on the possible resulting modes of failure is
advisable.
You can't use the resource limiter to select just the first N rows.
The resource limiter is pre-emptive. If it thinks you are going to
get more than the allowed number of rows you get no rows at all.
It IS reasonable and possible to ask a similar kind of question, such
as: "Who are the three highest paid members of staff?" The following
query does this:
select *
from staff_table a
where 3 > (select count(*)
from staff_table b
where b.salary > a.salary);
This does not violate the atomicity principle mentioned above because
the result set is complete. Achieving the same effect by aborting an
ESQL/C query after reading the first three rows is invalid because the
result set is not complete. This is not just a matter of technical
dogma. There are inescapable real-world reasons why aborting the select
loop after a fixed number of rows is invalid. To see why, consider
that the above query is capable of returning almost any number of
rows--not 3. If that is the case, but the query correctly states the
question, then arbitrarily choosing 3 rows from the result set is just
plain wrong.
Finally, even from a purely mechanical point of view, it is just not
possible to abort the delivery of the result set within Report Writer
and similar tools, so it is good to know the "proper" way to do this.
08.012 Can I override the optimizer with my own execution plan?
No. The programmer will almost certainly not do a better job than the
| Ingres optimizer can, and even if he could, changes to the table
location, structure or key distribution would ruin any execution plan
the programmer dreamed up.
If all the tables are properly organized, properly indexed and have
little or no overflow, and if a query is not performing well, study it
carefully. Poor performance is almost always a result of one of two
possibilities: there is an error in the WHERE clause--usually failing
to make a necessary equi-join, or the search is intrinsically slow.
| In many cases generating statistics on the distribution of key (and
non-key) values using optimizedb can make a marked improvement.
(It may be well to do a sysmod after collecting statistics. That will
keep the statistics table in tip-top shape.)
Other reasons for poor performance are: (1) one or more tables has
no keys defined; (2) no defined key is being involved, or (3) the
table has a lot of overflow pages. Problem 1 is fixed by modifying
the table to a suitable structure with a suitable key or keys.
Problem 2 is solved by defining a suitable secondary index on the
table. The index should be defined with an appropriate structure too.
The default is to organize it as ISAM. (You can define any
number of secondary indices on a table, but because they are maintained
dynamically, having too many can affect the performance of OLTP update
and insert operations.) Problem 3 is corrected by periodically
modifying the table to its nominal structure. Hash tables and ISAM
tables are especially vulnerable to overflow problems in a busy
database.
Having said all this, the optimizer is the most arcane and complex
part of a relational database engine--which is why so few RDBMSs even
bother, and it is not surprising that it does VERY infrequently goof.
See section 08.013 "How can I tell why my search is so slow" for ideas
| on determining if Ingres really has blundered.
In the rare case where the optimizer chooses a bad plan (and that is
probably by definition a `bug' in the optimizer), then it is sometimes
possible to "coerce" it into choosing a better plan by explicitly
involving the secondary indices in the WHERE clause.
08.013 How can I tell why my search is taking so long?
If the search has been used in production for some time, ie it is not
under development, and there is every reason to expect that it SHOULD
execute rapidly, begin by suspecting one of the tables is locked. The
| Ingres ipm monitor will help to identify these kinds of access
contention problems.
If the search is under development, and it is not known for sure
that it should execute quickly, the first step must always be to
examine the WHERE clause to see if a missing condition is causing
| Ingres to generate a Cartesian product instead of a much more
restricted equi-join. An unqualified join on a table of M rows
with one of N rows contains M*N rows. Even quite modest tables
will have products with MILLIONS of rows.
Check that the tables are indexed appropriately for the search.
It may be necessary to introduce a secondary index to prevent
| Ingres from scanning a table exhaustively when no keys are
involved. The 'help table ' command in isql will
report the keys on the base table and the existence of any
secondary indices.
Be aware that searches for non-existence are almost always slow
because they almost always require an exhaustive search. You
can't (in general) know it's not there till you've looked everywhere.
Check for an excessive number of overflow pages on the tables in
use. Just how many pages is too many must be determined by
experience, but overflow pages are scanned sequentially regardless
of the nominal table structure and the mere existence of overflow
pages requires that they be scanned. The 'help table '
will report overflow pages. Modify the table to its nominal
structure to eliminate overflow pages. For example if the parts table
is nominally a hash table keyed on part_nr, then
modify parts to hash on part_nr
will restore it to optimal condition.
| If none of these measures identify a significant problem, Ingres
can be asked to dump its query execution plan (QEP) for inspection.
| This is done by issuing the 'set qep' command. Ingres will execute
the search as usual, and then print out the plan it used. See
advisor note US-38697 for details of interpreting QEPs. If the search
is taking too long for this to be feasible, then the execution
phase can be suppressed by issuing the 'set optimizeonly' command
as well.
In extreme cases the optimizer may be fooled into choosing an
unsuitable QEP because of out-of-date or non-existent statistics
on key value distribution. To see if the actual effort required
to execute a search differs wildly from the predicted effort, use
the `set trace point qe90' command to dump statistics about the
resources consumed. The display produced by this tracepoint is
analogous to the display of the QEP. (Trace point qe90 is an
undocumented feature and Computer Associates may change it at any time.)
A divergence between predicted and actual costs may signal a need
for better key value distribution statistics.
If statistics have not been collected for some time, or if there is
reason to suppose that the distribution of values has changed then
optimizedb must be run to generate new statistics. Make sure that ALL
of the columns referenced in the WHERE clause, not just those used to
join tables, have had statistics gathered for them. Once the
statistics have been collected, it may be necessary to shut down the
server and re-start it to force it to re-read the statistics.
In ONE well documented case, generating key distribution statistics
can actually make a search SLOWER. A defect in optimizedb causes
it to examine only the left-most 8 bytes of a large text key. If
the values are indistinguishable in those 8 bytes, then the optimizer
will decide that the index is insufficiently selective and will
ignore it. Normally, without statistics, it assumes a 1% hit-rate
for each key value (10% if the relationship is an inequality).
Deleting the defective statistics will allow the optimizer to use its
usual assumption and performance will improve. Setting trace point
op165 will cause statistics to be ignored, so that they need not be
deleted.
| Avoid using functions on key columns that appear in the where clause
| as they prevent the optimiser from making use of the key. Thus
| select employee_no
| from employee
| where uppercase(name) = 'FRED';
| will result in a slow table scan even though there is an index on
| column "name".
|
| Beware of implicit function joins that can also prevent the use of an
| index. Consider the following example:
|
| select emp.name
| from employee emp, department dept
| where emp.dept_code = dept.dept_code
| and dept.dept_name = 'SALES';
|
| Normally this would be fine. However if, for whatever reason,
| dept.dept_code were defined as varchar but emp.dept_code were defined
| as char then the optimiser would have to include an implicit
| conversion function so that the where clause effectively becomes:
|
| where emp.dept_code = char(dept.dept_code)
|
| which prevents the use of any index on dept_code in the department
| table.
|
|
08.014 What are TIDs?
TIDs are "tuple identifiers" or row addresses. The TID contains the
page number and the index of the offset to the row relative to the
page boundary. TIDs are presently implemented as 4-byte integers.
The TID uniquely identifies each row in a table. Every row has a
TID. The high-order 23 bits of the TID are the page number of the page
in which the row occurs. The TID can be addressed in SQL by the name
`tid.'
It is inadvisable to exploit any knowledge of TIDs in an application.
In the documentation Computer Associates quite explicitly reserves the
right to change the form and use of TIDs without warning. In any case
the TID of a row can change at any time, just in the course of the
| operation of Ingres.
The temptation to use the TID in an application usually arises when it
is necessary to distinguish two "identical" rows, or when it is
necessary to locate a row for update when all the potential key values
have been changed. (Identical rows are logically meaningless, so this
should only arise in a trouble-shooting situation--otherwise there is
an error in the database design.) Normally it is preferable to define
and assign a "surrogate" key instead of using TIDs. The system
maintained table_key data type is intended for this purpose. Manually
maintained surrogate keys are also appropriate. The only requirement
of a surrogate key is that it be guaranteed to be unique in the table.
Surrogate keys need not be assigned sequentially or even monotonically.
(See section 08.028 for further information about generating surrogate
keys.)
Because surrogate keys are completely artificial and are assigned
automatically there is no legitimate reason ever to update one. It is
this property that makes them suitable for locating a row for update
when all the potential composite keys in the row are changed.
08.015 How can I display the proper Fkey labels using an emulator?
It is common for many sites to have a number of personal computers
which are also used as terminals to run INGRES applications which
were originally designed to run on a terminal such as a DEC VT220.
To make the PC support the INGRES forms interface correctly
these PCs will be running one of the many terminal emulator packages
which are available.
Since the PC keyboard does not correspond very closely to the
VT220 keyboard these emulator packages generally remap some of the
PC keys to VT220 functions, and even where there are keys with
corresponding functions on the two keyboards the key-cap labels will
usually be different. For instance, one terminal emulator program
uses the PC F1 key for the VT220 PF1 key; control-F3 for F13,
control-F6 for Do, and PgDn for Next.
These are fairly sensible mappings but a casual user is unlikely to
guess that in order to obtain the function in the menu apparently
assigned to the Do key (according to the display) he must hold down
control and press F6!
Therefore, in order to obtain the maximum benefit from the
almost fool-proof INGRES menu system it is necessary to display
the correct key-cap designations in the menu line when an INGRES tool
is used with a PC running a terminal emulator program.
Three things must be done to display the correct key-cap labels.
First, the PCs running a terminal emulator must be given their own
assign the INGRES FRSkey designations to function keys on the emulated
terminal's keyboard and to define the actual key-cap labels used on
notify the INGRES tools and local application programs to use the
new mapfile. All three steps are easily accomplished.
The first task is to choose a terminal designation which is not yet in
use. For instance, to use `zs220' to identify a PC running KEA
has been used already then choose another (or delete the existing
one).
------------------------------------------------------------------------
NOTE: When the user logs in it will be necessary to assign this terminal
designation to the TERM_INGRES environment variable. How this can
be done is really beyond the scope of an INGRES FAQ; the local system
administrator should be asked to take care of this. However, for
completeness one technique is described here (for a UNIX system).
At some sites the terminal type can be determined by knowing that
a specific port is hardwired to a PC. In other cases, such as
connections via modem or through a terminal server the terminal type
may need to be indicated by the user. The following example shows how
this can be done in the .login file on a BSD UNIX system:
set term = `tset -I -Q - -m 'dialup:?zs220'`
if ($TERM == zs220 ) then
setenv TERM_INGRES zs220
set term="vt200"
endif
In this example, when a dial-up connection is made, the system
takes zs220 as the terminal designation, unless the user specifically
chooses something else. Note that as far as UNIX is concerned the
file too).
-----------------------------------------------------------------------
The file that defines what key-cap label is displayed in parentheses
after each menu item in the INGRES menu must be edited to correspond
to the PC keyboard. In this example of a VT220 emulator, the supplied
vt220.map file in $II_SYSTEM/ingres/files should be copied to zs220.map
and edited. The following segment illustrates what to do:
/* FRS Mapping file for KEA ZSTEM VT220 emulator */
/* Menu Key */
menu = pf1 (F1) /* formerly PF1 */
/* Help facility */
frskey1 = pf15 (Ctl-F5) /* formerly F15 */
/* End current screen and return to previous screen */
frskey3 = pf3 (F3) /* formerly PF3 */
/* Go or execute function */
frskey4 = pf16 (Ctl-F6) /* formerly Do */
...
/* Previous screen or set of rows in table field */
scrolldown = pf25 (PgUp) /* formerly Prev Screen */
/* Next screen or set of rows in table field */
scrollup = pf26 (PgDn) /* formerly Next Screen */
...
Using this file the `Go' item in the typical INGRES menu will be
followed with (Ctl-F6) instead of (Do), which will be correct for the
PC.
Having identified the terminal and having supplied a corrected function
key map, it remains to instruct the INGRES tools to use the new map.
for the emulator. In the case a VT220 emulator, duplicate the entry for
the VT220. The only changes which are necessary are to the first line
to insert the new terminal designation, and to the `mf' item to point
this:
Z2|zs220|KEA ZSTEMpc-220 emulator:\
:co#80:li#24:bs:cd=50\E[0J:ce=3\E[0K:cl=20\E[01;01H\E[2J:\
...
:Ge=ansi:Gp=ansi:Gh:Go:Gw:GC#68:GR#22:Gr#1:mf=zs220.map:
Note that although this example has assumed a VT220 terminal, a
VT220 terminal emulator, and a UNIX system, the same procedure is
applicable to any terminal, its emulator, or to VMS.
08.016 Does INGRES support row-level locking?
No. There is not much consensus on whether that is good or bad. There
are certainly many people who would like to see it; it was the 4th most
frequently requested enhancement in the SIR survey done by the NAIUA
User Request Committee. On the other hand, Computer Associates has not
| so far provided the facility, although it is rumoured to be an enhancement
| that will be supplied in a future version.
There is a plausible argument in an internal ASK Group memo that the
value of row-level locking is over-rated and that the overhead required
to implement it is significant enough that it could not be regarded as
just a throw-away item. It appears that it would be necessary to have
a serious access contention problem before row-level locking would be
| advantageous. Thoughtful design of the application program can reduce
| lock contention. A future version of the FAQ will discuss this further.
| See section 08.030 for comments on generating surrogate key values that
| minimize contention in ISAM and B-trees.
Note that if one is satisfied to run the risk of having a table updated
while it is being read, read-locks can be turned off. This may be
worth doing in the case of very static catalogues. Look up the `set
lockmode' command for details.
Note also that row-level locking can be achieved by adding a large dummy
char column to the table definition. This extends the row-width to such
an extent that Ingres is only able to store one row per page. It can
sometimes be useful to do this to specific tables that have a serious
contention problem at the cost of wasted disk space. Be aware though
that contention can easily be increased by poor application or database
design and that these should be re-examined before deciding to force
row-level locking.
08.017 How can I invoke emacs (or any other editor) from isql?
Set the environment variable ING_EDIT to the pathname of the
editor. For example:
setenv ING_EDIT /usr/local/emacs
Note that at present the environment variables VISUAL and EDITOR
override ING_EDIT.
In some environments is also necessary to set VISUAL and EDITOR to the
full path of the required editor; ING_EDIT alone is unsufficient.
(This is a bug and may have been fixed by the time you read this.)
VMS users should either:
define ing_edit "+TPU" -or-
define ing_edit "+EDT"
which uses the callable version of these editors rather than
spawning a subprocess each time the editor is invoked. With regard
to TPU use the logical name TPU$SECTION to specify a customised
section file.
08.018 How can I change the displayed precision in isql?
The default display format is n10.3 for float4 and float8 columns; i6
for integer1 and integer2 columns and i13 for integer4. These can
be overridden with arguments on the command line.
The general syntax of the format argument for floating point is:
-fkxM.N
The -f is literal and signals a floating point format. The k is the
datatype selector and can be 4 or 8 for float4 or float8 respectively.
x is the format specifier, and can be one of E, F, G, or N. M is the
total field width in characters. N is the number of decimal places.
Example: to print float4 values in 9 character field with 2 decimal
places of precision, the flag would be -f4N9.2
The syntax for integer columns is:
-ikN
Again, -i is literal. k identifies the datatype and can be 1, 2 or
4 for integer1, integer2 or integer4. N is the field width.
Example: to print integer1 values in a 3 character field, the flag
would be -i13
08.019 How can I change the destructive behaviour of the Return key?
| The default behaviour of the Ingres FRS when the RETURN key is
pressed is to delete everything to the right of the cursor before
advancing to the next field. Sometimes it may be preferable if
it just advanced to the next field without deleting, as it does when
the TAB key is pressed.
In an embedded SQL application using C, the following statement will
make the Return key behave more like the TAB key:
exec frs set_frs frs ( map(nextitem) = controlM );
To make a global change so that the RETURN key is non-destructive in
programs like QBF, the appropriate *.map file in $II_SYSTEM/ingres/files
must be edited. (There is a .map file for each supported terminal
type, as well as an frs.map file.) Change:
clearrest = controlM (Return)
to:
nextitem = controlM (Return)
Note that control-X will still clear the entire field, so there will
still be a quick way to clear a large field even if the behaviour of
the Return key is tamed.
08.020 Does anyone at Computer Associates read comp.databases.ingres?
| Yes, a great many do.
Although their participation is officially described as "informal", it
has been reported that some CA employees are encouraged to
monitor the group. (It may therefore be productive to post SIRs for
comment.) However, the limited number of responses posted even to
questions explicitly directed to CA personnel makes it clear
that their's is a passive role. This is not a free alternative to
Technical Support.
08.021 Is it possible to generate FRS forms dynamically at run-time?
There is no documented way of doing this.
08.022 Why are modifications allowed to the system catalogs when it is
so dangerous?
One of the principal tenets of relational database theory is that a
relational database must store system data in the same structure that
it uses to store user data. If a database does not do this then it
| cannot truly be called a relational database. Note that Ingres
provides protection against inadvertent updates by restricting
modifications to super-users only and then only if the -S flag has been
specified on the command line.
| 08.023 How can I bulk authorize Ingres users?
| OpenIngres 1.x supports the SQL92 CREATE USER command which makes bulk
| authorization scripts easy to write. See the DBA guide for more
| details.
| Ingres 6.4 users should read Advisor note us_38622.doc (filed as
| us_18622.doc in $II_SYSTEM) which describes how to bulk authorize
| users. This is also described in Chapter 2 of the 6.4 Database
| Administrator's Guide. Since the Advisor note is so clear and
| detailed, and since it is included as part of the standard
| distribution, there seems little point in either paraphrasing or
| quoting it verbatim here.
08.024 How can I load ASCII-delimited files created by PC `X' base?
All of the popular PC database/record managers can export data in a
| number of formats. Usually the Ingres user will have to use the
ASCII-delimited format--which will usually be making the best of a bad
choice. The main problem is that such ASCII-delimited files tend to
have commas between the fields, and the string fields tend to have
double quotes around them as well. This is probably thought to be
necessary because the string field might very easily contain commas as
data. (It is not clear that double quotes are any less likely to occur
in data, but that is the way it is.)
| To get such a doubly delimited dataset into an Ingres table requires
a little extra work than usual. Usually the COPY command would be
used, and the command would be written on the assumption that
there would be exactly one delimter at the end of each field, that the
data fields would be of variable length, and the delimeters would be
completely unambiguous. A command like
copy some_table ( field1=c0tab, field2=c0tab, ... fieldN=c0nl )...
would be usual. The syntax of the copy command describes the data
format as an unknown number of characters up to, but excluding,
the next instance of a specified character which is to be treated as a
delimiter. The delimiter is assumed to have no purpose other than to
mark the end of the data field and it is discarded.
The limitation is that the delimiter is assumed to be a single
character. Somehow, the additional (spurious) delimiter must be
discarded also when the data file is an ASCII-delimited file from a
PC record manager.
The trick is to use the COPY command's `d' format to discard the
additional character(s). The syntax of the `d' format is the same
as any other format, so `d1' directs COPY to discard a single character.
`d0tab' directs it to discard all characters up to and including the
next ASCII TAB. The following example shows how to use the `d' format
and the COPY command's normal behaviour of discarding delimiters to
import a doubly delimited data file.
| Suppose that the Ingres table was created by
create table parts
(
seq_nr i2,
part_nr c10,
description vchar(40),
ref_nr i4
)
and suppose that the data file (export.txt) created by the ASCII-
delimited export function of the PC record manager looks like
3451,"BC-1324","BELL-CRANK, STEEL",21323
| The Ingres COPY command would need to be something like this
copy parts
(
seq_nr='c0,', /* read up to the first comma */
x=d1, /* throw away the first " */
part_nr='c0"', /* read up to the second " */
x=d2, /* throw away the second comma AND the " */
description = 'c0"', /* read up to the fourth "*/
x=d1, /* throw away the comma */
ref_nr=c0nl /* read up to the end-of-record */
)
from 'export.txt'
08.025 How can I import dates from PC `X' base?
Dates are often represented in some of the popular PC database
managers as integers or strings in the form YYMMDD. That is, a date
in the exported file might look something like:
...,"920512",...
where "920512" is intended to be interpreted as 12th of May, 1992.
| This is generally done to simplify sorting into date order (at least
| for this century).
| When trying to import this data into an Ingres database DATE type
column there are two obvious problems: the string values are surrounded
by pairs of double-quotes (if it was stored as a string), and the date
| is not in the usual Ingres form of dd-mmm-yyyy.
The paired quotes problem is handled as described in 08.024 above.
There are two ways to handle the date problem. The obvious (and
probably bad) solution is to edit the file, laboriously re-arranging
the numbers and mapping 01 to -jan- and 02 to -feb- and so on, and
exchanging the day and year positions. Even using regular expressions
and some ingenuity this is a significant chore and an opportunity to
corrupt the data.
A far better solution is to simply set the environment variable
II_DATE_FORMAT to "iso" like so:
setenv II_DATE_FORMAT iso (for UNIX)
define II_DATE_FORMAT iso (for VMS)
The COPY command will then interpret the string "920512" as 12-may-1992.
| (Because Ingres will also display dates in the ISO format, this feature
can also be used to prepare export files with dates in the YYMMDD form.
NB: if you do this, make sure you are not corrupting the stored dates
by truncating the century--eg turning geriatrics into newborns!)
| Note that Ingres will display dates in ISO format until the
environment variable is unset (unsetenv II_DATE_FORMAT or deassign
II_DATE_FORMAT) or is restored to its original value. (See the
| documentation on the II_DATE_FORMAT environment variable in Appendix D
| of the DBA Guide for other possible date formats.)
| See sections 02.001 and 02.002 for other date topics.
|
08.026 How can I create export files for a PC application?
Many PC and Macintosh applications such as Microsoft Excel like to
receive data files with TABs delimiting the fields. As noted below in
section 12.001 the Report Writer has a notorious bug in the way it
handles TABs so it may not be convenient for this job. Although not as
versatile as the Report Writer, the COPY command can be used, and it is
probably more efficient (of machine resources) anyway.
To create an export file (/tmp/parts) of the table `parts' described in
section 08.024 above, with the fields delimited by TABs, and with an NL
at the end of the record, use a command such as:
copy parts
(
seq_nr = c0tab,
part_nr = c0tab,
description = c0tab,
ref_nr = c0nl
)
into '/tmp/parts'
Using the c0 format, integer and floating point values will be written
| out right-justified in a field of the usual Ingres default width for
the type (or as selected with the appropriate flags as described in
section 08.018 above) padded on the left with ASCII blanks. vchar
fields will be written as fields of the maximum declared size, padded
on the left with ASCII blanks.
It will usually be necessary to adjust the display format for floating
point columns so that precision is preserved (the default for f4 columns
is f10.3 which will not be sufficient in general).
If string values must be enclosed in double quotes (or if any other
character must be inserted) use the `d' format:
copy parts
(
seq_nr = c0tab,
x = 'd0"',
part_nr = 'c0"',
x = d0tab,
x = 'd0"',
description = 'c0"',
x = d0tab,
ref_nr = c0nl
)
into '/tmp/parts'
Note that the COPY command operates only on entire base tables. It is
not possible to COPY views nor is it possible to restrict the COPY with
a WHERE clause. If a view or a restriction of a table is to be
exported an intermediate table must be created with CREATE TABLE...AS
SELECT.
Finally, consider whether it is necessary to export the data at all.
| Ingres can act as an ODBC server, allowing most of the popular PC
packages to extract the data directly from the database at run time.
| 08.027 What Ingres files can I delete (to recover space)?
[The Spring '91 issue of inquire_ingres carried this topic.]
This section is in the form of a shell script that UNIX users can edit
to suit their local needs. All commands are commented out; delete the
# as required. (grep for #FAQ-rm# to extract this script.) Expect to
recover at least 2.5Mb (and potentially a lot more) with this procedure.
# To delete the technical notes (print them off first?): #FAQ-rm#
#rm -r $II_SYSTEM/ingres/notes #FAQ-rm#
#rm -r $II_SYSTEM/ingres/advisor #FAQ-rm#
#FAQ-rm#
# To delete the release notes: #FAQ-rm#
#rm $II_SYSTEM/ingres/release.doc #FAQ-rm#
#FAQ-rm#
# To delete the ABF demo: #FAQ-rm#
#rm -r $II_SYSTEM/ingres/bin/abfdemo #FAQ-rm#
#rm -r $II_SYSTEM/ingres/bin/deldemo #FAQ-rm#
#FAQ-rm#
# To delete VIGRAPH #FAQ-rm#
#rm -r $II_SYSTEM/ingres/vec #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/vigraph #FAQ-rm#
#rm $II_SYSTEM/ingres/files/*.gr #FAQ-rm#
#rm $II_SYSTEM/ingres/files/english/vg*.hlp #FAQ-rm#
#FAQ-rm#
# To delete miscellaneous other executables: #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/pclink #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/hstpclink #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/iistar #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/starview #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/eqf #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/esqlf #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/eqc #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/esqlc #FAQ-rm#
#FAQ-rm#
# To delete Release 5 files #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/conv* #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/*60* #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/cvsync #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/appchk #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/iifsgw #FAQ-rm#
#rm $II_SYSTEM/ingres/bin/dupdb #FAQ-rm#
#rm -r $II_SYSTEM/ingres/convto60 #FAQ-rm#
#FAQ-rm#
# To delete the contents of the sig directory #FAQ-rm#
#rm -r $II_SYSTEM/ingres/sig #FAQ-rm#
#FAQ-rm#
# To delete extraneous terminal mapping files #FAQ-rm#
#rm $II_SYSTEM/ingres/files/97801f.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/ansif.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/ansinf.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/at386.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/bull10.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/bull24.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/bullvtu10.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/bullwv.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/dg100em.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/dg220em.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/dgxterm.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/h19f.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/h19nk.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/hp2392.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/hp70092.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/ibm5151f.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/icl12.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/icl34.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mac2.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws00.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws01.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws02.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws03.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws04.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws05.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/mws06.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/pckermit.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/pt35.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/suncmdf.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/sunf.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/sunk.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/sunm.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/tk4105.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt100f.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt100i.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt100nk.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt200i.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt220.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/vt220ak.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/wview.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/wy60at.map #FAQ-rm#
#rm $II_SYSTEM/ingres/files/xsun.map #FAQ-rm#
In addition to deleting these files, the few necessary terminal
and the rest deleted. This can also improve start-up performance
if the required terminal descriptions appear far down in the file.
Also, be sure to run ckpdb with the -d option from time to time to
delete stale journal and checkpoint files. ckpdb cannot address
journal files older than the 16 most recent ones, so they must be
deleted manually if they exist. Since auditdb can't address them
either, there is no point in keeping any more than the 16 most recent
ones anyway.
See also section 30.002 on recovering space used by the error log.
08.028 How can I assign sequential record numbers?
System-generated sequential numbers are useful in a number of
applications such as work order numbers, cheque numbers,
invoice numbers, or just as a surrogate key to maintain the order of
user entered records. Some database products offer a "serial" datatype
that the system automatically increments in order to simplify numbering
| rows sequentially. Ingres does not have such a datatype so you must
create your own.
| Note that non-sequential numbers may be preferred in some situations.
| See section 08.030 for more details.
|
There are many ways to assign sequential numbers, but the basic idea
is to create a table in which you store the last number assigned
and then access the table in a way that guarantees that no two users
will ever be able to get the same number. The example shown here will
use the `generator' table defined by:
CREATE TABLE generator ( next_nr INTEGER NOT NULL ) WITH JOURNALING;
To get the next sequential number, first turn off autocommit if it
is on, and then:
EXEC SQL UPDATE generator SET next_nr = next_nr+1;
EXEC SQL SELECT next_nr INTO :next_nr FROM generator;
...
EXEC SQL COMMIT;
By doing the UPDATE first you will be blocked until any lock held
by another user is released, and once you get access to the table
you will hold an exclusive lock on it until you COMMIT. No one else
will ever be able to get the same next_nr. (If the order of the UPDATE
and the SELECT is reversed, then two users could easily get the same
number.)
Because the sequential number generator table will often be a very
busy table it can easily become a system bottle-neck. To maximize the
availability of the generator table, you should wait until as late as
possible in the transaction before accessing it so that you can COMMIT
as soon as possible. Alternatively, you could use a second session
to access it; you could then COMMIT immediately--that would probably
give the very best performance of all.
If you want to maintain multiple series of numbers independently, like
work-order numbers, employee numbers and inventory numbers, you can
either use one table with an extra column to identify the number series,
or use separate tables for each series. If you opt for a single table
and if all the rows will fit in one or two pages--which they almost
certainly will, it would be best just to keep it as a heap for maximum
performance. On the other hand, one table per series will maximize
concurrency.
Once you have a basic sequential number generator you can invent many
variations on the theme. For instance, if you don't mind having gaps
in your numbers (perhaps you are just generating a surrogate sort key
and all that matters is that the numbers be strictly increasing), then
you can increment the last assigned number by an increment greater than
1--say by 10 or 100 or more. By noting the first number in the range
and the last number in the range you can "reserve" a block of numbers
to use without having to access the database repeatedly. This can cut
your disc I/O in half in some transactions. This only works if you
don't mind reserving numbers and then not using all of them. (But it
can reduce I/O enough that you may reconsider how much you mind having
gaps--maybe you can stand them after all!)
Another useful variation on the theme is sequential numbers with
check-digits. Check-digits are a practical necessity when the number
you are generating will later be re-keyed manually to identify a
record. For example: inventory tag numbers, employee numbers, part
numbers, account numbers, and so on. If you simply assign sequential
numbers for these and an operator subsequently miskeys a number, but
the incorrect number corresponds to a valid number assigned to another
item, the problem may go undetected. Check-digits can all but
eliminate this problem by providing a way that the computer can tell
"by inspection" that an incorrect number was entered. The following
view, based on the `generator' table above, assigns a 6 digit number
with a 7th check-digit that will catch all errors involving wrong
digits and transpositions:
CREATE VIEW cd_generator AS SELECT
right(squeeze('000000'+ascii(next_nr)+ ascii( mod(10-mod(
(mod(next_nr,10000000)/1000000)+
mod((mod(next_nr,100000)/10000)*2,10)+
((mod(next_nr,100000)/10000)*2/10)+
(mod(next_nr,10000)/1000)+
mod((mod(next_nr,1000)/100)*2,10)+
((mod(next_nr,1000)/100)*2/10)+
(mod(next_nr,100)/10)+
mod(mod(next_nr,10)*2,10)+
(mod(next_nr,10)*2/10) ,10),10) )),7)
AS next_cd_nr
FROM generator
(As defined here, next_cd_nr is a 7-character string padded on the
left with 0s, just as you would probably want to print it on a label
or a form. If you need a larger number range the extension is
straightforward once you see the pattern.)
An application subsequently trying to determine the validity of an
input just needs to compute the expected 7th digit from the first 6
that were entered, and if it does not agree with the supplied 7th
digit, there is an error. For example, using the computation above,
the number 314159 has the check digit 5 (ie 3141595). If the operator
inadvertantly reverses the 5 and the 9 and enters 3141955, then the
computed check digit would be 9, which would not match the supplied
check digit and an error could be flagged. Similarly, if the 9 were
miskeyed as 0 (3141505), then the computed check digit would be 4 and
once again an error would be recognized. Pretty obviously if the
error is made in keying the check digit itself an error will be flagged
too--there is no way to tell where the error is located without
reference to the intended input.
The computation used in the application is the same as in the view
but the precise implementation will vary with the language used so it
| is not shown here.
08.029 How can I do a case-insensitive string match with wild-cards?
| Versions of Ingres up to and including Release 6.4 implement the
Entry-Level definition of the standard `like' predicate. This insists
on having a column name immediately to the left of the LIKE keyword;
in particular, functions are not allowed. Therefore it is not possible
to write a WHERE clause such as:
WHERE lowercase(col1) LIKE 'figseeds'...
It must instead be written as
WHERE lowercase(col1) = 'figseeds'...
This is an irritating quirk, but not much more. A worse problem is
when wildcard characters are necessary. How can the search which is
naturally expressed as
WHERE lowercase(col1) LIKE '%figseeds%'...
be handled? The obvious (albeit grotesque) solution is to create a
view of the table which returns the column strictly in lower case.
Happily, John Morgan provides a somewhat less awful solution that
handles this particular situation without creating yet another view.
His solution is neither concise nor natural, but it is by far the best
the net has seen to date:
WHERE locate(lowercase(col1),'figseeds') < size(col1)...
The somewhat simpler case, looking for 'figseeds%', is expressed as:
WHERE locate(lowercase(col1),'figseeds') = 1...
Unfortunately this does not generalize much further very easily. For
example, it is not trivial to adapt this trick to cases such as:
'%figseeds'
'%fig%seeds'
'% ___seeds'
'\[fp\]ig\[fs\]eeds' escape '\'
The long-term solution to this problem is provided by the
Intermediate-Level definition of the LIKE predicate, which behaves
| more naturally, and which allows functions on the left. This is
| available in OpenIngres 1.1.
| [Steve Caswell reports that Ingres 6.4/05 has the Intermediate-Level
LIKE predicate--even though it is not mentioned in the release
notes. It just works. Further feedback on this is welcome.]
[Further feedback from a source in CA tells me that the intermediate
level LIKE is available in 6.4/05 through dynamic SQL (and hence
through isql, Report Writer, etc), but NOT through "static" SQL (ie
ESQL/C).]
| 08.030 How can I generate surrogate keys for best performance?
|
| [This is a continuation of section 08.028 above.]
|
| Ingres provides two logical key types: TABLE_KEY and OBJECT_KEY, but
| these have some serious drawbacks that require elaborate work-arounds.
|
| There are some performance pitfalls to consider when generating your own
| surrogate keys. The obvious one is that the table containing the
| last value assigned can easily become a system bottle-neck. Another
| possibly less obvious problem is the that sequential values, if used
| for a primary key, can cause some table structures to perform poorly
| (especially ISAM and B-tree).
|
| Access contention problems over the last-value table (`generator') can
| be handled in a number of different ways which can be more or less
| effective. Three possible techniques were mentioned briefly in
| 08.028: (1) deferring the update of `generator' until the last
| possible moment so that the exclusive lock is held for as short a time
| as possible. (2) Using a second session to access `generator' so that
| the update to it can be commited without commiting the "real" work, and
| (3) pre-allocating blocks of numbers to use without accessing the
| database at all.
|
| The last two can only be used effectively when you don't mind having
| gaps in your numbers; for instance when it is important only that the
| numbers be non-repeating and strictly increasing. This would be
| acceptable for labeling records as they are entered to allow you to
| reconstruct the order of entry when the records are retrieved. Such
| numbers are also useful when combined with the table's natural key if
| the application is allowed to alter all of the other attributes in the
| row. Usually, without a composite key constructed from the natural
| primary key and some arbitrary discriminating number it is necessary
| keep a before-image of the row, or else succumb to the temptation to
| use the TID in order to be able to find the original row to update it
| in the database.
|
| Sequential numbers may be fine in many cases, especially if you are
| just assigning ordinal numbers to use to sort rows later, but they are
| not ideal in all applications. Sequential record numbering can have
| undesirable effects on the performance of the database even if the
| numbers can be allocated rapidly and with a minimum of locking. If the
| generated number is used as a primary key, it can cause two problems.
| First of all, it can tend to cause all database activity to be
| concentrated on the same page of a table--if many users are adding rows
| with a key that causes them all to attempt to update the same page at
| once they will end up blocking each other and performance will rapidly
| deteriorate. Hash tables don't suffer from this especially, but all
| the other table structures do (in general anyway; there are odd-ball
| single-user cases where performance actually improves, but unless you
| know for sure that you are in one of those situations, assume
| you aren't.) If the generated number only needs to be unique, then it
| is far better to have consecutively generated numbers that are "far
| apart" or maybe pseudo-random. (Note that the Ingres system
| maintained logical key types TABLE_KEY and OBJECT_KEY are
| pseudo-random, presumably for this reason.) In theory, these "far
| apart" surrogate keys should vector simultaneous users to update data
| pages that are "far apart" too, eliminating or greatly reducing
| blocking.
|
| The second problem with sequential primary keys is that they force
| chronic B-tree index splitting and lop-sidedness in ISAM tables,
| which affects performance.
|
| Unique non-sequential keys can be generated using an additive
| congruential algorithm such as the following:
|
| UPDATE generator
| SET keyval=keyval/2+mod(mod(keyval,2)+mod(keyval/8,2),2)*2**30;
| SELECT keyval INTO :keyval FROM generator;
| COMMIT;
|
| (For a full explanation of this algorithm consult Roy Hann's paper
| "Key Points About Surrogate Keys", session number NT020S, presented
| at CA World '96.)
|
|
|
08.031 How do I find rows that don't match a row in another table?
This is a pretty basic question that is dealt with in almost any
relational database textbook and in the manuals. However it comes
up regularly, so here is the basic form again:
SELECT *
FROM table1 t1
WHERE NOT EXISTS
(
SELECT *
FROM table2 t2
WHERE t1.keyfld = t2.keyfld
)
You could also use the NOT IN construct if that makes more sense
to you, but they both end up the same query plan, which is what you
would hope and expect.
08.032 Why do I have a SWAP and a NOSWAP authorization string?
CA-Ingres uses SWAP and NOSWAP keys because of different machine
architectures (big-endian vs little-endian). You only need to use the
one which is appropriate for your machine--the other one would give
you an error like:
E_CL2604_CI_BADCHKSUM The authorization string (II_AUTHORIZATION)
checksums incorrectly. This is probably a typographical input error.
Please consult the CA-Ingres system manager.
To see which key you need for your machine, choose from the list
below:
SWAP Machines are as follows:
AT&T, ALLIANT, APOLLO, AMDAHL, BULL, CCI, CONVEX, CRAY, DG, ELXSI,
GOULD, HP, IBM, NCR System V Tower 32/850, PYRAMID, SILICON GRAPHICS,
SPERRY, SUN, TANDEM
NOSWAP Machines are as follows:
DEC (VAX VMS, Alpha OSF, Open VMS), SEQUENT, 386, 486 and Pentium
MACHINES, Siemens MX, IBM PS/2, NCR System 3000, NCR Tower 32/300, 500,
700
This information should be provided with the keys.
08.033 How can I automatically report the location of an ESQL error?
The syntax of the SQL WHENEVER statement does not allow any arguments
(which might be useful in tracking down the the actual location and
cause of any errors). John Hascall suggests the following neat little
trick for getting the cpp pre-processor and ESQL/C to work together
to insert the ANSI standard manifest constants __LINE__ and __FILE__
into an error message:
EXEC SQL INCLUDE SQLCA;
#define SQLERR() sqlerr(__LINE__,__FILE__)
EXEC SQL WHENEVER SQLERROR CALL SQLERR;
main()
{
EXEC SQL CONNECT somedb;
/* ... */
}
sqlerr(line, file)
int line;
char * file;
{
/* ... */
}
08.034 What are some good trace points?
Trace points are mostly undocumented, and are mostly useless or
dangerous if invoked by us customers. However a few are exceedingly
useful and it is a great pity that those few are not fully documented
or made available in a more friendly form. (Actually some have
appeared as new SET options like OPTIMIZEONLY, formerly trace point
op160.)
| Here are a few that are useful:
dm420 - dump DMF cache statistics
| dm421 - flush the DMF cache (essential when benchmarking)
| dm1305 - force a consistency point
dm1440 - display sort locations
op132 - turn off query flattening
op165 - disable use of statistics
| qe90 - display ACTUAL resources consumed (in same format as QEP)
| qs506 - purge the QSF pool and force new QEPs to be generated
| sc906 - log sessions in errlog.log
A trace point is turned on and off with the SET command. eg:
SET TRACE POINT qe90;
SET NOTRACE POINT qe90;
Needless to say, these trace points are unsupported, and that any
unfortunate consequences of using them is entirely YOUR responsibility.
| (For instance qs506 above will temporarily degrade the performance of
| your system.) Furthermore they might disappear or change behaviour in
| future releases.
| Several months ago, an Ingres Trace Point Reference List was created and
| made available on the Web by Robert Morey. This list can be found at the
| following URL:
| http://www.well.com/user/ideamen/trace.html
| As stated on the web page, use these at your own risk.
| 08.035 Does Ingres have an API I can use?
| CA-OpenIngres 1.x has an API. Ingres 6.4 and earlier does not. Before
| describing the API though, it needs to be pointed out that a great deal
| of rubbish is talked about the merits of APIs versus embedded SQL.
| This entry in the FAQ hopes to set the record straight.
| The OpenIngres 1.x API is mainly intended to satisfy the need for
| performing asynchronous database operations, and to make it easier for
| developers of third-party software to create Ingres ports of their
| products. The API is not functionally very different than the existing
| dynamic SQL capability provided by Ingres, except that it does not
| require the ESQL precompiler (instead it requires the API library).
|
| For pretty well all ordinary application programming an API is neither
| required nor desirable. Application programming is usually most
| productively and reliably done using embedded SQL and the ESQL
| pre-processor (regardless of its manifold defects). APIs are hard to
| use; they are unique to each product, and they are very likely to
| change from release to release. They should be avoided if possible
| even when using products that do support them.
|
| If dynamic SQL is required, then the EXECUTE IMMEDIATE statement is the
| first and simplest option. This will be adequate to handle the usual
| problem of wanting to supply the table name at run-time. It can be
| used to supply the rest of the statement at run-time too, provided that
| the existence and form of the target list is unvarying.
|
For more elaborate queries, where even the target list might vary, then
| there is the PREPARE...FROM, DESCRIBE...INTO, and FETCH...USING
| DESCRIPTOR statements. These are not easy to use, but are not any
| harder to use than an API. One potential short-coming with these is
that the query plan cannot be cached for future re-use, but the kinds
| of applications that would use these statements probably wouldn't
benefit much from cached query plans anyway.
For really exotic requirements, such as asynchronously executing
| transactions against the database, then you were on your own prior to
| OpenIngres 1.x. For that problem you would fork independent "query
| servers" built with ESQL. Anyone capable of dealing with the
| labyrinthine complexity of an API would have no trouble doing this.
| There is a widely held view that using an API to access the database
| will result in better performance than using ESQL for the same purpose.
| Until a credible benchmark proves this, we really need to be very skeptical
| of this claim. There is no reason to expect this to be the case.
| Wanting to use an API in order to use a favoured compiler that is not
| otherwise supported by ESQL may indicate somewhat confused priorities.
| Rather than petitioning for an API, it may be better to petition for
| better ESQL support for more compilers, especially in the Microsoft
| world. (Contact Jane Frazer (Chair of the NAIUA Product Directions
| committee) at prod_dir@naiua.org, or log a SIR through Technical
| Support.)
|
08.036 How can I find duplicate rows in a table?
Finding duplicates is harder than just getting rid of them. To get
rid of them, just create a new table by:
CREATE TABLE newtab AS
SELECT DISTINCT *
FROM oldtab;
Then use this new table to replace the original table, or use it for
whatever other purpose you had in mind.
To actually find the duplicates is a bit more work. For that you
will need something like:
SELECT col1, col2, ..., colN, count(*)
FROM oldtable
GROUP BY col1, col2, ..., colN
HAVING count(*) > 1;
You name as many columns for col1 to colN as are important to you.
To find wholly duplicate rows you must name ALL the columns in the
table.
| 08.037 How can I create a WWW interface to an Ingres database?
|
| If you are using OpenIngres 1.2 or later, you can use OpenIngres/WEB or
| OpenIngres/ICE. OpenIngres/WEB is a standard component of OpenIngres
| and is not an extra-cost option. It is intended for supporting
| so-called "intranets". OpenIngres/ICE is basically the same product,
| but licenced for unlimited users, and it intended for supporting
| applications on the Internet. (ICE stands for Internet Commerce
| Enabled.) Contact your local CA office for authoritative information.
|
| Users running Ingres 6.4 or OpenIngres 1.1 can use a couple of tools
| (such as webintool) from the NAIUA Tool Archive
| /pub/ingres/utilities/NAIUA on ftp.naiua.org (198.53.152.12).
| WebinTool is a generic WWW to SQL-database interface building tool
| developed at the BBSRC Roslin Institute, UK, which is freely
| available. The tool was originally designed for the Ingres DBMS, but
| it can be ported to support other DBMSs (e.g. Sybase, Unify2000)
| without too much effort.
|
| WebinTool allows the user to create USER-CUSTOMIZED WWW interfaces to
| SQL-databases through a series of user-defined WebinTool forms. A
| WebinTool form is a document written in HTML and a set of webin
| statements.
|
| For more information, access
|
| http://www.ri.bbsrc.ac.uk/webintool.html
|
| Questions and comments can be sent via email jianhu@bbsrc.ac.uk or via
| WWW http://www.ri.bbsrc.ac.uk/cgi-bin/webintool_cmmt.sh
|
| Another increasingly popular option for deploying WWW applications
| against an Ingres database is Java. See section 04.005 for a list of
| JDBC driver vendors.
|
| Note: you should probably read the fine print in your Ingres
| licence agreement before you decide to use webintool or any similar
| program to make your Ingres installation available over the Internet.
|
|
|
| 08.038 Is there any point in doing REPEATED INSERT?
|
| Possibly. Flagging an embedded SQL statement with REPEATED causes the
| query plan to be cached for future re-use, thus improving performance.
| However there is no query plan for a simple INSERT INTO...VALUES...
| statement so it is not obvious that there is any point in marking it
| REPEATED. However a less often recognized effect of REPEATED is that it
| also causes the parser and relation descriptor facility to be bypassed
| too. If you are doing a large number of INSERTs (say thousands) then
| it may well be worth marking them as REPEATED.
|
|
|
| 08.039 Can you get unloaddb to go directly to tape?
|
| To unload very large Ingres tables is easy under UNIX. First make a
| named pipe under Unix using the mknod -p command
|
| mknod -p /tmp/fifo
|
| then use this file as the file name in the COPY command.
| As as separate process you then copy the information to tape.
| A sample Bourne Shell script might look like this:
|
| (
| sql database << EOF
| copy blah() to '/tmp/fifo
| \\p\\g
| EOF
| ) &
| dd if=/tmp/fifo of=/dev/rmt/1
|
|
------------------------ END OF PART 2 ------------------------------
| SECTION 9 -- RDBMS
|
09.001 What processes do what?
dmfacp archiver process
wakes up at intervals and copies committed transactions
on journalled tables from the log file to the journal file.
| dmfrcp recovery process (recovery server in OpenIngres)
The dmfrcp process moves log records from log buffers
in memory and writes these records to the logging
system file. In case of server or system failure, the
dmfrcp recovers pending transactions by reading the
logging system file and performing appropriate recovery
actions. This is done during start-up. While the recovery
process is running the database is locked and users attempting
to connect see the message "The database is currently
unavailable."
iidbms INGRES RDBMS server process
| the actual data management component. There may be multiple
| servers per installation. OpenIngres allows customer defined
| server classes.
iigcc communication server process
provides the network communication function of INGRES/Net.
There may be multiple instances of iigcc in an installation.
iigcn name server process
monitors and identifies all the INGRES servers in an
| installation (eg iidbms and iigcc). There will be one per
| installation, on each client and server.
iislave disc I/O process (Unix machines only)
actually performs disc I/O operations for iidbms. To
| maximize concurrency, it is advisable to have at least one
| iislave per disc drive. (See note 09.002 below.)
09.002 How are extra iislave (disc) processes started?
| It is generally advisable to have at least one iislave process per disc.
The required number of iislaves is requested by the user `ingres' with:
ingsetenv II_NUM_SLAVES=
where is the number of iislaves to fork when iistartup is
executed. This assignment is non-volatile and needs to be made only
| once, or as new discs are added. If multiple servers are to be started
| the value of II_NUM_SLAVES can be adjusted for each server prior to
| starting it.
09.003 How do I recover an inconsistent database?
| Contact Computer Associates Ingres Technical Support. This answer is
not deliberately intended to be facetious, it is just that an
| inconsistent database can be caused by a number of things. Technical
Support are best able to determine the cause of the inconsistency and
advise on the appropriate recovery procedure.
| Some situations which cause a database to be marked inconsistent can
| be pre-empted. See section 09.019 for more information.
|
| It would be very foolish to do as some contributors suggest and just
use verifydb to force the database consistent. That option of verifydb
| is a last-resort salvage tool, not a recovery mechanism. It fixes
| nothing and leaves a mess in the database.
| 09.004 What are "compressed" table structures?
In ordinary table structures space is allocated for data rows according
| to the maximum width of the row. With compressed table structures
| Ingres applies a compression algorithm in order to reduce the amount of
| space required. The advantage is a reduction in storage requirements;
| the disadvantages are twofold:
Firstly there is a small performance penalty whenever a row is stored
| or retrieved, as it has to be compressed or uncompressed. Secondly
| when a row in a compressed table is updated, it is unlikely to remain
| the same size as the old row. If it is bigger then it won't fit in the
| hole left by the old row, and so it is added somewhere else in the
| table. Thus an UPDATE is effectively turned into a DELETE followed by
| an INSERT, and a hole, ie unused space, is left in the table.
Eventually these holes occupy more and more of the table until a MODIFY
is required to reclaim the space.
For these reasons compressed structures are not recommended for tables
that are updated heavily. For other operations, ie: SELECT, INSERT and
| DELETE there is a performance penalty because OpenIngres 1.x uses LZW
| compression. (Ingres 6.4 just eliminates "blank" space at the end of
| strings, which is not very intensive.)
Note that for CISAM and CBTREE structures only the data is compressed.
Data stored as part of the key is never compressed in the index.
09.005 Why might I configure more than 1 DBMS server process?
The DBMS server is multithreading: it handles SQL requests on behalf of
many INGRES clients. Yet INGRES allows me to set up more than 1 DBMS
server. What reasons might I have to do this?
There are quite a number of reasons you might decide to do this:
o Multiprocessors. Although a DBMS server is multithreading, it can
only run a single thread at a time. If you have more than 1 CPU it
may be beneficial to have more than 1 DBMS server. As the number
of CPUs increases then you are likely to need more DBMS server
processes to exploit the extra power.
The optimal number depends on average SQL arrival rate and service
time. You could build a model using queueing theory. Alternatively
do what everyone else does: try different numbers and measure
which is best for your workload and configuration.
o Keep DBMS size manageable. You can get a lot of users on 1 DBMS
server. But you need to configure more and more DBMS resources as
the number of users grows. There comes a time when the DBMS just
gets too *enormous* to be manageable.
Splitting the workload across multiple servers allows you to run
without setting all the Kernel process limits up to ridiculous
values, negating their original purpose.
o Separate conflicting work types. Some types of work don't run well
together in the same DBMS server, e.g. OLTP and heavy batch, OLTP
and heavy scans (reports or MIS). There is no internal
mechanism for assigning and managing thread priorities within
the DBMS server, which can lead to undesirable interactions between
the different parts of the workload.
A very common scenario is to have a separate server for daytime
batch and reports. This prevents the batch/reports interfering
with OLTP throughput and response times.
Another possible scenario is to separate 2 OLTP systems. This
separation may help with performance analysis and tuning, and
prevent interactions between them. They each have their own set of
resources.
o Error containment. When a DBMS server crashes or decides to shut
down, all users of that server are affected. It might make sense
to partition your workload into multiple DBMS servers, so that
only part of the user population is affected by a DBMS failure.
This can be particularly useful if your workload is unstable, even
as a temporary measure while you find the real problem.
Note that currently if a DBMS connected to a shared cache fails,
then all other DBMS servers using that shared cache will fail too.
That is, the shared cache is the unit of failure.
09.006 How can I direct batch or reports to a particular server?
| OpenIngres supports customer-defined server classes. See section
| 09.018 for more information.
|
| Ingres 6.4 does not offer such an elegant solution as OpenIngres.
At the moment, you have to bypass the Name Server to do this.
There are a number of steps:
o Set up a *private* DBMS server, that is: one the Name Server doesn't
know about. Do this by setting the DBMS startup flag 'nonames'.
No connections will be routed to this server by the Name Server.
o Store the private DBMS server ID in a Well-Known place, e.g. an
O/S file, an installation-level environment variable.
Remember this changes when INGRES is restarted. You need to
find out what it is and store it on every restart.
o Arrange that the II_DBMS_SERVER variable is set locally for batch
and reports which you want to run in the private DBMS server:
$ II_DBMS_SERVER=1234
$ export II_DBMS_SERVER
Where '1234' is the private server ID remembered earlier. This
routes the batch/report to the private server.
You will need to write some simple shell scripts to store and retrieve
the private DBMS server id. The iishutdown script looks for private
servers: you don't need to shut them down manually.
09.007 How does INGRES use sort space?
If you don't do anything, INGRES will take sort space to modify tables
from the table location, and other sort space from the database home
location. For production databases this is probably not what you want.
You can tell INGRES to use sort work locations which can be set up
anywhere. See the DBA Guide for details.
There are some things the DBA Guide doesn't tell you:
o The sort workfiles are striped across the available sort locations
by the sorter. The size of the stripe is determined by the sorter
at run time.
o It follows that the input and output files of the sort phases are
striped across the same disks. So you're guaranteed disk
contention--and there's nothing you can do about it.
o Keep the sort locations about the same size. When one location
fills that work file is *full*. There may be Gbs free in the other
sort locations, that doesn't matter. The sorter just gives up on
the sort in progress and returns an error.
o Unlike some other system locations, sort locations can be changed
by resetting the relevant installation environment variables. The
sort locations are dereferenced by the DBMS server when it
starts up, so restart INGRES or at least the DBMS servers to pick
up the new sort configuration.
o Check your sort locations have been picked up like this:
$ isql iidbdb
SET TRACE POINT DM1440;
This gives a list of sort location pathnames known to the
DBMS server at the moment.
o There must be no gaps in your sequence of sort location numbers.
When the DBMS server gets to a gap it stops looking for any more.
o It follows that if sort location #1 is not defined then sort space
is allocated using the default scheme described earlier.
Note: space for temp tables is always taken from the database home
location, not from the sort locations.
09.008 When does INGRES switch to a new journal?
Journals are switched automatically when you take a checkpoint. But
sometimes INGRES will switch to a new journal between checkpoints.
| The journals are written by the Archiver Process (ACP), dmfacp. By
| default this writes the journal in 8 kb `pages'. When it has written
| 1024 of these pages it will look to switch journals, i.e. after 8 Mb of
| journal.
The ACP is woken up periodically to copy information from the log file
to the individual database journals. When it has completed its log
file scan and copied all it can to the journals, it then checks if the
journals need switching. So in practise the switch happens at 8 Mb + a
little bit.
| In OpenIngres the journal switch point and page size are configurable.
09.009 Should I use mirroring on my data locations?
Maybe.
There's no standard virtual disk package: each is implemented
differently. You need to ask your vendor this question: does your
virtual disk implementation guarantee that mirrors are in sync after a
crash or power-off?
o If the answer is yes, then it is probably safe to mirror your
data locations. The choice is then a trade-off of resilience
against performance.
| o If the answer is no, then Ingres fast commit recovery will probably
leave the mirrors out of step. The same SQL query may give different
answers at different times. Avoid, or if you want to take the risk
then invest in an uninterruptable power supply. This will give you
some protection against the most common failure case.
o If the answer is fudged, it's probably best to assume a `no'.
If you do mirror your data locations, the disk I/O load on the total
system will increase. You need to configure more disks and controllers
to handle the load.
Note: the problem is that fast commit recovery algorithms have to probe
the database after a crash to see which updates made it to disk. If the
mirrors are out of step, different things will happen depending on which
mirror returns the data. There are a number of scenarios, some of which
are not very nice: duplicate rows on one mirror, missing rows on one
mirror, corrupt index on one mirror, etc.
09.010 Can I use mirroring as a super-fast checkpoint?
| Yes, but ONLY if you do so by modifying the checkpoint template and
| using "ckpdb". This method will work for either on-line or off-line
| checkpoints, and inherits all the respective limitations.
| To implement this, your "mirroring" solution must be controllable from
| the command line. You need to be able to reliably run a command that:
| 1) determines if the mirrors are all on-line and synchonized
| 2) disengages one of the mirror disks so it is no longer updated
| 3) re-engages the mirror disks
| The general checkpoint template algorithms are:
| 1) In the BEGIN phase, assure all mirrors are on-line and
| synchronized. If not, fail.
| 2) In the WORK phase, disengage one of the mirror disks for each
| data location.
| 3) In the END phase, do nothing.
| After the "ckpdb" command completes, you have a set of disks containing
| a "copy" of your database. If you performed an off-line checkpoint,
| this "copy" is perfect. If you performed an on-line checkpoint, this
| copy is not perfect, but will be made perfect when you recover by
| "rollforwarddb" properly applying the dump file records.
| Since you probably want to re-engage your mirror disks to prepare for
| the next checkpoint, you must now copy the data from the off-line
| mirror set to tape. Then issue the proper command to "resync" the
| mirrors. Remember this may or may not have adverse performance
| implications. Some solutions will resync faster if the time spent
| "off-line" is minimized.
|
| If you use this solution, remember that from the time the ckpdb begins
| until you resynchronize the mirrors, you are protected by one less
| mirror set. You may want to consider a minimum of three mirror sets if
| you choose to implement this strategy.
|
| Make sure you properly modify the checkpoint template so you can
| recover properly.
|
| PLEASE NOTE! Simply using the OS or hardware to "break" a mirror
| set for later backup to tape WILL NOT WORK unless Ingres
| has been shut down normally. If there are any
| transactions in the log file, or any unflushed cache
| pages in an active DBMS server, this method will NOT
| provide a "recoverable" backup.
|
|
09.011 Can I mirror my log file?
| In installations using FAST COMMIT (i.e. almost all Ingres
| installations) committed transactions are not written through the DMF
| cache to disc right away. Committed updates can exist in the cache and
| the transaction log for quite some time without being written to disc.
| The transaction log file is therefore a `critical single point of
| failure' for an Ingres system. If fast commit is enabled and you lose
| the log file, you WILL lose committed transactions. A mirrored log
| file could protect against this situation.
| OpenIngres supports a dual logging option to mirror the log. This
| option should be exploited. See the System Reference Guide for
| instructions. (Note that dual logging will only be effective if the
| mirror is on an entirely separate drive.) The rest of this note
| applies to Ingres 6.4 which does not have this valuable feature.
|
| Ingres 6.4 does not support dual logging as an Ingres feature, but
| mirroring can still be done. As always, there is a price: performance
in this case. If your workload is update- and commit-intensive you
will notice it most. On an extreme workload of this type (TP1) a
reduction in throughput of some 40% was measured.
But you can choose between performance and resilience on this single
point of failure. An alternative approach is to disable fast-commit,
| but that will also have a severe performance penalty.
Some virtual disk packages don't support mirrors on raw disk. Check
the manuals.
| If you don't mirror your transaction log and you do want to run
| fast commit, you can reduce the amount of data that would be lost
| in the event of a log failure by making the archiver run after
| every consistency point. The default is to run after every fourth
| consistency point.
09.012 Can I have more than 1 DBMS page cache?
This is quite easy to arrange, but be sure it's really what you want to
do.
Simply starting multiple servers with the runrundbms utility will, by
default, start each server with its own private DMF page cache in its
| internal data space. The Ingres locking system is used to maintain the
coherency of multiple caches, using a value block locking technique.
| You may therefore need to configure additional lock resources.
If you want to have a number of DBMS servers using fast commit on the
| same database, then you can use the shared_cache option. This
creates the DMF page cache in a shared memory space, which is then
connected to by all of the servers. There is a system of latches and
semaphores to safely coordinate their access to the common DMF page
| cache. (Note that if several servers share a cache and one server
| dies, all the servers attached to the same cache will immediately
| die too.)
It is also possible to have several shared caches, but you must give
them different names. See the I & O Guide for details.
09.013 Can I have more than 1 fast commit server?
Yes. Set -fast_commit and -shared_cache and DON'T set -sole_server.
Refer to Chapter 2 of the I&O Guide, "Using a Shared Buffer Cache" for
more information.
| 09.014 What is the Ingres Search Accelerator?
| The Ingres Search Accelerator is a hardware device that speeds
up certain types of database operation and is based on ICL's
SCAFS technology. (CAFS stands for Content Addressable File
Store and was developed by ICL for their VME mainframes. SCAFS
| is the SCSI bus based version.) It is available for the ICL DRS6000
| and DRS3000, the IBM RS/6000, and probably any Fujitsu box that both
| it and Ingres run on.
The system works by passing a query, or part of a query, to an
intelligent disk controller. The disk controller applies this
query to the data that it has been asked to read from the disk
and only passes back the rows that match. This results in a
significant reduction in the amount of data being passed back to
the main processor giving the following benefits:
- there is reduced bus activity, thereby allowing other
system activities to run more quickly
- the CPU has fewer rows to process and therefore less work
to do, so queries execute more quickly and more CPU
cycles are available for other activities
| - there is less data coming back to the CPU so Ingres data
caches are flushed less frequently
The following operators are supported by the Accelerator and
queries containing them are eligible to be "accelerated":
Operator Meaning
= equal
!=, <> not equal
< less than
> greater than
<= less than or equal, not greater
than
>= greater than or equal, not less
than
IS NULL TRUE if the column value is null
IS NOT NULL TRUE if the column value is not
null
LIKE TRUE if the column value conforms
to a match string
NOT LIKE TRUE if the column value does
not conform to a match string
Note: A character string containing a character range (eg
[A-H]) cannot be handled by the Accelerator.
The Accelerator can handle absolute dates but not date
intervals.
09.015 When and how do I use the INGRES Search Accelerator?
Use of the Accelerator is completely transparent to the
application. The Query Optimizer decides whether or not to
invoke the Accelerator and there is no way, as with normal
queries, of hinting at or suggesting a plan to the Optimizer.
The Accelerator hardware can be fitted "retrospectively" and any
existing applications will benefit from performance increases
automatically.
The Accelerator is used to best effect when there are tables
that would normally be scanned rather than accessed through an
| index. Typically this occurs in MIS systems where ad hoc
queries are issued by the users and the application designer
cannot determine the most effective indexing in advance.
| 09.016 How can I find out more about the Ingres Search Accelerator?
| See the "Ingres Search Accelerator Workload Trials Report"
which gives detailed performance figures for five different
real-life applications. The results presented in the report
were independently verified by management consultants KPMG, and
ranged from a worst case of 2.5 times more to a best case of 45
times more in terms of transaction throughput.
| Details on the product can be had by pointing your Web browser to:
| http://www.icl.co.uk/cguide/cg500009.html
|
09.017 Why am I running out of QSF memory (E_OP0886 and E_QS0001)?
There are two possibilities: the pool is too small for your local
requirements, or the pool is too fragmented (or equivalently: your
queries are too complicated).
Unless otherwise specified, the size of the QSF (Query Storage
Facility) memory pool is estimated from the number of connected sessions
declared when the server is started. By default, the pool size is set
to 60kb+N*40kb, where N is the number of connected sessions allowed.
This formula is just a rule-of-thumb for sizing the pool. In any given
installation the type of work being done may mean this estimate is too
small.
| The allowed number of connected sessions is defined using CBF in
| OpenIngres, and in Ingres 6.4 by -connected_sessions in
| $II_SYSTEM/ingres/files/rundbms.opt. It is possible to increase the
size of the QSF pool by adjusting the allowed number of connected
sessions upward.
A better solution might be to increase the size of the pool directly by
specifying a pool size using the -qsf.pool_size variable in the same
file (this line will usually have to be added to the file). To find
out the current pool size:
SET TRACE POINT QS501
After making the necessary changes, shut down and restart the server.
One suggestion seen on the net is to simply double the pool size;
in the absence of any better advice that suggestion is repeated here.
Note that increasing the size of the pool may not solve the problem, or
not for long anyway. Objects in the pool require contiguous chunks of
space. The pool may have enough total free space, but it may be so
fragmented that no one region is big enough. If enlarging the pool
size provides no lasting relief, there are three possible courses of
action: (i) review and simplify your searches if they are hand coded;
(ii) SET TRACE POINT QS506 to clear the pool completely, or (iii) start
another server, de-register the first one, and register the new one.
Breaking up a complex search with lots of 'ORs' into unions may help.
The rundbms.opt file and its contents are described in the Installation
and Operations manual. The behaviour of the QSF pool is described in
more detail in Advisor note US-16503.
| 09.018 How can I assign particular jobs to particular servers?
The goal here is to have two or more database servers eg: 'LIVE_SERVER'
and 'REPORT_SERVER' running and to be able to select one or the other
when connecting to the database, eg:
sql report_database/REPORT_SERVER < report.sql &
sql live_database/LIVE_SERVER < live.sql &
The REPORT_SERVER could be running at a lower process priority than the
LIVE_SERVER (NB not a good idea to do this on the SAME database).
Existing server types exist in the following file:
II_SYSTEM/ingres/files/name/iiname.all (Unix)
II_SYSTEM:[ingres.files.name]iiname.all (VMS)
It contains something like:
INGRES local transient
COMSVR local transient
STAR local transient
NODE global
LOGIN global
LTICKET local
RTICKET local
To add your own server type add the lines:
LIVE_SERVER local transient
REPORT_SERVER local transient
Servers must be registrated with the name server manually, eg:
$ runrundbms rundbms_noname.opt
Checking INGRES installation environment...
INGRES installation is setup correctly
Starting a DBMS server (iidbms) ...
II_DBMS_SERVER = 2264
$ iinamu add REPORT_SERVER * 2264
It is possible to automate this with some judicious shell/DCL
programming. After this it will be possible to connect to the new
server as described above.
This has the distinct advantage over using II_DBMS_SERVER that the name
server is not bypassed, and so connections to remote hosts are
possible.
OpenINGRES supports the manipulation of server classes through the new
CBF (Configuration By Forms) and no manual jiggerypokery is required.
| 09.019 Should I set II_DMFRCP_STOP_ON_INCONS_DB?
|
| [This environment variable is apparently documented only in some
| release notes for some platforms, although it is thought that this
| feature is supported by all versions of OpenIngres. The following is a
| posting taken nearly verbatim from comp.databases.ingres, explaining
| the purpose of this environment variable. If your release notes do not
| describe it then obviously you use it AT YOUR OWN PERIL. --Roy Hann]
|
| [The] recovery algorithms are predicated on the notion that at any point
| the RCP can be asked to step in and recover either a single transaction
| or all transactions for a failed server. For example, if a server runs
| out of resources or otherwise fails to recover a transaction, it can
| ask the RCP to take over the transaction (this is known as a "pass
| abort"). If the RCP fails to recover a transaction, it has nowhere
| else to go for help: it is the court of last resort. If the RCP
| encounters errors performing recovery, it marks the affected
| database(s) inconsistent. Once a database has been marked
| inconsistent, recovery from a checkpoint is necessary to ensure data
| integrity.
|
| Therefore it is critically important that we ensure that the RCP has
| sufficient resources to be able to abort any transaction at any time
| and to be able to recover all transactions for a server at any time.
|
| In general, very few additional locking system resources are needed
| during recovery, due to the effects of some of the Ingres recovery
| protocols. Certain rare situations exist where many locks are required
| to perform recovery. One such is UNDO recovery of a transaction which
| has deleted rows in a btree table with overflow chains on the leaf
| pages.
|
| Currently, the locking system cannot guarantee that resources will be
| available for the RCP during recovery. In the case of a pass abort, it
| is possible for the RCP to deadlock with other transactions running in
| the server. Either of these conditions can elicit a variety of error
| messages, depending on the state of the RCP when the condition
| manifests itself. The problem at Qantek seems to have been a failed
| pass abort.
|
| When a transaction is selected for UNDO recovery, it by definition has
| not committed, and so it still holds all the normal transaction page
| locks for data pages which the transaction updated. Since Before Image
| recovery operates by replacing data pages with their before images from
| the log, the data pages which are updated by Before Image recovery are
| still locked by the transaction. Thus no new lock resources are needed
| to restore data pages from their before images. The problem arises
| when processing a pass abort which involves changes to btree leaf and
| index pages. If the pass abort happened when the lock list was very
| nearly full, the additional locks required to recover the leaf and
| index pages may not be available. In fact, if the btree table has a
| highly duplicative key, an arbitrary number of locks may be required to
| lock the leaf page overflow chain. The attempt to escalate to a table
| level lock may result in deadlock with transactions still running in
| the server. Deadlock is also possible when attempting to lock the leaf
| or index pages, even if sufficient locks are available. Any of these
| situations will result in the database being marked inconsistent,
| necessitating recovery from a checkpoint.
|
| Recovery from checkpoint may not be acceptable in all situations, so an
| alternate processing scheme which forces the system to shut down rather
| than mark a database inconsistent is provided. To use this alternate
| processing scheme, the INGRES environment variable
| II_DMFRCP_STOP_ON_INCONS_DB must be set to "YES" with the ingsetenv
| utiltiy. When INGRES shuts down, the open databases are left in a
| state which will require the RCP to operate in REDO mode on restart.
|
| When a transaction is selected for REDO recovery, the database
| requiring REDO recovery is taken offline and no access is allowed to
| the database except by the RCP (or CSP in the cluster node failure
| case). REDO recovery takes advantage of this by forgoing normal
| database, table, and page locking during REDO recovery. This
| dramatically reduces the locking resources required to process any
| transactions which must be REDOne or UNDOne. If the locking system has
| been underconfigured, it is possible to reconfigure it before
| restarting INGRES.
|
| With II_DMFRCP_STOP_ON_INCONS_DB set to "YES", almost all conditions
| which would normally result in a database being marked inconsistent can
| be handled without rolling forward from a checkpoint. Since the RCP is
| started before the DBMS servers, it has an opportunity to clean up the
| open databases without risk of lock conflict.
|
| Shutting down INGRES is a drastic measure. It should be avoided, but
| in this case the alternative is worse. The best that can be done is to
| minimize the frequency. To do this, avoid lock escalation. Design
| applications so that table level locks, if required, are taken
| initially, rather than after some number of pages of the table have
| been locked. In particular, avoid escalations due to running out of
| configured locks per transaction. Either configure the INGRES locking
| system with enough locks per transaction to meet the needs of the
| application, or modify the application to require fewer locks. Highly
| duplicative keys should also be avoided.
|
|
|
| 09.020 How do I recover after a fire/flood in the machine room?
|
| 1) Regularly take a valid checkpoint (on or off line) on your
| production machine. Do this checkpoint to either tape or disk, but
| copy it to tape so that it can be stored off-site. When disaster
| strikes call tech support. They will talk you through step 2 and up.
|
| 2) Make sure your replacement system has a database by the same name
| with the same locations and disk paths.
|
| 3) Shutdown Ingres on the replacement box.
|
| 4) Wipe out ALL the data for the replacement machine's default database
| directory.
|
| 5) Copy the destroyed database's aaaaaaaa.cnf file from the checkpoint
| tape to the default database location on the replacement system.
|
| 6) Make the jnl and dmp directories on the replacement box identical to
| the destroyed machine.
|
| 7) Bring Ingres up on the replacement box.
|
| 8) Use "rollforward" with or without journals to "recover" the database
| from the checkpoint.
|
| The only thing to worry about is users, groups, and roles, that are
| stored in the iidbdb.
|
|
|
| SECTION 10 -- QUEL
|
10.001 What is QUEL?
QUEL is the original INGRES DML, now supplanted by SQL for commercial
reasons. There is a small number of very well regarded authorities,
| as well as long-time Ingres users who believe that QUEL is superior
| to SQL.
QUEL is available as part of the INGRES base system. The interfaces
are `quel' (a terminal monitor equivalent and similar to `sql') and
`iquel' (similar to `isql'). Report Writer is able to determine
automatically whether SQL or QUEL is used in the .QUERY section.
The embedded pre-processor is `eqc' for C.
QUEL is based on the relational calculus; SQL is based on the
relational algebra. There are many operations that are straight forward
in QUEL that are not readily reproduced in SQL.
Although it is de-emphasized, QUEL _IS_ supported and Computer Associates
has not yet announced that it will be dropped.
10.002 How different is QUEL from SQL?
VERY different, although in embedded applications, where the two DMLs
are used only for the basic operations of fetching, updating and
inserting, the differences are not very apparent. A few of the
important differences in embedded applications are:
(1) In EQUEL the INGRES identifiers are flagged (viz #part_no =
part_no), while ESQL the host-language identifiers are
flagged (viz part_no = :part_no).
(3) QUEL allows range variables (analogous to SQL correlated table
names) to remain defined between statements. A range variable
declaration need not appear in the source code anywhere near
the reference to the range variable.
(4) The EQUEL `APPEND' statement (analogous to SQL `INSERT') insists
that column be identified by name--columns cannot be addressed by
position.
(5) EQUEL allows the WHERE clause to be defined dynamically, without
recourse to a "dynamic" EQUEL.
As well, some of the other difference that apply to both the embedded
and non-embedded version of QUEL, but which are perhaps of great
importance when converting an application to SQL are:
(1) Some of the more exotic QUEL access controls are not imposed on
SQL accessors--this creates a potential security breach.
(2) Outwardly identical SQL and QUEL views can produce different
results because of semantic differences. (QUEL implements
views so that they act like modifications to the WHERE clause, SQL
implements them so that they act like virtual tables--with
duplicates permitted.)
(3) QUEL auto-commits by default; multi-statement transactions
must be explicitly encapsulated between a BEGIN TRANSACTION
and an END TRANSACTION or an ABORT.
In non-embedded uses, such as `iquel' and Report Writer, the differences
can be very great. A future version of this FAQ may deal with this more
thoroughly.
10.003 Should I learn QUEL?
| Users of OpenIngres have the choice, but QUEL is the only DML available
to users of University Ingres.
If the need arises, QUEL is certainly easy to learn. It is more
regular and orthogonal than SQL. However, mastery of the more subtle
features of QUEL (such as aggregate functions) requires considerable
sophistication.
QUEL may be useful within Report Writer where its capabilities can
allow certain reports to be defined very concisely, particularly those
that require aggregation over many different columns and particularly
those that require aggregation over a function of a column. There are
many operations that can be expressed concisely and non-procedurally
that have no equivalent concise or non-procedural expression in SQL.
Unfortunately, in spite of its manifest superiority to SQL, QUEL is
unique to Ingres now. Proficiency in QUEL may be satisfying
personally, but it will not be transferable to other systems. QUEL is
not under active development any longer, therefore it is not able to
access the user defined datatypes that can be created using the Object
Management Extension. Any reports or applications developed using QUEL
may be hard to maintain in future.
Employers would probably counsel against learning QUEL, academics would
probably argue the opposite.
10.004 Should I convert my QUEL to SQL?
The answer to this question will depend on circumstances. The best
answer that can be offered is a list of the pros and cons of
conversion.
The implicit reason for wanting to do this will usually be
a desire to be able to hire SQL programmers off the street, or
| to take advantage of recent Ingres enhancements that are available
only in SQL. The advantage of being able to hire SQL programmers
| off the street is probably deceptive. SQL as such constitutes less
than 3% of the source code (by one estimate), so familiarity with
| Ingres' forms run-time system and Ingres utilities will always be
the main obstacle to recruiting experienced programmers.
| Wanting to take advantage of new Ingres facilities is a compelling
reason to convert to SQL.
In embedded applications, the conversion of QUEL to SQL is fairly
mechanical, and can probably be undertaken at minimal cost. If
necessary it is possible to do the conversion piecemeal, mixing SQL and
QUEL in the same application. See Advisor note US_13270 for details.
In the case of Report Writer, the conversion will in general be much
more difficult. It is possible to do some very sophisticated data
reduction in QUEL, and if a report makes use of some of the more
powerful capabilities of QUEL, conversion to SQL may well be so painful
that it should be avoided if at all possible. If it cannot be avoided,
plan to spend a long time on the conversion and on testing. It is not
unknown for a relatively modest report of under a 100 lines of code
using QUEL to balloon to over 2000 lines of code when switching to
SQL.
10.005 Are there any utilities for converting QUEL to SQL?
Q2 is a commercial QUEL to SQL converter which automatically converts a
high percentage of QUEL to SQL, and identifies and isolates the
remainder. It is available through Common Sense Computing, who offer a
trial service which allows you to e-mail or send sample QUEL programs
for conversion so you can judge for yourself the effectiveness of the
conversion. Contact details for Common Sense Computing are given in
section 01.017 of this document.
| SECTION 12 -- REPORT WRITER
|
12.001 How can I put ASCII TABs in a report?
There is no easy way to do this. The first way that springs to mind is
simply to print literal TABs enclosed by quotes. However the Report
Writer replaces TABs (and all other carriage control characters (BS,
LF, VT, FF, CR) with spaces so this doesn't work. For the same reason,
neither does assigning the TAB to a variable and using the variable
instead.
The next way that comes to mind is to try:
.QUERY select tab = char(x'09') , x , y , ...
...
.HEADER REPORT
.FORMAT tab(q0)
...
.DETAIL
.PLN x,tab,y,...
But this doesn't work either (although it should; executing the select
statement alone in `isql' shows that it is returning the expected TAB
character). In this case the Report Writer lexical analyzer seems to be
defective--setting printqry shows that it is not interpreting x'09'
properly.
Another possible solution is to create a table with one row and one
column, containing the TAB. This can be selected in the report, but
(as documented) all of the normal formats (c, cf, cj and t) translate
the TAB on output in an unwanted way. The q0 format just doesn't
work--the TAB character disappears.
In the end, the best solution that some of the most inventive
contributors to comp.databases.ingres have come up with is to just
print some unusual character (one which doesn't occur in the data or
the trim) and convert it to a TAB with some kind of output filter.
Ghastly, but there it is.
In fact this may not be as awful as it seems. In a real printed report
it is almost never necessary to use TABs; some number of spaces is
better, and Report Writer does that well. Generally when this question
comes up it is from someone who wants to write a TAB delimited file to
be imported by a PC or Macintosh application. In this case the `copy'
command is a more appropriate tool and it can be directed to delimit
fields with TABs (or anything else) very easily. See 08.026 above.
12.002 How do I put escape characters in a report?
The `q0' format allows you to insert characters in a report without
changing the value of `position_number' (ie: so that the string
logically uses 0 space). This allows arbitrary variable length
strings to be inserted at any point without disturbing the regular
appearance of the report with unnecessary line-breaks and wrap-arounds,
provided that the output device consumes the additional characters.
Example:
.PLN '^[&34p'(q0),string_var
.PLN string_var
will print string_var in the same physical position on both lines if
^[&34p is meaningful to the output device.
12.003 How can I number pages as "Page n of m"
There is no way to do this within Report Writer. The only thing
to do is write a two-pass output filter to count the number of pages
in the report and fix it up afterward. To simplify this process it
would be advisable to have Report Writer number the pages with a
distinctive series of place-holder characters (eg #XX#) to search for
and replace. For example:
.FOOTER PAGE
.CE .PR 'Page ', page_number(i4), ' of #XX#'
12.004 How do I submit a report to run at a given time?
| There is no Ingres facility for job control when running reports. The
"call report" statement executes the report immediately and the user is
forced to wait until it completes. The normal work-around for this is
to use the "call system" command instead and execute the appropriate
operating system command to submit the job to a batch queue. The
syntax of such a command is operating system specific and therefore
beyond the scope of this FAQ.
Some users have written report dispatchers that can be used to run
reports both asynchronously and at specific times.
| SECTION 14 -- ABF
|
14.002 What causes C compilation errors while building an ABF image?
Check that the CFLAGS environment variable is not set to cause the
compiler to reject non-ANSI C. See question 20.001 for a further
explanation.
| SECTION 16 -- OpenROAD/Windows4GL/W4GL
| 16.001 Why is OpenROAD so slow to react to database events?
| OpenROAD polls for database events at a rate defined by
|
SessionObject.DBEventPollrate
which is set at 30 seconds by default. Some users recommend
setting this to as little as 1 or 2 seconds. See the "Language
| Reference Manual for OpenROAD" for further information.
16.002 How can I force a window to stay visible on top?
| This is possible in OpenROAD 3.0 by defining the frame to be a "popup", but
not in versions prior to that. It is a hugely irritating problem for
users of older versions of W4GL.
For older versions of W4GL there are a couple of workarounds that have
been suggested--all fairly hacky. David Tondreau recommends having a
frame send itself a user event at short intervals, with an event
handler that brings the window back to the top.
| 16.003 Is anyone working on an OpenROAD/W4GL FAQ?
|
| Yes. Pat McGibbon is working on one over in the UK, and it is almost
| ready as of this writing.
|
| When it is publicly available, it should either be directly available
| on the NAIUA web site (www.naiua.org) or there will be a link over
| to the OpenROAD FAQ.
|
|
|
| 16.004 How easily can I use the OpenROAD-Oracle driver?
|
| The release notes suggest that the driver works well and there are no
| major bugs to be aware of. Several early adopters agree that this is
| substantially true. However, a few points should be considered before
| agreeing to convert a major Ingres-based application to run on top of
| Oracle (or any other non-Ingres RDBMS) using the non-Ingres drivers.
|
| The OpenROAD-Oracle driver only works with OpenROAD. If the
| application includes Report Writer reports, ABF applications, or
| components written in a 3GL with embedded SQL, they will not be able
| to exploit the OpenROAD Oracle driver, and they will have to be
| rewritten (pretty much from scratch) or you will have to use an Oracle
| gateway (which will only get you started).
|
| Unless you adhered rigidly to the OpenSQL standard when writing the
| OpenROAD application for Ingres (highly unlikely), you must review all
| the SQL code in the application and expect to replace all the
| Ingres-only extensions you have used. (You may be surprised at how
| many you do use.) Fortunately SELECT loops WILL work with Oracle--you
| will not be reduced to using cursors everywhere instead of SELECT loops.
|
| The Oracle optimizer is getting better (so I am told), but it is not as
| good as Ingres at distilling the logical essence out of all the
| equivalent ways of expressing the same query. SQL which works well
| with Ingres may need to be rewritten to suit Oracle's delicate
| stomach, and much trial-and-error may be required to find just the
| right formula.
|
| It boils down to this: the Oracle driver is there to allow Oracle users
| to buy and use OpenROAD, it is not there to help Ingres users defect to
| Oracle and you will have a big job on your hands if you try.
|
|
|
| 16.005 Where can I get more information about OpenROAD?
|
| One source is at Computer Associate's web site. You will find information
| on OpenROAD at the following URL:
|
| http://www.cai.com/products/or.htm
|
| If you want more information, the page includes a form which you can use
| to have CA send you material or contact you.
|
| There is also an OpenROAD Special Interest Group which has been organized
| for OpenROAD users. It is currently headed by Elena Yatzeck of GSB
| Computing Services, University of Chicago. You can contact Elena at the
| following email address: emy@gsbpop.uchicago.edu
|
| A very valuable resource that the OpenROAD SIG started up is a mailing list
| exclusively devoted to OpenROAD issues. This list is managed by the
| Majordomo program. If you would like to subscribe, send an email message
| to the following address:
|
| Majordomo@gsbpop.uchicago.edu
|
| Leave your "subject" line empty, and in the body of your message enter the
| following command:
|
| subscribe openroad-users [address]
|
| This will subscribe yourself at the address you sent the message from,
| or you can specify an email address. If the message is successfully
| received and processed, you will receive a welcome message which includes
| more details on how to utilize the mailing list, and how to unsubscribe
| if necessary. If you have any questions or problems, you can contact the
| list owner at: Majordomo-Owner@gsbpop.uchicago.edu
|
| The OpenROAD SIG, in cooperation with the NAIUA, maintains a Web page that
| includes info on the latest status of OpenROAD, and access to a few utilities.
| The URL of this page is:
|
| http://www.naiua.org/open_road.html
|
| Another source of information should be coming soon. The OpenROAD FAQ,
| mentioned in section 16.003, is expected to be available in a few short
| weeks. Once released, you should be able to access it from the OpenROAD
| web page listed just above (or possibly from the FAQ web page, which is
| at www.naiua.org/faqs.html).
|
|
| SECTION 18 -- NET
|
18.001 What do I do if I can't connect?
This is the question every NET DBA dreads. There can be so many reasons.
First, try a remote login to the server system. If this fails then the
problem is in the underlying communications.
Some other things to check:
o Are the communications servers running on the client system?
o Did they get a successful listen on the protocol you want to use?
Check in errlog.log in the INGRES client installation.
o Are the authorisation details for the user correct in netu?
o Has the password been changed on the remote user? Then you must
update the netu information to match.
o Has the remote user got a password? NET insists on passwords.
Remember a password of 'return' is not the same as no password.
o Are the vnode details correct in netu?
o Has the user got a private vnode of the same name as a global one?
This will be used, the global one is 'hidden' from the user.
o If there is any doubt about any of the netu information, delete and
re-enter it. Note that netu accepts unprintable characters but
won't display them when you 'show' details.
o Are the communications servers running on the server system?
o Did they get a successful listen on the protocol you want to use?
Check in errlog.log in the INGRES server installation.
o Is the 'ingvalidpw' program correctly installed on the server
system?
o Are the listen details in the iirungcc.opt file correct? They must
match the netu information on the client system.
If you can't work it out turn on the NET diagnostics at both the client
and server systems. Set II_GCCxx_LOGLVL to a higher value, see the NET
User's and Administrator's Guide for details. You need to restart the
communications servers for this to take effect.
At least this will tell you how far the connect request got. You should
be able to work out if it left the client and if it arrived at the
server. This will usually isolate the problem to either the client
system or the server system.
If it looks like the communications server on the client sent it OK,
but it never arrived at the remote communications server, you are going
to need help from a network person. Plan on working late.
18.002 How do I configure NET?
There are 2 ends to think about: the client end and the server end.
The tools are the `mkrungcc' script at the server end, and the `netu'
utility at the client end.
At the server end, you have to set up information for the NET
comminication servers using the mkrungcc script. This asks a lot of
questions and encodes the answers in the file iirungcc.opt in
$II_SYSTEM/ingres/files. It also sets up some INGRES environment
variables at the installation level.
Using mkrungcc you set up things like: (i) the number of communication
server processes; (ii) which protocol(s) each will use; (iii) the
listen addresses for each server and protocol, and (iv) the number of
inbound and outbound connections per server. When this has been done,
iistartup will automatically use these details to start your
communication servers at startup time. To change the details just run
mkrungcc again and the new details will be picked up at the next
restart.
At the client end, you also need to set up information using the
mkrungcc script since you need communication servers at both ends. An
annoying feature with the later versions of NET is that a communication
server won't let you make outgoing connections unless it can set up a
successful listen for incoming connections. So if you have a system
where it's used purely as a client and nothing else--where there are
never any incoming connections--you still need functional listen
addresses for the communication servers to use. If a listen fails then
the communication server `blacks' that protocol and won't allow
outgoing connections on it.
Assuming you have the communication servers running on the client
system, you also need to set up client information using the netu
utility. This is a command line question-and-answer tool. You set up
2 kinds of information in netu: (i) vnodes and (ii) authorisations.
The netu information is stored away in $II_SYSTEM/ingres/files/name and
changes should be visible right away. You don't need to do a restart.
"vnodes" are virtual names for target server systems, and the vnode
data you are asked for includes: (i) the real node name of the target
machinel (ii) the protocol to get there, and (iii) the communication
server listen address to aim for. The vnode name is what goes on the
command line to tell INGRES the database is remote, e.g.:
$ isql gnu::mydb
Vnodes can be global or private, commonly the DBA sets up global vnodes
which everyone uses. In theory users could set up their own private
vnodes if they didn't like the global ones but they usually don't
bother.
Authorisations are the information used to actually log you in on the
server system: (i) user name on the target system and (ii) password for
that user. These can also be global or private. Global authorisations
are only useful if everyone wants to be seen as the same user on the
target system, not often the case. Users need to set up their own
private authorisations or (more likely) the DBA does it for them.
The netu utility has an poor method of error reporting. Look out for
the message: `0 rows changed'. This means it didn't do anything and
it isn't going to tell you why.
Hint: set up global vnodes and private authorisations. This is the
only way that makes any sense 99% of the time.
18.003 What is the 'ingvalidpw' program for?
The communications server needs to get at your Unix password
information. On some Unix variants this is not so easy, the encrypted
passwords are stored in the protected file /etc/shadow which only
superuser can read.
The ingvalidpw program does this. It is installed with `setuid root' so
it can read the shadow file. The name server then uses it to validate
username/password combinations for incoming connection requests.
18.004 How can I restart NET without restarting INGRES?
It can be a nuisance to do a full restart of INGRES just to pick up a
minor change to the NET configuration.
Use the iirungcc utility. If there are communications servers running
this will ask if you want to shut them down, then it will start up the
communications servers again using the new configuration.
18.005 How can I shut down the communications servers?
They get shut down automatically by the iishutdown script.
If you need to shut them down manually, use iinamu to get a list of
communications servers like this:
$ iinamu
> show comsvr
> quit
Then use netu to shut down each communications server using the
server_id numbers listed by iinamu.
18.006 Which INGRES processes do I need on a client system?
If you are using a system purely as an INGRES client, and never want to
create or access local databases, then you don't need a full INGRES
service running. You only need a name server and communications
server(s).
One way to do this is to install using iibuild -c. Then iistartup will
only start the processes you need. Alternatively:
$ iirungcn; iirungcc
Whichever way you do it, you save a lot of startup time and main memory
as you don't need DBMS, archiver, or recovery processes. This makes
room for lots more users on the client.
18.007 How do I configure different protocols?
The mkrungcc script tries to figure out which protocols are available
when you run it. For each available one it prompts for server listen
information.
Sometimes it needs a little encouragement. If it doesn't prompt when a
protocol is clearly available and should be supported, you'll have to
tinker with the script a bit. On Unix it may use the pkginfo
command to probe for the presence of OSI and X.25, but if the package
names are slightly different than when the script was written it will
get confused.
A single communications server can listen on multiple protocols. You
don't need a server for each protocol unless you particularly want to
do it that way.
18.008 What is the address and listen information in netu?
This depends on the protocol. Some examples:
For TCP/IP, the address is usually the node name of the target system
as in /etc/hosts (or equivalent). The listen information is used to
calculate port numbers to use. It must match the listen information set
up with mkrungcc on the target system.
For OSI, the address is a communications initiator path set up using
your communications configurer. This will also contain TSAP numbers, so
the listen information in netu is not used. You can set it to
anything.
With DECnet, the address is either a DECnet address or the name of
a node in the NCP database. The listen address is the name of the
network object in the remote node's NCP database, usually II_GCC_0. The
remote machine will translate this object name into a process id and
form a logical link between the two GCC servers. Whereas all
Unix installations have a 2 character code for II_INSTALLATION (see
below) on VMS this only occurs when more than one instance of Ingres
is installed on a machine. Normally the installation code is left
blank. To connect to a different installation the listen address should
be II_GCCxx_0 where xx is the installation code. It is also possible
(but usually unnecessary) to have more than one GCC server, in which
case the listen address is II_GCC_n where n=0,1...
Other protocols do it differently. Check in the NET User's and
Administrator's Guide.
18.009 How does NET figure out its TCP port numbers?
When NET is using the TCP/IP protocol, it uses the listen information
to work out a port number for the communications server to listen on.
The listen information is in the form 'ab' or 'abN', a 2-character
identifier followed optionally by a number. When you give this to
mkrungcc, it's put through an algorithm to generate a unique port
number. When you give it to netu it's put through the same algorithm,
so the client can figure out the TCP port numbers on the target
system.
There's usually no good reason not to use the default, which is the
2-character INGRES installation id with a number on the end for multiple
communications servers.
Note: you can also give numeric TCP port numbers directly and bypass
this mechanism.
18.010 Can I have 2 installations running NET on the same system?
Yes, provided you use different listen information. How to do this
depends on the protocol.
For TCP/IP you can use listen information based on the unique
2-character INGRES installation ID. This guarantees unique port
numbers for the communications servers in each installation.
For OSI you need to use different TSAP numbers in the communications
responder paths for the 2 different installations.
For DECnet specify the listen address as the name of the DECnet object
as described in 18.008 above.
For other protocols the principle is the same. See the NET User's and
Administrator's Guide for details.
At the client end you need to tell netu about the different listen
information, e.g. for TCP/IP:
vnode protocol address listen
gnu_test tcp_ip gnu xx
gnu_prod tcp_ip gnu yy
Or for OSI:
vnode protocol address listen
gnu_test iso_oslan gnutest notused
gnu_prod iso_oslan gnuprod notused
In this case the 2 communications initiator paths 'gnutest' and
'gnuprod' contain the TSAP numbers of the different INGRES
installations on the remote server system.
18.011 How can I use different protocol routes to access the same server?
Suppose a client and a server are connected by both TCP and OSI, which
is not that uncommon in some environments. How do you tell NET which
to use for your connection?
Actually this is quite easy. Just set up 2 global vnodes, e.g.:
vnode protocol address listen
gnu_tcp tcp_ip gnu II gnu_osi
iso_oslan gnupath notused
Then you can choose which protocol route by using the appropriate
vnode:
$ isql gnu_tcp::mydb # goes via TCP/IP route
Or: $ isql gnu_osi::mydb # goes via OSI route
18.012 Can NET use all of my LAN boards?
It's common for larger systems to have several LAN boards, and each of
these will have its own network address. Can NET handle this?
This isn't too difficult. The netu utility has a 'merge' option for
vnodes to cater for this. It allows you to give additional network
addresses for a vnode. These are used in a round-robin fashion as
connections are made by the client, which spreads the connections
evenly across the communications boards on the remote server system.
E.g. for TCP/IP:
vnode protocol address listen
gnu tcp_ip gnu1 II
gnu tcp_ip gnu2 II
In this case gnu1 and gnu2 are entries in /etc/hosts (or equivalent)
which contain the different Internet addresses for the remote server.
Or for OSI:
vnode protocol address listen
gnu iso_oslan gnupath1 notused
gnu iso_oslan gnupath2 notused
In this case gnupath1 and gnupath2 are 2 communications initiator paths
set up with the communications configurer, they contain 2 different
network addresses for the remote server.
18.013 Can I use NET over a LAN bridge?
Yes, no problem.
But watch out for performance. LAN bridges typically run at speeds like
64 kbaud, which is a whole lot slower than the LANs at either end. They
can become a bottleneck as the traffic levels rise.
18.014 What about NET over WANs?
NET supports X.25 on some ports. This allows WAN connection over
long-haul X.25 networks.
However you must consider whether you really want to run NET traffic
over a slow network. NET was designed for LANs where message size is
not an issue. And each SQL interaction will pick up multiple network
turnrounds. In practice it is very, very hard to get reasonable
performance. (Don't even think about 9600 baud lines.)
If you want to do this, accept that the whole application design has to
be geared around the network bandwidth. Reasonable response times
dictate 1-2 SQLs only in many cases. You may also be forced into
(possibly nasty) compromises: shorter table and column names, heavy use
of database procedures, shorter names for these and their parameters,
all queries made repeat. Anything to cut down the network load.
18.015 What if I change my password on my NET server username?
This password is also known to netu on each client that connects via
NET to that server. It's stored in the local authorisations on each
client.
You have to go round the network and change the password on all the
clients too (assuming you can remember where they all are).
18.016 What do communication servers do?
When a communication server starts up, it gets its listen information
from the iirungcc.opt file in $II_SYSTEM/ingres/files. This has a line
for each communications server that gets started by the iirungcc
utility. It will look something like this:
II_GCC_TCP_IP=ab;export
II_GCC_TCP_IP II_GCC_TCP_IP=ab1;export
II_GCC_TCP_IP;II_GCC_ISO_OSLAN=gnu_ab;export II_GCC_ISO_OSLAN
This information starts 2 communications servers. Server 1 listens on
TCP/IP with a port number calculated from 'ab'. Server 2 listens on
TCP/IP with a port number calculated from 'ab1', and also on OSI using
the responder path 'gnu_ab'. This path has already been set up using
the communications configurer, and contains the TSAP numbers which are
used to listen on.
The main functions of a communications server are:
o It attempts a listen on each protocol defined by its line in
iirungcc.opt. The result is logged in errlog.log whether successful
or not. If a listen fails then the communications server won't let
you use that protocol for outgoing connections as well.
o It listens for incoming connection requests from the network. When
one arrives passes it's passed to the name server for validation,
and then gets a local DBMS connection for it.
o It listens for outgoing connection requests from local client
processes for the network. When one arrives it gets a network
connection for it.
o Incoming messages from the network are converted from network
format to local data format, then forwarded to the corresponding
local DBMS connection.
o Outgoing messages for the network from local client processes are
converted from local data format to network format, then forwarded
to the corresponding network connection.
The communications server stays in the message path. On the client your
SQL is passed to the local communications server, which forwards it to
the remote communications server. This then forwards it to the DBMS
server. The results go back down the same route.
If the client and server systems have the same hardware format then the
data isn't converted to/from network format. Conversion is only done
for heterogenuous connections.
18.017 Will my applications run over NET unchanged?
Yes, the SQL will run across NET exactly as it runs locally. If the
client and server systems are the same type of hardware, and run the
same version of INGRES, you should not even need to recompile.
For a 4GL application use the -d flag to redirect the connection:
$ my4glapp -dgnu::mydb
You may have problems if you use a local filesystem from the application
Also check out things like hard-coded path names. Small differences in
the environment are another problem area.
If your application fires off background activities, you need to think
whether these are best run on the client or the server. Use something
like uux to start remote batch or reports. Most environments/protocols
will provide some kind of remote execution facility.
DBA things are usually better done on the server system. A number of
DBA-type functions won't run over NET, e.g. ckpdb.
18.018 Will my applications perform over NET unchanged?
If your application is very well designed and built, and the SQL
technique is good, then yes.
Unfortunately, many real world applications aren't like this. They
break the golden rules:
1. Omit Needless SQL
2. Only Get The Data You Need
The cost of extra SQL or fetching large data sets will slow down a
local application. Over NET it can make an application unusable. In
practice most applications need to be modified to get the right
performance over NET. The network changes the trade-off between design
and programming ease, and performance.
There are some kinds of things that are inherently unsuitable for NET:
o Heavy batch processing which brings a lot of data to the program
for processing. Run these on the database server system.
o Long reports which again must by their nature fetch large amounts
of data. Run these on the database server system and use remote
printing or file transfer to get the results to the right place.
o Database browsing where large data sets may be fetched. Impose
limits in the browsing function so this can't happen. Or initiate
a batch process on the database server system.
o Tablefields which bring back many rows to the client. Don't.
18.019 What's the GCA protocol?
This is the application-level dialogue rules for a conversation between
an INGRES client and server process. It's the same whether the
connection is local, or remote via NET.
It's not the same as a communications protocol. You still need TCP/IP
or OSI or whatever, GCA is a level above these and runs over them. They
are used to transport the GCA conversation.
In some ways it's not a compact protocol. For example: a simple SELECT
will cause 4 or 5 GCA messages to be exchanged. This might cause up to
10 network packets. You can start to see why careless SQL can cause
heavy NET traffic.
18.020 Does NET present any special security problems?
An INGRES/NET client stores the passwords needed to access a remote
system in a local encrypted file. It must decrypt the password to
transmit it to the server to authenticate access. It is therefore
conceivable that a sufficiently well informed and industrious
"intruder" could analyse the executable code and determine how to
decrypt the local password file.
Usually the effort and expertise required will be sufficient
discouragement, but if a system contains especially sensitive or
valuable data then it will naturally be attractive to precisely the
kind of people who have the skills and inclination to penetrate it.
Some precautions can be taken:
o The first precaution is to check that the local password
file on Unix clients is secured so that only `ingres' processes
can read it. If it is not, then the following will fix it:
chown ingres $II_SYSTEM/ingres/files/name
chmod 700 $II_SYSTEM/ingres/files/name
o If the user has no need to access the remote host by any
means other than NET then that user's login shell can be set to
something harmless like /etc/date. NET will still be able
to access the system but it will be impossible to actually
log in as that user.
o If the user DOES need to log into the remote system, assign the
user a separate ID to be used just with NET and give it an unusable
shell like /etc/date. Such additional IDs would not require a
home directory or other significant resources. The password of
just the NET ID would need to be stored on the client.
18.021 Can I run INGRES clients without NET?
There's an undocumented facility which may allow you to do this,
sometimes referred to as INGRES/LAN or direct connect.
You set II_DBMS_SERVER to the address of a remote DBMS server process:
$ II_DBMS_SERVER='gnu::1234'
$ export II_DBMS_SERVER
Now all INGRES connections from this shell will go to server id 1234 on
the remote server system with the TCP node name 'gnu'.
Performance will often be better as you are bypassing the NET
Communication Servers at both ends, reducing path lengths and process
switching.
It has a number of limitations. Some of these are:
o It only works with TCP/IP protocol, because it's a side-effect of
INGRES processes communicating via TCP loopback sockets.
o It probably only works for UNIX clients and servers.
o Since you bypass the NET Communication Servers you don't get data
format conversions. So both the client and server systems must have
the same hardware format: same byte order, same float format,
same char set, etc.
o You have to give the DBMS server port numbers directly, and these
change every time the server is reloaded or a new DBMS server
starts. You will need to set up a mechanism to propogate the
server ids to all the client systems.
o It follows that there's no load balancing since you bypass the
Name Server on the remote server system. You have to arrange
the mapping of client connections to DBMS server processes
yourself.
o This is an undocumented facility and it may cease to work at any
time in the future without any warning or apology from Computer
| Associates.
If you decide to use this for real work you'll need to check your
support status with your supplier's Technical Support.
------------------------ END OF PART 3 ------------------------------
| SECTION 20 -- EMBEDDED
|
20.001 What C compilers are supported?
The native C compiler of all the supported systems, as described in
section 01.008 above, plus Microsoft C (versions 5.1, 6.0a and 7.0)
| on the PC, and Whitesmiths on the VAX under VMS, though 6.4/05 will
| be the last release to support the Whitesmiths compiler according to
| the Release Notes Supplement, Release6.4/05 (vax.vms/02), 21-nov-94,
| p 2.
Note that building an executable within ABF, or by using "abfimage"
causes INGRES to convert the ABF source into C code which is then
compiled into an executable using the native C compiler. (This happens
even if the installation licence does not permit ESQL/C to be used.)
The C code that INGRES generates is K&R C, not ANSI C. Any compiler
options should, therefore, be set to not flag errors or warnings if
non-ANSI C is encountered, otherwise the ABF compilations will fail.
20.002 Can I use C++?
In the current release there is no SUPPORTED way to use C++. However
numerous people have done it, going to greater or lesser lengths.
The simplest approach, suggested by Holger Pampel, is to use the
following definitions for the INGRES library functions:
extern "C" {
int IItbinit (...);
int IItbact (...);
int IItbsetio (...);
void IItbsmode (...);
int IItscroll (...);
int IItdelrow (...);
void IItfill (...);
int IItcogetio (...);
void IItcoputio (...);
int IIdispfrm (...);
int IIrunform (...);
void IIforminit (...);
int IIchkfrm (...);
void IIendfrm (...);
void IIforms (...);
int IIfsetio (...);
void IIputfldio (...);
void IIgetfldio (...);
int IIactfld (...);
void IIredisp (...);
void IIresnext (...);
void IIclrscr (...);
void IIresfld (...);
void IIclrflds (...);
void IIendforms (...);
void IIprmptio (...);
void IIresmu (...);
int IIiqset (...);
void IIiqfsio (...);
void IIstfsio (...);
void IIfrshelp (...);
int IInfrskact (...);
int IIactscrl (...);
void IIutsys (...);
void IIcsOpen (...);
void IIcsQuery (...);
int IIcsRetrieve (...);
void IIcsERetrieve (...);
void IIcsERplace (...);
void IIcsGetio (...);
void IIcsClose (...);
int IIcsDaGet (...);
int IIretval (...);
void IIretinit (...);
int IInextget (...);
void IIgetdomio (...);
void IIputdomio (...);
void IIwritio (...);
void IIsyncup (...);
void IIxact (...);
void IIgetoper (...);
int IIinitmu (...);
int IInmuact (...);
int IInestmu (...);
int IIrunnest (...);
void IIendnest (...);
void IIrunmu (...);
int IImuonly (...);
int IIendmu (...);
void IIsqInit (...);
void IIsqConnect (...);
void IIsqDisconnect (...);
void IIsqStop (...);
void IIsqMods (...);
void IIsqFlush (...);
void IIsqPrint (...);
int IIsqPrepare (...);
void IIsqDescribe (...);
void IIsqExStmt (...);
int IIsqExImmed(...);
void IIFRgpcontrol (...);
void IIFRgpsetio (...);
int IIFRitIsTimeout (...);
int IIFRafActFld (...);
void IISmessage (...);
void IImessage (...);
void IITBceColEnd (...);
char * IILQint (...);
int IIsexec (...);
int IInexec (...);
int IIexExec (...);
int IIexDefine (...);
int IIerrtest (...);
int IIbreak (...);
int IIflush (...);
int IILQpriProcInit (...);
int IILQprsProcStatus (...);
int IIeqiqio (...);
int IILQprvProcValio (...);
int IILQsidSessID (...);
int IILQssSetSqlio (...);
void IILQisInqSqlio (...);
int IILQshSetHandler (...);
}
If this list is incomplete or new functions are encountered, it is
simple to add them; it appears the only two choices for type are
`void' and `int'.
| SECTION 21 -- DATABASE PROCEDURES
|
21.001 What are database procedures?
Database procedures are pieces of code that reside and execute within
the database server. There are two main advantages to this approach:
- common pieces of code can be shared among a number of applications
thereby ensuring that each application remains consistent with the
others
- transactions consisting of a number of SQL statements can be
batched up into a single database procedure called only once. This
provides a significant saving in inter-process communication
between the front- and back-ends. This saving is especially
noticeable in client-server applications where the network
delay is relatively large.
21.002 Database Procedures and QEP's
The QEP for a database procedure is calculated whenever the procedure
is loaded into the database server's cache. This happens either when the
procedure is first created or when it is first executed by a user after
having been flushed out of the cache, which can happen through lack of
use or the server having been shut down and restarted. Thereafter the
stored QEP is used for successive invocations of the same procedure by
both the original and other users.
The advantage of storing the QEP is that when most users come to
execute a database procedure the QEP has already been calculated so
the procedure starts to execute immediately. The effect is as if every
SQL statement within the procedure were "repeated". To facilitate
| this, Ingres allows five times longer than normal to calculate the
initial QEP before timing out to help ensure that the QEP used is
optimal.
The disadvantage is that the QEP does not take account of any
statistics that might have been gathered for tables referenced by the
| procedure. Ingres always uses the defaults, which are 1% of rows hit
for exact matches and 10% for range matches. Therefore the QEPs
generated may not be the best possible.
The best work-around for this is to try and design database procedures
to only use queries that join and restrict using key fields. This
gives the Query Optimizer less scope for getting it wrong.
21.003 Database Procedures and Locking
| Ingres uses the QEP to estimate how many rows any particular query
will affect. It is this estimated row count that is used to determine
what type of locks will be taken out when the query is actually
executed. The key words here are "QEP" and "estimated row count".
| If Ingres estimates (from the QEP) that an update will affect 10 or
| more pages in a table then it will automatically take out a table level
lock before starting to do the updates. It does this assuming that
starting with page level locks and then escalating will be a waste of
time, which is quite reasonable under normal circumstances.
The QEP for a database procedure is calculated when the procedure is
first created. If that procedure contains an update statement, that
| would affect more than 10 pages, then Ingres takes out a table level
lock as soon as the procedure starts to execute EVEN IF THE UPDATE
STATEMENT IS WITHIN AN IF..THEN BLOCK AND IS NEVER EXECUTED.
Indeed, even if the database procedure returns without performing any
database access at all the locks that might possibly be required are
| still taken out.
21.004 Can I flush out procedures without shutting down the server?
There are only two ways to flush database procedures out of the server
cache. The first is to shut the server down and the second is to drop
and re-create the database procedure. Neither of these are terribly
practical for a live system. However, it is possible to *refresh* a
database procedure.
| Database procedures are timestamped automatically by Ingres so that
it can tell whether or not they are out of date with respect to the
tables referenced within them. Thus if you modify one of these tables
| Ingres has to regenerate the QEP for the database procedure (because
you might have taken away an index column that it was relying on).
However you don't need to add or remove any columns to update the
timestamp of the table - just simply modify it to the same structure
as it was originally and this does the job.
The database procedure is marked as out of date and the next time that
a user tries to run the procedure it is reloaded into cache and a new
QEP generated.
21.005 Database Procedures and Security
Permission to run database procedures can be granted to individual
users by use of the SQL "grant" command. The advantage of doing this
is that it provides an additional level of security and database
integrity over that provided by granting access to tables alone.
A typical example is with a master-detail relationship. If inserts to
the detail table are denied to all users then they can only insert
rows via a specially written database procedure. This procedure can
ensure that a master record exists before allowing a detail record to
be inserted thereby ensuring referential integrity.
Note that this example is slightly contrived because the same could be
| achieved more flexibly by the use of a rule to invoke the database
procedure.
21.006 Database Procedures and Cacheing
| Ingres caches database procedures in the server on a least recently
used (LRU) basis. Thus if a user tries to run a database procedure and
there is no room for it in the cache then an "old" procedure is
cleared out to make room for it. Normally this is not a problem and is
generally an effective solution to the problem of finite cache space.
However it does mean that designers should avoid having one or two
very large database procedures as these will need to flush out a large
number of small procedures in order to make sufficient space
available. The effect of this is that the procedures flushed out are
not necessarily "least recenty used" but can in fact be frequently used.
The advantages of cacheing are therefore destroyed.
The solution is to code these large procedures into the application
rather than use database procedures. Ideally all database procedures
| would be roughly of the same size.
| SECTION 30 -- errlog.log
|
30.001 My error log is full of E_SC022F_BAD_GCA_READ. What's wrong?
| This error is logged whenever the connection between the Ingres
server and a front-end application is broken unexpectedly. Usually
this just means that the user terminated the application abruptly
without allowing it to disconnect first. Segmentation faults in the
application, pressing the BREAK key, and a host of other occurrences
can cause this. It is almost certainly benign--or is not a DBA problem
anyway.
The error "E_CLFE06_BS_WRITE_ERR Write to peer process failed" is
indicative of the same problem.
30.002 How can I trim errlog.log?
errlog.log can grow to enormous size quite quickly. To truncate it,
first shut down the servers, then
rm $II_SYSTEM/ingres/files/errlog.log
The file will be re-created with suitable permissions and ownership
| when Ingres is re-started.
To keep some recent history in the log (say 500 lines), shut down the
servers and then:
cd $II_SYSTEM/ingres/files
tail -500 errlog.log > /tmp/errlog.log
rm errlog.log
mv /tmp/errlog.log .
chown ingres errlog.log
chgrp ingres errlog.log
chmod u+rw,g+r,o+r errlog.log
No matter how you do it, it is HIGHLY inadvisable to truncate the
error log without first shutting down the servers.
| SECTION 90 -- INGRES ON UNIX (Solaris, AIX, OSF/1, etc.)
|
90.001 How can I un-nice iidbms (Ultrix)?
Once a process accumulates 10 minutes of user CPU time, Ultrix and
some other BSD derivatives will automatically "nice" that process
so that it executes at a deferred priority. Because iidbms is quite
intensive it tends to be "niced" pretty quickly. To overcome this,
give the process negative niceness (ie an elevated priority).
Giving iidbms a niceness of -1 will give it only a very slightly
elevated priority but its priority will never be lowered. iidms can
be given a niceness of -1 by user `root' with:
renice -1 -p
The execution priority of iidbms under Ultrix may in fact not be all
that important. The time delay required for any amount of disc I/O
will usually swamp any delay due to reduced execution priority.
| 90.002 Can Ingres make use of PrestoServe?
Yes it can. PrestoServe is a write-through disc cache built into some
models of DECSystem that can speed up write operations. It makes no
difference to read performance.
A word of warning though: if PrestoServe is enabled on ALL disc drives
| it will become a critical single-point-of-failure for Ingres because
writes to the journal file as well as to the database and to the
transaction log will be buffered. If PrestoServe fails in such a way
that it scribbles on the disc farm (and there is a precendent) all the
data written since the last checkpoint to TAPE may be lost, no matter
how you journal. It would be prudent to disable PrestoServe for at
least the drive where the journal files reside. Since the journal
file is written asynchronously there will be no performance penalty
for this.
90.003 What do the iislave processes do?
| The Ingres DBMS server processes work on behalf of many users. It must
be able to fire off an I/O request and then continue with other work,
picking up the I/O when it has finished. The DBMS server cannot afford
to block waiting for I/O requests to terminate. This is accomplished
under VMS through the SYS$QIO system service, which provides an
asynchronous I/O subsystem.
In UNIX there is no standard asynchronous I/O interface. A few vendors
| provide their own, but they are all different. Ingres must provide a
simulation of asynchronous I/O itself.
The iislave processes provide this simulation. All database I/O
requests are handed off to a pool of iislave processes. Their function
is to take an I/O request and block waiting for it to complete. This
allows the DBMS server to continue with other work while I/O requests
are processed.
Note: each DBMS server process has a separate pool of I/O slave
processes.
90.004 How many iislaves do I need?
| There is an Easy Answer: one per database disk. Like most Easy Answers,
there's more to it than that:
o A *busy* iislave spends 99%+ of it's time blocked waiting for I/O
requests to terminate. It has a finite throughput limit. So the
more I/O slaves, the higher your potential database I/O
throughput.
o On the other hand, the more iislaves you have then the more process
switching you incur. This can lower throughput, especially with
some RISC CPUs which don't tolerate high process switch rates very
well.
o The end result is that for any particular workload and hardware
configuration, there is an optimal number of iislave processes.
Fewer or more will reduce the throughput.
This model was tested by running an implementation of the TP1
benchmark, and establishing the optimum number of iislave processes by
measurement of different runs. Then the CPU board was replaced by a
faster model and the process repeated. No other changes were made.
The results showed clearly that the optimal number of iislave processes
was higher with the faster CPU. But how do you calculate the optimal
number for your workload and configuration? You just have to try it and
see...sorry!
To muddy the waters yet further, there also obscure occassions when you
can get better performance with no slaves at all! These would occur
when you have a single user performing a single task (such as a bulk
copy for example), in which case you can eliminate the interprocess
communication overhead by letting iidbms do its own I/O.
90.005 Why is a raw log file faster on UNIX?
On most flavours of UNIX a raw log file is recommended for better OLTP
performance.
There are some known reasons for this:
o UNIX will update the inode timestamp after each write to the log
file. This not only doubles the write activity, it introduces head
| movement for *every* write. With a big log file the average head
movement, and hence delay, can be large.
A raw log file does not incur *double writes* and so the disk
heads can sit on EOF (nearly) all the time. Writes can be very
fast with only a rotational delay and little or no head movement.
o The effect of log file traffic on the UNIX FS cache is disruptive.
The *flow-thru* nature of log file activity is a worst case for
the FS cache, pushing other things out to make way for log file
blocks which are never hit again.
A raw log file bypasses the UNIX FS cache completely and so avoids
disrupting cache discards.
Remember that the log file is your 'final limit' on OLTP throughput. An
I/O bottleneck on the database can be addressed by relocating tables or
using multi-location tables. An I/O bottleneck on the log file is
final.
There is no concept of a raw log file in VMS.
90.006 Should I stripe my raw log file on UNIX?
Probably not. There is little to be gained, even if your virtual disk
implementation allows it.
Almost all log file activity is writes to EOF. This is where the
bottleneck occurs. Using a striped disk would just switch the
bottleneck periodically from one device to another. There'd be very
little overlap, potentially only when the switches occurred.
This could look very confusing in your system activity stats. These
are usually averaged over a relatively long period, so it would appear
that the devices for the log file striped disk were sharing the load.
A true picture would only emerge if stats were obtained for very short
timeslices.
Note: some virtual disk packages have a special type of striping which
is designed for raw log situations, e.g. 'interleave' disk on the
Pyramid implementation. These guarantee that successive writes go to
different physical devices. These have the potential to increase log
file I/O throughput and may be worth experimenting with.
| 90.007 How do Ingres processes communicate on UNIX?
| Ingres inter-process communication (IPC) uses available O/S mechanisms
| in each environment. On UNIX, Ingres uses loopback sockets for IPC.
This is normally done using the TCP loopback device driver in the UNIX
kernel, although UNIX domain sockets are an alternative in some UNIX
environments.
| The Ingres client opens a socket when it connects to the DBMS server.
The DBMS server also opens a socket at its end. The pair of sockets
are connected together by the kernel, as they are opened with an
address which indicates *loopback*.
Because you are using TCP loopback sockets it follows that the TCP
| package must be installed to use Ingres. However, there's no need for
a LAN board as the sockets get looped back together at a higher level
in the kernel.
| Note: some of Ingres' own processes communicate through shared memory
and semaphores for speed: e.g. DBMS server and iislaves, DBMS server
and RCP.
| 90.008 How does Ingres maintain database integrity on UNIX?
It's well known that UNIX I/O is deferred: a successful write system
call just means that the data will be written to disk *sometime* when
| UNIX sees fit. As Ingres uses UNIX filestore files, how can it control
what is written to the database disks and when?
| Ingres uses a special flag on the open system call to do this.
Database files are always opened with the OSYNC flag, this forces all
writes to that file to be done synchronously. Now a successful write
system call means that the data is *definitely* on the disk.
| So Ingres can be sure what is written to the database and when, and
database integrity can be maintained.
90.009 Should I stripe my data locations on UNIX?
| It's not usually a good idea. Ingres provides multi-location tables
which are striped by the DBMS. In most situations these are the better
choice.
Another effect of striping your data locations is to make performance
analysis more difficult. It's often necessary to undo the striping to
isolate an I/O bottleneck to a particular table.
Note: if you do use disk striping, the information which defines the
striped disk becomes vital to the integrity of your database. If you
lose this the striped data locations are just meaningless bit
patterns. You need to back it up with as much care as the rest of your
data.
90.010 Where do I start looking with a Unix performance problem?
Let's assume this is a workload problem, rather than a particular
query. With those you can jump straight into QEP analysis.
This is a big subject, and the best we can do is give a few guidelines
that may help get you started.
The basic tool is the Unix system activity reporter, the sar utility.
The options on sar vary somewhat according to your flavour of Unix (and
in fact, sar does not exist in all flavours of Unix), but these are
pretty universal:
o The -u flag. This gives CPU usage, and also I/O delay. If %wio is
low and %idle is low or zero then the CPU is saturated. If %wio is
high for long periods (say >10%) then you have an I/O bottleneck
somewhere.
o The -d flag. This gives disk loading for each device. If %busy is
high for long periods (say >50%) then a disk may be saturated.
Also look at the disk balance, and think about disk controllers.
There are no direct activity stats for these, but try to work out
if there are too many busy disks on each controller.
The avwait and avq figures should pick out disks with slow service
times. This could be due to filesystem fragmentation, or bad disk
layouts with active spots far apart on the disk.
o The -wq flags. If %swpocc is non-zero or swpq-sz is non-zero then
swapping has occurred. Memory is oversubscribed, a serious sin on
a Unix system.
This should at least direct you to an area for further investigation.
In general you should sort out system resource problems before you
| start fiddling with QEPs or Ingres tuneables.
| After sar, the next step is often to look at Ingres logging and locking
using IPM.
90.011 Which filesystem type should I choose? (SVR4)
On SVR4 Unix the virtual filesystem concept gives you a choice of
filesystem types, typically: System 5 1/2 Kb, System 5 1 Kb, System 5 2
Kb, Berkeley UFS. Later SVR4 versions also have Veritas as supplied.
Experience has shown that the System 5 types are best avoided. They
suffer badly from free list fragmentation and require regular
maintenance to maintain performance. In you decide to use System 5, go
| for the 2 Kb blocksize which matches the Ingres page size.
Berkeley UFS is a good general purpose choice. They do not fragment
readily, and offer a range of tuning options to maximise filesystem
performance.
Veritas (VxFS) is a possible alternative. It does not suffer badly
from fragmentation and has an on-line defragmenter. It also offers
fast restart after a crash compared to the other types, and is more
resilient to power-off situations.
90.012 Will VxFS give me better performance? (SVR4)
VxFS offers a number of advantages over other filesystem types:
resilience, fast restart, on-line defragmenter. But as always, there
is a price to pay.
A VxFS filesystem has an intent log beside the inodes on the disk. It
| has a similar function to the Ingres log file: changes to the
filesystem are logged here before the change is applied for real. Only
structural changes are recorded in the intent log, e.g.:
o create/destroy directory
o create/destroy file
o add block(s) to a file
After a crash or power-off, the intent log is used to restore the
integrity of the filesystem structure. This avoids the lengthy fsck
checks needed for other filesystem types, giving a faster restart.
The disadvantage of the intent log is extra I/O and head movement.
Every structural change requires the disk heads to skip to the intent
log and write to it, then skip to the required position to do the
change. It's a double write with often a big head skip. If a
filesystem is volatile and has continual structural change, VxFS can
give poor performance.
It's not always obvious in an application when structural changes will
occur to the underlying filesystem:
o Use of temporary tables is an obvious case. It's probably best to
avoid VxFS for data locations which are used for temporary tables.
o Adding rows to the end of a table is less obvious. From time to
| time extra blocks have to be added to the underlying file. Ingres
does this synchronously, writing the changes through the page cache
to ensure EOF integrity. This will incur an extra cost with VxFS.
o Changing the primary key of some rows in a table is even less
| obvious. The rows are physically moved by Ingres, and extra blocks
| must be added to the underlying file. Again Ingres does this
synchronously to ensure data integrity. VxFS adds to this cost
with intent logging, causing doubled writes and a lot of head
movement.
o Changing the secondary key of some rows in a table will cause rows
to be moved in the secondary that is changed. Same as the previous
case.
You have to know your physical database well to forecast if an SQL will
result in structural change to the underlying filesystem. Such SQLs
will tend to perform poorly with VxFS, particularly in cases where a
lot of blocks have to be added synchronously. VxFS is not a 'magic
button' for performance!
It's good for: non-volatile filesystem with little structural change,
fast restart requirements, on-line filesystem maintenance. It's not so
good for: temporary tables, bulk load, anything volatile at the
structural filesystem level. It can be hard to predict if a particular
workload will run better on VxFS - without trying it to see.
Note: never use VxFS with intent logging enabled for things like /tmp,
mail partitions, II_TEMPORARY partition, etc.
| 90.013 What kernel resources does Ingres need? (SVR4)
| You must configure sufficient resources in the Kernel for Ingres.
Here is a summary of experience with SVR4 Kernel tuneables:
o Shared memory resources. The tuneable SHMMAX limits the size of a
shared memory segment. It must be set large enough for the size of
| your Ingres logging and logging segment. If you use a shared cache
then it must also be set large enough for this.
o Semaphore resources. The tuneables SEMMNS and SEMMSL limit the
maximum number of semaphores and the maximum semaphore set size.
| See the I & O Guide for details of how many semaphores your Ingres
service needs. There is a basic set, then a set per DBMS server.
The SEMMNS tuneable must be set large enough for the total.
Currently the DBMS server requests a set of 30 semaphores, for a
potential 30 I/O slaves. Even if you have the default 2 I/O
slaves, the server still asks for the full set of 30 semaphores.
The tuneable SEMMSL must be set large enough to allow this, the
default of 25 is not enough.
| o TCP resources. Since Ingres uses TCP loopback sockets for inter-
process communication, there must be enough for the number of users
to be supported. The name of the Kernel tuneable may be NTCP.
| Allow 2 sockets per Ingres user, or 3 per TCP/IP NET user. Add an
allowance for listen sockets and other overheads, and other users
of TCP/IP networking.
o Swap resources. On SVR4, swap space of 2 x memory is usually
enough. Allow a little more if you want to be extra safe.
The iistartup utility does a system resource check before actually
| starting the Ingres processes. It will usually refuse to continue if
there is a serious resource problem.
In this case you need to supply the resource, by changing the Kernel
tuneable as indicated above, and rebuilding the Kernel. This must be
followed by a system reload.
The exception is swap space, which can be added dynamically using the
/etc/swap command.
| 90.014 What process limits could affect Ingres? (SVR4)
The SVR4 Kernel provides a system of hard and soft limits on some of
the resources available to each process. The shell builtin command
ulimit (or limit/unlimit for csh) is used to set and display their
current values within the process.
| The process limits used for Ingres processes like the DBMS server are
inherited from the environment where the iistartup utility is run.
Here is a summary of experience with these limits:
| o The CPU time limit H/SCPULIM applies to all Ingres processes,
including the DBMS server process. It will need to be set to a
high value or 'unlimited' for server processes. These are shared
processes and do processing on behalf of many users.
| o The file size limit H/SFSZLIM applies to all Ingres files: table
files, journal files, dump files, disk checkpoint files, non-raw
log files. Set it high enough for the biggest table fragment, or
the biggest location in a disk checkpoint. It is not applied to
raw log files.
o The data heap size limit H/SDATLIM applies to the data structures
created at startup by a DBMS server in its own private data areas,
including the (non-shared) DMF page cache and the QSF memory pool.
For a large DBMS server with large connected_users value, or if you
configure a large non-shared DMF page cache, it can be necessary to
raise this limit.
o The open file descriptor limit H/SFNOLIM applies to all files opened
by a DBMS server process or by an I/O slave process. Don't confuse
the process file descriptor limit with the system limit on open
files. At SVR4 new system file table entries are allocated
dynamically; the system limit on open files is effectively
eliminated. (However, each filesystem may have its own tuneable
Kernel limits.)
Each connected user is a socket connection to the DBMS server pro-
cess, so each is a file descriptor. If you want to support a lot
of users in 1 DBMS server then you may need to raise this limit.
The actual database files are opened by each I/O slave process.
Again, if there are many database files then it may be useful to
raise this limit, although the I/O slaves will close and reopen
files as required when the limit is hit.
o The process size limit H/SVMMLIM applies to the total virtual size
of the DBMS server process. As for the data heap size limit, this
may need to be raised for large DBMS server processes.
The data heap size limit applies to the heap segment of the
process, where dynamic memory is allocated. The process size limit
applies to the total of all the segment sizes in the process, where
the data heap is only one of these segments. Usually the heap data
size limit and the process size limit are raised in a coordinated
way. It makes no sense to have a heap data limit the same or
larger than the process size limit.
Note that this limit applies to the process's address space. It is
a limit on virtual memory size, *not* on real memory usage of the
process. There is no way to 'ration' real memory at the process
level.
Note: the ULIMIT (file size limit) in /etc/default/login is only for
login shells. It is not applied to purely background processes (e.g.
cron jobs) or to system startup scripts, because in neither case is a
| login shell invoked. So it will *not* be used when Ingres is started
| from the system startup scripts, neither will it be used for Ingres
cron jobs. Be careful!
| 90.015 What CPU scheduler parameters should I set up for Ingres? (SVR4)
The SVR4 CPU scheduler is a complete rewrite from previous versions.
It supports real time processes, and is very tuneable using the
| priocntl command. Surely this can be exploited to tune Ingres
performance?
| The Ingres `system' comprises a number of cooperating processes:
clients, DBMS servers, I/O slaves, recovery process, archiver process.
The interactions between these are complex, and the effect of raising
or lowering CPU priorities or changing other scheduling parameters is
difficult to predict or understand.
Currently there is not enough experience in this area to offer reliable
advice. It's probably best to leave it alone for now.
90.016 Should I run the DBMS server as a real time process? (SVR4)
The DBMS server is the most important process on my system. Why don't
I run it as a real-time process so it never has to wait for the CPU?
The simplicity of this argument is appealing. Unfortunately the real
situation is more complex. For example:
o The DBMS server hands off I/O requests to its I/O slave processes.
If these are held up it will slow down the processing of SQL in the
DBMS server. So should these run at real-time priority too?
The I/O requests would get queued up but not serviced until the
DBMS server gave up the CPU. The slave processes would have to
wait, possibly for quite a long time, to get the small slice of CPU
they need to pick up a request and fire it off. The I/O would tend
to happen in 'bursts'.
But it's not clear that running the slave processes at real-time
priority would help. Would they be able to pre-empt the DBMS
server to get their CPU slice?
o The DBMS is multithreading. In a busy system it will have a lot of
work in hand on behalf of its many clients. Perhaps it will tend
to 'run and run' producing results while the clients can't get CPU
to use their results?
The DBMS server would pick up all of the incoming SQL requests, and
work on all of them until they have to be suspended for I/O or some
other reason, or there are results ready for the client to read
off. During this processing, all client processsing would stop.
Then, when the DBMS server gave up the CPU, they would burst into
life until the DBMS server had more work to do. System response
might appear jerky or erratic.
This effect has been observed in experiments, TP1 response times
become more erratic if the DBMS server is run as a real-time
process.
The observed results in (admittedly limited) experiments are not
promising, and the behaviour of a complex workload with a real-time
DBMS server is currently difficult to predict. For these reasons, it's
not recommended.
| Note: a 'runaway' DBMS server at real-time priority could lock the
entire system, including the console. It would probably not be
possible to stop the system cleanly, a forced system reload would be
needed.
| 90.017 Why can't Ingres allocate shared memory? (SunOS/Solaris)
| When attempting to start up Ingres on SunOS, and the following error
occurs:
Allocating bytes of shared memory...
!shmat for id at address F4000000 fails
!errno = 22
!Can't map locking segment into memory at address FFFFFFFF
!Check or adjust the value of II_LG_MAP_ADDR
Could not create the system segment, does your kernel have enough
shared memory or has this program already been run?
the remedy is to
ingsetenv II_LG_MAP_ADDR E0000000
and run iistartup again.
Solaris 2.3 requires II_LG_MAP_ADDR to be set to C0000000.
| SECTION 93 -- INGRES ON Windows NT
| 93.001 How can I keep Ingres running after the user ingres logs off NT?
| Ingres can be installed as an NT service and thus configured to start
automatically on booting, and close down cleanly on shutting down. This
is accomplished using the command
crserver install
(the opposite of this is crserver remove). Select the Services icon
| from the control panel, find the line "Ingres Intelligent Server",
click on "Startup..." and select Automatic. This method should also be
| used to manually shutdown (through the "Stop" button) Ingres if the
| service method was used to startup Ingres. IISTARTU.BAT and
| IISHUTDO.BAT exist as an alternative way to start/shutdown Ingres. Note
| that if you do use IISTARTU.BAT to start Ingres, then subsequently log
| off then Ingres will be uncleanly stopped - and may even corrupt your
| log file. Using the service method will leave Ingres running even
though no one is logged into the machine.
| 93.002 Do I need NT Server (formerly NTAS) to run Ingres?
No.
Windows NT comes in two flavours: Workstation and Server. These terms
are highly misleading, suggesting as they do that a machine with
server functions should run NT Server. That is not at all the case.
The distinction between Workstation and Server is only important to
NT itself. The Server product includes the NT domain administration
tools and services. If you have more than one NT machine in a
network you will probably want one of them to be an NT Server machine
to act as the domain controller, but you probably DON'T want to run
| the Ingres server on that machine. (If you have only one NT machine
you probably can't even install NT Server. You will have to use
the so-called Workstation version--even if it is a top-of-the-line
Pentium SMP box with multiple RAIDs serving hundreds of users.)
| The Ingres servers and tools will run equally well on an NT
"Workstation" machine or on an NT "Server" machine, unless the Server
machine is the Domain Controller for a busy domain, in which case it
would be a poor choice of host for a busy database server as well.
| SECTION 99 -- USER GROUPS
|
99.001 How can I contact the NAIUA? (North America)
NAIUA
2107 Del Monte Avenue,
Monterey, CA 93940
USA
Tel: (408)649-0644
FAX: (408)649-4124
| E-mail: mgmt@naiua.org
Officers:
=========
| President George Merritt gmerritt@mentora.com (404)843-9308
| Vice President Mike Meyer mmeyer@ (815)266-3030
| micro.honeywell.com
| Past President Steve Caswell sfc@tpghq.com (770)448-7727
| Member-at-Large Amy Ludlam aludlam@concord.com (508)460-4646
| Member-at-Large Karl Schendel wiz@telesismfg.com (412)963-8844
| Committee Chairs & Other Board Members
| ========= ====== = ===== ===== =======
| CA Member-at-Large Kirsten Kenny (516)342-2587
| Program Committee Karen Bishop karen.bishop@imb.org (804)219-1550
Product Directions Jane Frazer jzfrazer@aol.com (510)883-0175
Communications Mike Greene greenemj@bowinc.com (902)354-3411 x359
Membership Allan Reid shjg90a@prodigy.com (303)236-0330 x292
Technology Bob Griffith rcg@swl.msd.ray.com (508)858-5892
| Membership in the NAIUA is NOT automatic (as it was several years ago).
| Note the NAIUA is an autonomous organization that is not funded or
| operated by Computer Associates in any way. The NAIUA relies on membership
| dues to support its activities (such as the newsletters, the tool archive,
| the WEB site, and the membership directory).
| A membership application form is printed in/on the back of the NAIUA
| Newsletter. It is also available by anonymous FTP from ftp.naiua.org
| in /pub/ingres/IUA/NAIUA/application, or you can e-mail to
| mgmt@naiua.org for a membership application. Or fax (408)649-4124.
| (Because of chronic E-mail problems, it is recommended that you FAX
| or snail-mail the completed form back.)
|
| Individual memberships are $50US per year. A corporate membership rate
| may now be available too. Copies of the Ingres World proceedings for just
| the cost of shipping is worth the price of a membership.
|
************************************************
INTERNATIONAL MEMBERS ARE WELCOME. Ingres users
anywhere in the world will find there are
numerous benefits to membership in the NAIUA,
including easy access to the Members-at-Large who
have direct access to every level of CA
management, up to and including the president;
the two newsletters, one of which is for members
only and gives "insider" news, and more.
************************************************
99.002 How can I contact the UKIUA? (United Kingdom)
Ingres User Association
| c/o Susie Jones
Computer Associates House
183-187 Batch Road
Slough
Berkshire
SL1 4AA
Chairman, Ingres User Association
Mike Prollins
Apertus Systems Limited
| Technico House
| Richardshaw Lane
Leeds
| LS28 6AA
| Vice Chairman, Ingres User Association
| Liz Toher
| Barclays Bank
99.003 How can I contact my local users group? (US)
AZ
Arizona IUA
Joel Munter
Intel Corporation
5000 West Chandler Blvd.
Chandler, AZ 85226
Voice:(602) 554-5078
FAX:(602) 554-5241
Pat Keegan
US Bureau of Reclamation
23636 N. 7th Street
Mail Stop 1100
Phoenix, AZ 85024
Voice:(602) 870-2553
CA
Bay Area IUA
Tess Kowalczyk
LLNL
5379 Windflower Street
Livermore, CA 94550
Voice:(510) 422-0044
FAX:(510) 423-2209
Shelley Alonso
Apple Computers
20525 Mariani Ave., MS/43-IM
Cupertino, CA 95014
Voice:(408) 974-0097
San Diego IUA
Tom Unger - President
Seneca Systems, Inc.
2119 La Mesa Court
Spring Valley, CA 91977
Voice: (619) 697-0500
FAX: (619) 697-3718
e-mail: unger@sdsc.edu
Southern California IUA
Richard Oyekan
Calscience Engineering Laboratories
17870 Castleton St., Suite 395
City of Industry, CA 91748
Voice:(818) 912-2292
FAX:(818) 913-3474
CO
Colorado IUA
| Allen Reid - President
| Office of Surface Mining
| Bldg 20 - Rm B2005
| Denver Federal Center
| Denver, CO 80225-0065
| Voice:(303) 236-0330 ext. 292
| FAX:(303) 236-0340
| E-mail: reid@osmer.gov
| Marilee Posavec - Past President & Secretary
| 10744 West Marlowe Place
| Littleton, CO
| Voice:(303) 236-0330 ext. 277
| FAX:(303) 236-8263
| E-mail: mposavec@aol.com
GA
Georgia IUA
Tom Stone - President
Network Publishing
P.O. Box 100001
Lawrenceville, GA 30245
Voice:(404) 962-7220
FAX:(404) 822-4301
| IL
|
| Midwest IUG
|
| Michael E. Meyer - President
| Honeywell MICRO SWITCH
| 11 W. Springs Street
| Freeport, IL 61032
| Voice: (815) 266-3030
| FAX: (815) 235-5574
| E-mail: mmeyer@micro.honeywell.com
|
|
KS
Alan Sargent
DMT
112 West 9th Street, Ste. 500
Kansas City, KS 64105-1712
Voice:(816) 421-3500
FAX:(816) 421-6328
| E-mail: sargent@dmt.com
LA
Deep South IUA
| Darryl J. Owen - President
Chevron Information Technology Corp.
| E-mail: djow@chevron.com
MA
New England IUA
| Alan Spillert - President
| Mass General Hospital
| Cardiac Computing Center, BUL-457
| 55 Fruit St.
| Boston, MA 02114-2696
| Voice:(617) 724-5327
| FAX:(617) 726-5866
| E-mail: spillert.alan@mgh.harvard.edu
MD
Mid-Atlantic IUA
William J. Koster
Computer Sciences Corporation
| 7700 Hubble Drive
Lanham, MD 20706
| Voice:(301) 794-2329
| E-mail: koster@cdhf2.gsfc.nasa.gov
MI
| Michigan EDS IUA
| Stephanie Fink - President
| 300 East Big Beaver Road
| Troy, MI
| Voice: (810) 524-8647
| FAX: (810) 524-4153
|
MN, ND, SD, IO
North Central IUG
| Phil Carroll - President
| ANATEC
| Voice: (612) 458-2106
| Michael Leo - Past President
| Caribou Lake Software
| E-mail: mal@visi.com
|
NC
Triangle Area IUA
| Jim Stivers - President
| E-mail: 76001.331@CompuServe.Com
|
NJ
NJIUA
Stephanie Lyon
SDL Consulting, Inc.
629 Scotch Road
Pennington, NJ 08534
Voice:(609) 737-0425
NM
New Mexico IUA
| Dick McGuire - President
| MetaTech Corporation
| 2309 Renard Place SE Suite 401
| Albuquerque, NM 87106
| Voice:(505) 243-0681
| FAX:(505) 243-0683
| E-mail: 71031.1207@compuserve.com
|
| Dwight Coles - Vice President
| Sandia National Laboratories
| MS 0763
| PO Box 5800
| Albuquerque NM 87185
| Voice:(505) 844-8434
E-mail: drcoles@sandia.gov
|
Los Alamos IUA
Leslie Morgeson - President
Los Alamos National Laboratory
P.O. Box 1663/MS: D417
Los Alamos, NM
Voice:(505) 665-1847
FAX:(505) 665-5234
NY
| Metropolitan New York IUA
| Carl Jones - President
| 225 Broadway
| New York, NY, 1007
| Voice:(212) 766-4150
| FAX:(212) 766-4172
|
PA
Western Penn. IUA
| Rita Motor - President
Carnegie Mellon University
| 4910 Forbes Avenue - CYH 154
| Pittsburgh, PA 15213-3890
| Voice:(412) 268-8071
| FAX:(412) 268-6868
| E-mail: rita@cmu.edu
|
| Laura McGinnis - Past President
Voice:(412) 268-5642
FAX:(412) 268-5832
| E-mail: lfm@psc.edu
| Mike Bennett - Treasurer
| Voice:(412) 733-0200 ext 5561
| E-mail: mbennett@nauticom.net
|
|
TX
| Austin IUA
|
| Wanda Vidrine - President
| ALUMINUM COMPANY OF AMERICA (ALCOA)
| PO Box 472
| Rockdale, TX 76567
| Voice:(512) 446-8862
| FAX:(512) 446-8721
| E-mail: wanda.vidrine@alcoa.com
|
| Houston IUA
|
| Glen Ball - Chairman
| 13011 Green Rainbow
| Cypress, TX
| Voice:(713) 370-0025
|
North Texas IUA
Anne Dollar - President
Mobile E&P Telchnical Center
| 3000 Pegasus Park Drive
| Dallas, TX 75265-0232
Voice:(214) 951-3510
| FAX:(214) 951-3598
| E-mail: aldollar@dal.mobil.com
UT
Salt Lake IUA
| Tyler McGraw - President (likely obsolete: Tyler is working in England now)
| E-mail: Tyler.McGraw@psemail.ps.net
| Jerry Harper - Vice President
| Thiokol DLV
| P.O.Box 689 M/S-W22
| Brigham City UT, 84302
| Voice: (801) 863-8947
| FAX: (801) 863-6430
| E-mail: harperj@tc.thiokol.com
| Gary Barlow - Past President
University of Utah
Cardiovascular Genetics
410 Chipeta Way, Room 161
Salt Lake City, UT 84108
Voice:(801) 581-3888
FAX:(801) 581-6862
| E-mail: gary@ucvg.med.utah.edu
99.004 How can I contact my local users group? (Canada)
Atlantic Canada IUA
| Richard Ward - Treasurer
| E-mail: rward@gov.nb.ca
|
| Lorne Wilson - Secretary
| E-mail: merseyis@atcon.com(MIME)
|
| Tracy Gulliver - Past President
University of New Brunswick
Computing Services Dept.
P.O. Box 4400
Fredericton, New Brunswick
E3B 5A3
Voice:(506) 453-4564
FAX:(506) 453-3590
|
| Ontario
|
National Capitol IUA
Lawrence Hercz - Acting President
Algonquin College
Computer Service
1385 Woodroffe
Naepan, ON K2G 1V8
Voice:(613) 727-4723 Ext. 5175
FAX:(613) 727-7674
|
Toronto Area IUA
| Rob McKenzie - Chairman
| Independent Ingres Consultant
| 40 Camrose Drive
| Keswick, Ontario
| Canada
| Voice:(905) 476-2532
| E-mail: robm@ilap.com
|
| Quebec
|
AFUIAN (Francophone)
| Bernard Olivier - President
| Industries James Maclaren Inc.
|
Luc Valliere - Treasurer
University de Quebec
C.P. 8888, Station A
Quebec, P.Q.
| Canada H3C 3P8
Voice:(514) 987-4338
| FAX:(514) 987-6503
|
|
| Saskatchewan
|
Prairies IUG
Adeline Skwara - President
Saskatchewan Energy & Mines
1914 Hamilton Street
Regina, Saskatchewan
Voice:(306) 787-2548
FAX:(306) 787-7338
Alberta -- There is no Alberta LUG at present.
Contact Roy Hann
BKB Engineering Ltd.
11211 76th Ave.
Edmonton, Alberta
T6G 0K2
Tel (403)438-2531
FAX (403)437-3367
rhann@tnc.com
|
| British Columbia
|
West Coast IUG
Kapil Lohia - President
Arrakis Consulting Group, Inc.
6865 Neoliani Place
Burnaby, British Columbia
Voice:(604) 654-4151
FAX:(604) 654-4667
99.005 How can I contact my local users group? (South Africa)
| Martin Rennhackkamp
| The Data Base Approach
PO Box 5165, Helderberg
Somerset West
7135, South Africa
Tel: 0(+27) 21 881 3043
Fax: 0(+27) 21 881 3318
E-mail: MR@SUNVAX.SUN.AC.ZA (Martin Rennhackkamp)
| 99.006 How can I contact my local users group? (Europe)
| BELGIUM/LUXEMBOURG
| CA-Ingres User Group Belgium/Luxembourg
| c/o Philippe BRAIBANT
| BELFOX - Beurspaleis
| Rue Henri Maus 2
| B-1000 Brussels
| Voice: (32) 2 512.80.40
| FAX: (32) 2 513.83.42
| CA-contact: Andre De Locht @ CA Belgium
| Voice : (32) 2 773.28.11
| E-mail: andrel@ingres.com for internet or delan07 for CA-NET
| DENMARK
| Danish IUA
|
| Christian Olsen - Chairman
| theklavel 46
| DK-2400 Kobenhavn NV
| Denmark
| Voice: 45 383 304 88
| FAX: 453 186 5106
|
|
| Scandinavian IUA
|
| Ole Thomasen - President
| Jorgen Knudesensvej
| DK-352-Farum
| Denmark
| Voice: 45 449 922 44
| FAX: 454 499 2220
|
|
|
| FINLAND
|
| Finnish IUA
|
| Ms. Leena Ahvonen - President
| PL105
| Fin-02631
| Finland
| Voice: 358 050 275 1
| FAX: 358 050 27359
|
|
|
| GERMANY
|
| German IUA
|
| Axel Schwanke - President
| c/o Lucent Technologies
| Dept. OEPS-PSE
| Thurn-und-Taxis-Str. 10
| 90411 Nuernberg
| Germany
| Voice: +49 911 526 2691
| FAX: +49 911 526 6299
| E-mail: axelschwanke@lucent.com
|
| Bodo Bergmann - Vice President
| Client/Server-Consulting & Training
| Ruedesheimer Str. 17
| 63110 Rodgau
| Germany
| Voice: +49 6106 876 115
| FAX: +49 6106 876 116
| E-mail: bodob@ibm.net
|
|
|
| The NETHERLANDS
|
| Ingres User Group the Netherlands
|
| Tjerk Post - Chairman
| Wim van der Maas - Secretary
| Martin Verdonk - Treasurer
| Mark Luijendijk - Workgroups and SIGs
| Eric Nooter - Activities
| E-mail: info@iugn.nl
| WWW: http://www.iugn.nl
|
|
|
| SWEDEN
|
| Swedish IUA
|
| Mr. Sven-Bertil Wallin
| Kungsgatan 53
| S-111 22
| Stockholm
| Sweden
| Voice: +46 8 24 34 20
| FAX: +46 8 24 27 68
|
|
|
| SWITZERLAND
|
| RUBIS (Rencontre des Utilisateurs de Base Ingres) Switzerland
| INGRES User Group Switzerland (Swiss french)
|
| c/o Monsieur Dominique CENTENO
| Institut de Pathologie
| 25, rue du Bugnon
| CH - 1011 LAUSANNE
| Voice: (41) 21 314 71 17
| FAX: (41) 21 652 08 80
| E-mail: rubis@itu.ch
| WWW: http://www.itu.ch/RUBIS
|
|
| SWINGRES (Swiss German)
|
| Ewald M. Mund - President
| Mund-Software
| Buchholzstrasse 13
| 3066 Stettlen
| Switzerland
| Voice: 0041 31 9340841
| FAX: 0041 31 9340842
| E-mail: mundsw@dial.eunet.ch
|
|
99.007 How can I contact my local users group? (Irish Republic)
Irish Ingres Users Association
c/o Europa House
Harcourt Street
Dublin 2
IRELAND
Phone: +353-1-4780800
FAX: +353-1-4780775
Chairman: Alan Daly
Superquinn Ltd.
PO Box 99
Sutton
Dublin 13
IRELAND
Phone: +353-1-8325700
99.008 How can I contact my local user group? (Australia)
AUSTRALIAN INGRES USER GROUP PRESIDENTS
| National IUG
| Phil James - President
| Voice: 041 11 99 441
| Fax: 07 3224 2390
| E-mail: jamesp@pib3.pib.dpi.qld.gov.au
| WWW: http://www.ozemail.com.au/~ingresug
| Australian Capitol Territory IUG
| Neil Telfer - President
| Stuart Spencer - Vice President
| E-mail: codrad31@aec.gov.au
| WWW: http://www.ozemail.com.au/~ingresug/act
| New South Wales IUG
| David Orr - President
| COMALCO Aluminium
| PO Box 85
| Fairfield, NSW, 2161
| Australia
| Voice: 612 681 1968
| Fax: 612 892 1770
|
| Queensland IUG
|
| Malcolm Thatcher - President
| Thentec Pty. Limited
| Voice: 61 7 3371 6611
| Fax: 61 7 3371 6633
| E-mail: malt@thentec.com.au
| WWW: http://www.ozemail.com.au/~ingresug/qld/index.html
|
|
| South Australian CA-Ingres IUG
|
| Fred Dolen - President
| E-mail: fdol1@anr.gov.au
|
|
| Tasmania IUG
| Frank van Ravels - President
| Australia
| E-mail: Frank_van_Ravels@umail.toursr.tas.gov.au
|
|
| Victorian IUA
|
| Gavin Trigg - President
| Information Technology Services (ASIS)
| The University of Melbourne
| Grattan Street
| Parkville 3052
| Australia
| Voice: 613 344 6003
| Fax: 613 347 4803
| E-mail: gavin@asis.unimelb.edu.au or
| Trigg@its.unimelb.edu.au
| WWW: http://www.ozemail.com.au/~ingresug/vic
|
|
| Western Australian IUG
|
| Andrew Tierney - President
| Legal Aid Western Australia
| 55 St Georges Tce
| Perth, WA, 6000
| Australia
| Voice: 09 261 6280
| Fax: 09 325 5430
| E-mail: atierney@acslink.net.au
|
| 99.009 How can I contact my local user group? (India)
|
|
| India IUA
|
| T S Ananthaswami Row - Chairman, Organising Committee
| Mastek Ltd.
| III Floor
| Wellington Plaza
| 90 Anna Salai
| Chennai - 600 002
| Voice: 044-8527289/ 8555369
| Fax: 044-831736
|
------------------------ END OF FAQ -----------------------------
Ingres Database Reference
To William's Home Page
© William Yuan 2000
Email William