Home

IBM Informix Guide to SQL: Tutorial, Version 5.2

image

Contents

1. CREATE VIEW full addr AS SELECT addressl address2 city state sname zipcode FROM customer state WHERE customer state state code 11 22 Security Stored Procedures and Views Using Views The table of state names reduces the redundancy of the database it permits lengthy names such as Minnesota to be stored only once This full_addr view lets users retrieve the address as if the full state name were stored in every row The following two queries are equivalent SELECT FROM full_addr WHERE customer _num 105 SELECT addressl address2 city state sname zipcode FROM customer state WHERE customer state state code AND customer_num 105 However you must use care when you define views that are based on joins Such views are not modifiable that is you cannot use them with UPDATE DELETE or INSERT statements Modifying through views is covered begin ning on page 11 25 The following example restricts the rows that can be seen in the view CREATE VIEW no_cal_cust AS SELECT FROM customer WHERE NOT state CA This view exposes all columns of the customer table but only certain rows The next example is a view that restricts users to rows that are relevant to them CREATE VIEW my_calls AS SELECT FROM cust_calls WHERE user_id USER All the columns of the cust_calls table are available but only in those rows that contain the user ids of the users who execute the query Duplicate
2. SELECT catalog description unit price unit unit descr FROM catalog stock WHERE catalog stock_num stock stock_num AND catalog manu_code stock manu_code AND catalog_num 10017 SELECT catalog description unit price unit unit descr FROM catalog stock WHERE catalog num 10017 AND catalog manu_code stock manu_code AND catalog stock num stock stock num Both of these SELECT statements create the same natural join and retrieve the following row catalog num 10017 stock num 101 manu_code PRC cat_descr Reinforced hand finished tubular Polyurethane belted Effective against punctures Mixed tread for super wear and road grip cat_picture lt BYTE value gt cat_advert Ultimate in Puncture Protection Tires Designed for In City Riding description bicycle tires unit price 88 00 unit box unit descr 4 box Note that this display includes a TEXT column cat_descr a BYTE column cat_picture and a VARCHAR column cat_advert Simple SELECT Statements 2 67 Multiple Table SELECT Statements Multiple Table Join A multiple table join connects more than two tables on one or more associ ated columns It can be an equi join or a natural join SELECT FROM catalog stock manufact WHERE catalog stock_num stock stock_num AND stock manu_code manufact manu_code AND catalog _num 10025 This SELECT statement creates an equi join on the catalog stock and manufact tables and retrieves th
3. Some item rows were deleted but not all an order record with only some items remains e All item rows were deleted but the order row remains e All rows were deleted In the second and third cases the database is corrupted to some extent it con tains partial information that can cause some queries to produce wrong answers The user must take careful action to restore consistency to the infor mation When transactions are used all these uncertainties are prevented 7 6 Programs That Modify Data Using DELETE Deleting with a Cursor Figure 7 2 You can also write a DELETE statement through a cursor to delete the row that was last fetched In this way you can program deletions based on conditions that cannot be tested in a WHERE clause An example appears in Figure 7 2 int delDupOrder int ord_num int dup_cnt ret_code declare scan_ord cursor for select order_num order date into ord_ num from orders for update open scan_ord if sqlca sqlcode 0 return sqlca sqlcode begin work for fetch next scan_ord if sqlca sqlcode 0 break dup_cnt 0 default in case of error select count into dup_cnt from orders where order _num S ord_num if dup_cnt gt 1 delete where current of scan_ord if sqlca sqlcode 0 break ret_code sqlca sqlcode if ret_code 100 merely end of data commit work else error on fetch or on delete
4. delete from items where order num onum You can also prepare and execute a statement of the same form dynamically In either case the statement works directly on the database to affect one or more rows The WHERE clause in the example uses the value of a host variable named onum Following the operation results are posted in the SQLCA as usual The third element of the SQLERRD array contains the count of rows deleted even if an error occurs The value in SQLCODE shows the overall success of the operation If it is not negative no errors occurred and the third element of SQLERRD is the count of all rows that satisfied the WHERE clause and were deleted Errors During Direct Deletions When an error occurs the statement ends prematurely The negative num bers in SQLCODE and the second element of SQLERRD explain its cause and the count of rows reveals how many rows were deleted For many errors that count is zero because they prevented the database server from beginning the operation at all For example if the named table does not exist or if a column tested in the WHERE clause is renamed no deletions are attempted However certain errors can be discovered after the operation begins and some rows are processed The most common of these errors is a lock conflict The database server must obtain an exclusive lock on a row before it can delete that row Other programs might be using the rows from the table pre venting the d
5. DEFINE priv_to_ grant char 100 table name char 20 user_id char 20 grant stmt char 200 The variable grant_stmt holds the assembled GRANT statement which is cre ated by concatenating the parameters and some constants LET grant stmt GRANT priv_to grant ON table name TO user_id In IBM Informix 4GL the comma is used to concatenate strings This assign ment statement concatenates the following six character strings e GRANT e The parameter specifying the privileges to be granted e ON e The parameter specifying the table name e TO e The parameter specifying the user The result is a complete GRANT statement composed partly of program input The same feat can be accomplished in other host languages using dif ferent syntax WHENEVER ERROR CONTINUE PREPARE the_grant FROM grant_stmt If the database server returns an error code in SQLCODE the default action of an IBM Informix 4GL program is to terminate However errors are quite likely when you prepare an SQL statement composed of user supplied parts and program termination is a poor way to diagnose the error In the preceding code the WHENEVER statement prevents termination Then the PREPARE statement passes the assembled statement text to the database server for parsing Summary Summary If the database server approves the form of the statement it sets a zero return code This does not guarantee that the
6. Entity Tables After deciding on the primary keys record your decisions as diagrams For each entity draw the corner of a table as shown in Figure 8 2 noting the name of the entity and the chosen primary key columns Entity and table name Column name Name NameString Flags PK for primary key FK for foreign key SA for system assigned UA for user assigned NN for never null PK UA Gaius C Caesar 7 SPOR S A Illustrative values Figure 8 2 Diagram of an entity table The Address Book Example Suppose that you create a database that computerizes a personal address book The database model must record the names addresses and telephone numbers of people and organizations that its user deals with in the course of business The first step is to define the entities and the first thing you might do is look carefully at a page from an address book to see what entities are there see Figure 8 3 Building a Data Model 8 11 Step 1 Name the Entities 2632 ee Figure 8 3 Part of a page from an address book The physical form of the existing data can be misleading Do not let the lay out of pages and entries in the address book mislead you into trying to spec ify an entity that represents one entry in the book some kind of alphabetized record with fields for name number and address Remember it is not the medium you want to model it is t
7. Since this cursor queries only a single table in a simple way the database server can very quickly discover whether any rows satisfy the query and find the first one The first row is the only row it finds at this time The rest of the rows in the active set remain unknown DECLARE hard CURSOR FOR SELECT C customer_num O order_num sum items total_price FROM customer C orders O items I WHERE C customer_num O customer_num AND O order_ num I order_ num AND O paid_date is null GROUP BY C customer_num O order_num The active set of this cursor is generated by joining three tables and grouping the output rows The optimizer might be able to use indexes to produce the rows in the correct order this is discussed in Chapter 4 of this manual but in general the use of ORDER BY or GROUP BY clauses requires the database server to generate all the rows copy them to a temporary table and sort the table before it can know which row to present first In cases where the active set is entirely generated and saved in a temporary table the database server can take quite some time opening the cursor After ward it could tell the program exactly how many rows the active set con tains This information is not made available however One reason is that you can never be sure which method the optimizer uses If it can avoid sorts and temporary tables it does but very small changes in the query in the sizes of the tables or in the availa
8. The output includes a number of duplicates because some customers have placed more than one order Sometimes you want to see duplicate rows in a projection Other times you are interested only in the distinct values not how often each value appears Simple SELECT Statements 2 19 Single Table SELECT Statements You can cause duplicate rows to be suppressed by including the keyword DISTINCT or its synonym UNIQUE at the start of the select list SELECT DISTINCT customer _num FROM orders SELECT UNIQUE customer_num FROM orders Either of these statements limits the display to show each customer number in the orders table only once producing a more readable list customer_num 101 104 106 110 111 112 115 116 117 119 120 121 122 123 124 126 127 Suppose you are handling a customer call and you want to locate purchase order number DM354331 You decide to list all the purchase order numbers in the orders table SELECT po_num FROM orders 2 20 Simple SELECT Statements Single Table SELECT Statements This SELECT statement retrieves data in the po_num column in the orders table and displays the following list po_num B77836 9270 B77890 8006 2865 Q13557 278693 L2Z230 4745 429Q B77897 278701 B77930 8052 MAO003 PC6782 DM354331 S22942 Z55709 W2286 C3288 w9925 KF2961 Simple SELECT Statements 2 21 Single Table SELECT Statements However the list is not in a very
9. It is always permissible to overspecify a table name or database name That is even if the current database is masterdb and the current database server is central it is permissible in a query to refer to a table named masterdb central customer Using Synonyms with External Tables A synonym is a name that you can use in place of another name The main use of synonyms is to make it more convenient to refer to external tables You can also use synonyms to disguise the location of external tables Here is the preceding example revised to use synonyms for the external tables CREATE SYNONYM mcust FOR masterdb central customer CREATE SYNONYM bords FOR sales boston orders SELECT bords order num mcust fname mcust lname FROM mcust bords WHERE mcust customer_num bords Customer_num INTO TEMP mycopy The CREATE SYNONYM statement stores the synonym name in the system catalog table syssyntable in the current database The synonym is available to any query made within that database A short synonym makes it easier to write queries but synonyms can play another role They allow you to move a table to a different database or even to a different computer while leaving your queries the same Suppose you have a number of queries that refer to the table names customer and orders The queries are embedded in programs forms and reports The tables are part of database stores5 which is kept on database server avignon Now the
10. Suppose you discover that some rows of the stock table were entered with incorrect manufacturer codes Rather than update them you want to delete them so they can be reentered You know that these rows unlike the correct ones have no matching rows in the manufact table This allows you to write the following DELETE statement DELETE FROM stock WHERE 0 SELECT COUNT FROM manufact WHERE manufact manu_code stock manu_code The subquery counts the number of rows of manufact that match the count is 1 for a correct row of stock and 0 for an incorrect one The latter rows are chosen for deletion One way to develop a DELETE statement with a complicated condition is to first develop a SELECT statement that returns precisely the rows to be deleted Write it as SELECT when it returns the desired set of rows change SELECT to read DELETE and execute it once more The WHERE clause of a DELETE statement cannot use a subquery that tests the same table That is when you delete from stock you cannot use a sub query in the WHERE clause that also selects from stock The key to this rule is in the FROM clause If a table is named in the FROM clause of a DELETE statement it cannot also appear in the FROM clause of a subquery of the DELETE statement Inserting Rows 5 6 Modifying Data The INSERT statement adds a new row or rows to a table The statement has two basic functions it can create a single new row using column value
11. 10 4 Tuning the Model device 0x7d blobspace rasters device oxri host file system dbspace root dbspace temps The relationship between chunks and dbspaces Its methods of disk management are not complicated However several dif ferent terms are used for different amounts of space in different contexts the chunk the dbspace or blobspace the page the extent and the tblspace and Pages The basic unit of physical storage is the chunk A chunk is a unit of disk stor age that is dedicated to IBM Informix OnLine Usually it is a physical device that is a disk drive However a chunk can be part of one disk or simply a file In any case a chunk is a unit of space that can be identified to the oper ating system as being in the exclusive control of IBM Informix OnLine The page is the basic unit of disk input output 1 0 All space in every chunk is divided into pages All I O is done in units of whole pages The size of a page is the same in all chunks used for tables It is set when an IBM Informix OnLine system is installed IBM Informix OnLine Disk Storage Dbspaces and Blobspaces A space always comprises one or more complete chunks Often a space con tains exactly one chunk so that the space and the chunk are identical How ever when a space comprises more than one chunk IBM Informix OnLine makes the multiple chunks appear to be a single sequence of pages A space is either a dbspace or a blo
12. Figure 11 8 DBA mode procedure that adds tables and indexes to the database To use the all_objects procedure to control additions of columns to tables revoke Resource privilege on the database from all users When users try to create a table index or view using an SQL statement outside your procedure they are not able to do so When users execute the procedure they have tem porary DBA privilege so the CREATE TABLE statement for example succeeds and you are guaranteed that every column added has a constraint placed on it In addition objects created by users are owned by that user For the all_objects procedure the two tables and the index are owned by whoever executed the procedure Using Views A view is a synthetic table You can query it as if it were a table and in some cases you can update it as if it were a table However it is not a table rather it is a synthesis of the data that exists in real tables and other views The basis of a view is a SELECT statement When you create a view you define a SELECT statement that generates the contents of the view at the time the view is accessed A user also queries a view using a SELECT statement The database server merges the SELECT statement of the user with the one defined for the view and then actually performs the combined statements The result has the appearance of a table it is enough like a table that a view even can be based on other views or on joins of tables and ot
13. Foreign keys join tables and establish dependencies between tables Tables can form a hierarchy of dependencies in such a way that if you change or delete a row in one table you destroy the meaning of rows in other tables For example in the stores5 database the customer_num column of the customer table is a primary key for that table and a foreign key in the orders and cust_call tables Customer number 106 George Watson is referenced in both the orders and cust_calls tables If customer 106 is deleted from the customer table the link between the three tables and this particular customer is destroyed Modifying Data 5 19 Data Integrity customer Table detail customer_num fname Iname Philip Currie George Watson 103 106 orders Table detail order_num order_date customer_num 1002 05 21 1991 101 1003 05 22 1991 104 1004 05 22 1991 cust_calls Table detail customer_num call_dtime user_id 106 1991 06 12 8 20 maryj 110 1991 07 07 10 24 riche 119 1991 07 01 15 00 riche 5 20 Modifying Data When you delete a row containing a primary key or update it with a different primary key you destroy the meaning of any rows that contain that value as a foreign key Referential integrity is the logical dependency of a foreign key on a primary key The integrity of a row that contains a foreign key depends on the integrity of the row that it references the row that contains the matc
14. Modifying Data 5 17 Data Integrity Entity Integrity 5 18 Modifying Data An entity is any person place or thing to be recorded in a database Each entity represents a table and each row of a table represents an instance of that entity For example if order is an entity the orders table represents the idea of order and each row in the table represents a specific order To identify each row in a table the table must have a primary key The pri mary key is a unique value that identifies each row This requirement is called the entity integrity constraint For example the orders table primary key is order_num The order_num col umn holds a unique system generated order number for each row in the table To access a row of data in the orders table you can use the following SELECT statement SELECT FROM orders WHERE order num 1001 Using the order number in the WHERE clause of this statement enables you to access a row easily because the order number uniquely identifies that row If the table allowed duplicate order numbers it would be almost impossible to access one single row because all other columns of this table allow dupli cate values Refer to Chapter 8 of this manual for more information on primary keys and entity integrity Data Integrity Semantic Integrity Semantic integrity ensures that data entered into a row reflects an allowable value for that row This means that the value must be within t
15. The DATETIME data type stores any moment in time in the era beginning 1 A D In fact DATETIME is really a family of 28 data types each with a dif ferent precision When you define a DATETIME column you specify its preci sion It may contain any sequence from the list year month day hour minute second and fraction Thus you can define a DATETIME column that stores only a year or only a month and day or a date and time that is exact to the hour or even to the millisecond The size of a DATETIME value ranges from 2 to 11 bytes depending on its precision as shown in Figure 9 3 The advantage of DATETIME is that it can store dates more precisely than to the nearest day and it can store time values Its only disadvantage is an inflexible display format but this can be circumvented see Forcing the Format of a DATETIME or INTERVAL Value on page 9 15 Precision Size Precision Size year to year 3 day to hour 3 year to month 4 day to minute 4 year to day 5 day to second 5 year to hour 6 day to fraction f 5 f 2 year to minute 7 hour to hour 2 year to second 8 hour to minute 3 year to fraction f 8 f 2 hour to second 4 month to month 2 hour to fraction f 4 f 2 month to day 3 minute to minute 2 month to hour 4 minute to second 3 month to minute 5 minute to fraction f 3 f 2 month to second 6 second to second 2 month to fraction f 6 f 2 second to fraction f 2 f 2 day to day 2 fraction to fraction f 1 f 2 When f i
16. rollback work return ret _code An unsafe ESQL C function that deletes through a cursor see Note Note The design of the ESQL C function in Figure 7 2 is unsafe It depends for cor rect operation on the current isolation level which is discussed later in the chapter Even when it works the way it is meant to work its effects depend on the physical order of rows in the table which is not generally a good idea Programs That Modify Data 7 7 Using INSERT The purpose of the function is to delete rows containing duplicate order numbers In fact in the demonstration database the orders order_num col umn has a unique index so duplicate rows cannot occur in it However a similar function can be written for another database this one uses familiar column names The function declares scan_ord a cursor to scan all rows in the orders table It is declared with the FOR UPDATE clause which states that the cursor can be used to modify data If the cursor opens properly the function begins a transaction and then loops over rows of the table For each row it uses an embedded SELECT statement to determine how many rows of the table have the order number of the current row this is the step that fails without the cor rect isolation level as described in a later section In the demonstration database with its unique index on this table the count returned to dup_cnt is always 1 However if it is greater the function de
17. 2nd max 2nd min F literal value 2nd min 2nd max 2nd min F 1 10 F 1 3 ESIS F 1 if subquery estimated to return gt 0 rows else 0 F 1 F expression F F expr1 x F expr2 F F expr1 F expr2 F expr1 x F expr2 treated as anycol item OR OR anycol item treated as any col relop value OR OR anycol relop value for estimated size of subquery n indexed col first or only column in an index IBM Informix OnLine only 2nd max 2nd min second largest and smallest key values in indexed column IBM Informix OnLine only any col any column not covered by a preceding formula Selecting Table Access Paths The optimizer next chooses what it estimates to be the most efficient way of accessing each table named in the query It has four choices e To read the rows of the table sequentially e To read one of the indexes for the table and read the rows to which the index points e To create and use a temporary index e To perform a sort merge The choice between the first two options depends in large part on the presence of a filter expression When there is any filter on an indexed column the database server chooses the selected rows through the index and pro cesses only those rows Optimizing Your Queries 4 17 The Query Optimizer When there is no filter the database server must read all of the rows anyway It is usually faster simply to read the rows rather than reading the pages of an i
18. IBM Informix ide to SQL Tutorial Inform Inform Inform Inform Inform Inform Inform v vw v vW vW W wW Ww Inform ix 4GL Version 4 1 ix SQL Version 4 1 ix ESQL C Version 5 0 ix ESQL COBOL Version 5 0 ix SE Version 5 0 ix OnLine Version 5 2 ix NET Version 5 0 ix STAR Version 5 0 November 2002 Part No 000 9121 Note Before using this information and the product it supports read the information in the appendix entitled Notices This document contains proprietary information of IBM It is provided under a license agreement and is protected by copyright law The information contained in this publication does not include any product warranties and any statements provided in this manual should not be interpreted as such When you send information to IBM you grant IBM a nonexclusive right to use or distribute the information in any way it believes appropriate without incurring any obligation to you Copyright International Business Machines Corporation 1996 2002 All rights reserved US Government User Restricted Rights Use duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp IBM Informix Guide to SQL Tutorial Table of Contents Introduction In This Introduction 3 About this Manual 3 Organization of this Manual 4 IBM Informix Products That UseSQL 5 Products Covered in This Manual 5 The Demonstration Database 6 Creating
19. IBM Informix ESQL C or IBM Informix ESQL COBOL This path is valid only for IBM Informix ESQL C This path is valid only for IBM Informix ESQL COBOL WE This path is valid only for DB Access Sig This path is valid only if you are using Informix Stored Procedure Language SPL This path is an Informix extension to ANSI standard SQL If you initiate Informix extension checking and include this syntax branch you receive a warning If you have set the DBANSIWARN environment variable you receive the warnings at run time To receive the warnings at compile time compile with the ansi flag ATR A shaded option is the default Even if you do not explicitly type the option it will be in effect unless you choose another option Introduction 13 Document Conventions Element Description gt gt Syntax enclosed in a pair of arrows indicates that this is a subdiagram The vertical line is a terminator and indicates that the statement is complete A branch below the main line indicates an optional path Ae A loop indicates a path that can be repeated variable i A gate 7 in an option indicates that you can only use that option once even though it is within a larger loop column oF ies 14 Introduction Document Conventions Figure 1 shows the elements of a syntax diagram for the CREATE DATABASE statement Reference Boxes Terminator Signals CREATE DATABASE data
20. IBM Informix OnLine offers you the option of creating the database in a par ticular dbspace A dbspace is a named area of disk storage Ask your IBM Informix OnLine administrator whether you should use a particular dbspace The administrator can put a database in a dbspace to isolate it from other databases or to locate it on a particular disk device Chapter 10 dis cusses dbspaces and their relationship to disk devices Some dbspaces are mirrored duplicated on two different disk devices for high reliability your database can be put in a mirrored dbspace if its contents are of exceptional importance Choosing the Type of Logging IBM Informix OnLine offers the following four choices for transaction log ging e No logging at all This choice is not recommended if the database is lost to a hardware failure all data alterations since the last archive are lost CREATE DATABASE db _with_no_log When you do not choose logging BEGIN WORK and other SQL statements related to transaction processing are not permitted in the database This affects the logic of programs that use the database e Regular unbuffered logging This is the best choice for most databases In the event of a failure only uncommitted transactions are lost CREATE DATABASE a_logged_db WITH LOG e Buffered logging If the database is lost a few of the most recent alter ations are lost or possibly none In return for this small risk performance du
21. Syntax diagrams describe the format of SQL statements or commands including alternative forms of a statement required and optional parts of the statement and so forth Syntax diagrams have their own conventions which are defined in detail and illustrated in this section SQL statements are listed in their entirety in the IBM Informix Guide to SQL Reference although some statements may appear in other manuals Introduction 11 Document Conventions Each syntax diagram displays the sequences of required and optional ele ments that are valid in a statement Briefly e All keywords are shown in uppercase letters for ease of identification even though you need not enter them that way e Words for which you must supply values are in italics A diagram begins at the upper left with a keyword It ends at the upper right with a vertical line Between these points you can trace any path that does not stop or back up Each path describes a valid form of the statement Along a path you may encounter the following elements Element Description KEYWORD You must spell a word in uppercase letters exactly as shown however you can use either uppercase or lowercase letters when you enter it 7 Punctuation and mathematical notations are literal symbols that you must enter exactly as shown wow Double quotes are literal symbols that you must enter as shown You can replace a pair of double quotes with a pai
22. When you want to ORDER BY an expression you can use either the display label assigned to the expression or an integer SELECT customer_num user_id call_code call _dtime res dtime call _dtime span FROM cust_calls ORDER BY span This query retrieves the same data from the cust_calls table as the previous query but here the ORDER BY clause causes the data to be displayed in ascending order of the derived values in the span column customer num user_id call _ code call_dtime span 127 maryj I 1991 07 31 14 30 121 maryj O 1991 07 10 14 05 0 00 01 106 maryj D 1991 06 12 08 20 0 00 05 110 riche L 1991 07 07 10 24 0 00 06 116 mannyn I 1990 11 28 13 34 0 03 13 119 riche B 1991 07 01 15 00 0 17 21 116 mannyn I 1990 12 21 11 24 5 20255 The next version uses an integer to represent the result of the operation res dtime call dtime and retrieves the same rows SELECT customer_num user_id call_code call _dtime res dtime call _dtime span FROM cust_calls ORDER BY 5 2 46 Simple SELECT Statements Single Table SELECT Statements Using Functions in SELECT Statements In addition to column names and operators an expression also can include one or more functions There are five aggregate functions and eight time functions as well as the LENGTH USER TODAY HEX ROUND and TRUNC functions These func tions are described in detail in the IBM Informix Guide to SQL Reference Aggregate Functions The aggregate
23. You use two commands to control the effect that locks have on your data access SET LOCK MODE and SET ISOLATION The details of these statements are best understood after a discussion on the use of cursors from within pro grams they are covered in Chapters 6 and 7 of this manual Database access is regulated by the privileges that the database owner grants you The privileges that let you query data are often granted automatically but the ability to modify data is regulated by specific Insert Delete and Update privileges that are granted on a table by table basis If data integrity constraints are imposed on the database your ability to mod ify data is restricted by those constraints Your database and table level priv ileges along with any data constraints control how and when you can modify data You can delete one or more rows from a table with the DELETE statement Its WHERE clause selects the rows use a SELECT statement with the same clause to preview the deletes Rows are added to a table with the INSERT statement You can insert a single row containing specified column values or you can insert a block of rows generated by a SELECT statement You use the UPDATE statement to modify the contents of existing rows You specify the new contents with expressions that can include subqueries so that you can use data based on other tables or the updated table itself The statement has two forms in the first form you specify new va
24. case 10 gloves case case 24 case case 4 sets case each each each each case 24 case case 2 sets case each each case 10 gloves case case 24 case case 24 case Simple SELECT Statements 2 17 Single Table SELECT Statements The order of the columns in the ORDER BY clause is important and so is the position of the DESC keyword Although the following four SELECT state ments contain the same components in the ORDER BY clause each produces a different result not shown SELECT FROM stock ORDER BY manu_code unit price DESC SELECT FROM stock ORDER BY unit _price manu_code DESC SELECT FROM stock ORDER BY manu_code DESC unit_price SELECT FROM stock ORDER BY unit price DESC manu_code 2 18 Simple SELECT Statements Single Table SELECT Statements Selecting Specific Columns The previous section showed how to select and order all data from a table However often all you want to see is the data in one or more specific col umns Again the formula is to use the SELECT and FROM clauses specify the columns and table and perhaps order the data in ascending or descending order with an ORDER BY clause Suppose you want to find all the customer numbers in the orders table SELECT customer_num FROM orders This statement simply selects all data in the customer_num column in the orders table and lists the customer numbers on all the orders including duplicates customer_num
25. 0075 6 as the value of a numeric column The database server converts the numeric string to a number An error occurs only if the string does not represent a number You can specify a number or a date as the value for a character column The database server converts that value to a character string For example if you specify TODAY as the value for a character column a character string repre senting today s date is used The format used is specified by the DBDATE environment variable Listing Specific Column Names You do not have to specify values for every column Instead you can list the column names after the table name and then supply values for only those col umns you named The following example inserts a new row into the stock table INSERT INTO stock stock _num description unit price manu_code VALUES 115 tyre pump 114 SHM Statements That Modify Data Notice that only the data for the stock number description unit price and manufacturer code is provided The database server supplies the values for the remaining columns e It generates a serial number for an unlisted serial column e It generates a default value for a column witha specific default associated with it e It generates a null value for any column that allows nulls but does not specify a default value or for any column that specifies null as the default value This means that you must list and supply values for all columns th
26. 260 HSK Husky 5 261 HRO Hero 4 262 SHM Shimara 30 263 KAR Karsten 21 264 NKL Nikolus 8 265 PRC ProCycle 9 You also can use rowid when you select a specific column SELECT rowid manu_code FROM manufact This SELECT statement produces these results rowid manu_code 258 ANZ 261 HRO 260 HSK 263 KAR 264 NKL 259 NRG 265 PRC 262 SHM 257 SMT 3 16 Advanced SELECT Statements Creating Advanced Joins You also can use the rowid in the WHERE clause to retrieve rows based on their internal record number This method is handy when no other unique column exists in a table SELECT FROM manufact WHERE rowid 263 This SELECT statement returns just one row manu_code manu_name lead_time KAR Karsten 21 Using the USER Function To obtain additional information about a table you can combine the rowid with the USER function and on IBM Informix OnLine with the SITENAME keyword USER and SITENAME were discussed in Chapter 2 of this manual SELECT USER username rowid FROM cust_calls This query assigns the label username to the USER expression column and returns this information about the cust_calls table username rowid zenda 257 zenda 258 zenda 259 zenda 513 zenda 514 zenda 515 zenda 769 You also can use the USER function in a WHERE clause when you select the rowid SELECT rowid FROM cust_calls WHERE user_id USER Advanced SELECT Statements 3 17 Creating Advanced Joins
27. Creating Advanced Joins customer_num lname order_num order date call dtime 14 Albertson 18 Baxter 13 Beatty 03 Currie 15 Grant 1010 06 17 1991 23 Hanlon 1020 07 11 1991 25 Henry 04 Higgins 1003 05 22 1991 04 Higgins 1001 05 20 1991 04 Higgins 1013 06 22 1991 04 Higgins 1011 06 18 1991 10 Jaeger 1015 06 27 1991 1991 07 07 10 24 10 Jaeger 1008 06 07 1991 1991 07 07 10 24 20 Jewell 1017 07 09 1991 11 Keyes 1009 06 14 1991 12 Lawson 1006 05 30 1991 09 Miller 28 Moore 26 Neelie 1022 07 24 1991 22 O Brian 1019 07 11 1991 16 Parmelee 1005 05 24 1991 1990 12 21 11 24 16 Parmelee 1005 05 24 1991 1990 11 28 13 34 01 Pauli 1002 05 21 1991 24 Putnum 1021 07 23 1991 08 Quinn 07 Ream 02 Sadler 27 Satifer 1023 07 24 1991 1991 07 31 14 30 19 Shorter 1016 06 29 1991 1991 07 01 15 00 17 Sipes 1007 05 31 1991 17 Sipes 1012 06 18 1991 05 Vector 21 Wallack 1018 07 10 1991 1991 07 10 14 05 06 Watson 1004 05 22 1991 1991 06 12 08 20 06 Watson 1014 06 25 1991 1991 06 12 08 20 Note that if the preceding SELECT statement had tried to create a join condi tion between the two subservient tables o and x as in the following example an error message would have indicated the creation of a two sided outer join WHERE o customer_num x customer_num 3 28 Advanced SELECT Statements Subqueries in SELECT Statements Subqueries in SELECT Statements A SELECT statement nested in the WHERE clause of another SELECT statement or
28. Distribution Chapter Overview 3 Network Configurations 3 The Local Area Network 4 Networking the Database Server 5 Network Transparency 7 Connecting to Data 7 Connecting in the LAN 7 Connecting Through IBM Informix NET 8 The Role of IBM Informix NET 8 Opening a Database 8 Explicit Locations Using File Specifications 9 Explicit Location by Database Server Name 10 Implicit Database Locations 10 Distributed Data 11 Naming External Tables 12 Using Synonyms with External Tables 13 Synonym Chains 14 Modifying External Tables 15 Summary 15 12 2 Networks and Distribution Chapter Overview It is easiest to think of the application the database server and the data as all being located in the same computer But many other arrangements are possi ble In some the application and the database server are in different comput ers and the data is distributed across several others This chapter discusses the possible arrangements at a conceptual level and points out some of their effects on performance and usability It covers three kinds of networks e Local area networks LANs e General networks in which applications work with database servers run ning in other generally UNIX machines e Distributed queries as implemented by IBM Informix STAR To make a practical computer network work you must master a multitude of technical details regarding hardware and software There are far too many of these details and the
29. If you are the owner of a table that is if you created it you have all privi leges on that table Otherwise you can determine the privileges you have for a certain table by querying the system catalog The system catalog consists of system tables that describe the database structure The privileges granted on each table are recorded in the systabauth system table To display these priv ileges you must also know the unique identifier number of the table This number is specified in the systables system table So to display privileges granted on the orders table you might enter the following SELECT statement SELECT FROM systabauth WHERE tabid SELECT tabid FROM systables WHERE tabname orders The output of the query resembles the following display grantor grantee tabid tabauth tfecit mutator 101 su i x tfecit procrustes 101 s idx tfecit public 101 s i x The grantor is the user who granted the privilege The grantor is usually the owner of the table but can be another user empowered by the grantor The grantee is the user to whom the privilege has been granted and the grantee public means any user with Connect privilege If your user name does not appear you have only those privileges granted to public Data Integrity The tabauth column specifies the privileges granted The letters in each row of this column are the initial letters of the privilege names except that i means Insert and x means In
30. Implementing the Model Chapter Overview 3 Defining the Domains 3 Data Types 4 Choosing a Data Type 4 Numeric Types 7 Chronological Types 12 Character Types 15 Changing the Data Type 19 Default Values 20 Check Constraints 20 Specifying Domains 21 Creating the Database 23 Using CREATE DATABASE 23 Using CREATE DATABASE with IBM Informix OnLine 23 Using CREATE DATABASE with Other IBM Informix Database Servers 25 Using CREATE TABLE 26 Using Command Scripts 28 Capturing the Schema 28 Executing the File 28 An Example 28 Populating the Tables 29 Summary 30 9 2 Implementing the Model Chapter Overview Once a data model is prepared it must be implemented as a database and tables This chapter covers the decisions that you must make to implement the model The first step in implementation is to complete the data model by defining a domain or set of data values for every column The second step is to imple ment the model using SQL statements The first section of the chapter covers defining domains in detail The second section shows how you create the database using the CREATE DATABASE and CREATE TABLE commands and populate it with data Defining the Domains To complete the data model described in Chapter 8 of this book you must define a domain for each column The domain of a column is the set of all data values that can properly appear in that column The purpose of a domain is to guard the semantic int
31. Received Hero watches of ANZ watches item 304 instead Sent memo to shipping to send ANZ item 304 to customer and pickup HRO watches Should be done tomorrow 8 1 A natural join is structured so that the join column does not display data redundantly as in the following example SELECT manu_name FROM manufact WHERE manufact manu_code lead_time stock stock stock manu_code Simple SELECT Statements 2 65 Multiple Table SELECT Statements Like the previous example this SELECT statement joins the manufact and stock tables on the manu_code column but because the select list is more closely defined the manu_code is listed only once for each row retrieved manu_name Smith lead_time 3 stock num 1 manu_code SMT description baseball gloves unit_price 450 00 unit case unit descr 10 gloves case manu_name Smith lead_time 3 stock num 5 manu_code SMT description tennis racquet unit price 25 00 unit each unit descr each manu_name Smith lead_time 3 stock num 6 manu_code SMT description tennis ball unit price 36 00 unit case unit descr 24 cans case manu_name Anza lead_time 5 stock_num 5 manu_code ANZ description tennis racquet unit price 19 80 unit each unit descr each 2 66 Simple SELECT Statements Multiple Table SELECT Statements All joins are associative that is the order of the joining terms in the WHERE clause does not affect the meaning of the join
32. SQL is com posed of statements each of which begins with one or two keywords that specify a function SQL includes about 67 statements from ALLOCATE DESCRIPTOR to WHENEVER Database Fundamentals 1 15 Structured Query Language All of the SQL statements are specified in detail in the IBM Informix Guide to SQL Reference Most of the statements are used infrequently while setting up or tuning a database Most people spend their time using three or four statements at most One statement SELECT is in almost constant use It is the only statement with which you can retrieve data from the database It is also the most complicated of the statements and all of the next two chapters of this book are devoted to exploring its many uses Standard SOL SQL and the relational model were invented and developed at IBM in the early and middle 1970s Once IBM proved that it was possible to implement practical relational databases and that SQL was a usable language for control ling them other vendors began to provide similar products for non IBM computers For reasons of performance or competitive advantage or to take advantage of local hardware or software features each of these SOL implementations differed in small ways from each other and from the IBM version of the lan guage To ensure that the differences remained small a standards committee was formed in the early 1980s Committee X3H2 sponsored by the American National Standards
33. WHERE quantity gt 3 ORDER BY 2 INTO TEMP stockitem This compound SELECT statement uses the UNION ALL keywords to unite two SELECT statements and puts the results into a temporary table by adding an INTO TEMP clause after the final SELECT It returns the same rows as the preceding example but also includes duplicate values stock num manu_code 9 ANZ 5 ANZ 9 ANZ 5 ANZ 9 ANZ 5 ANZ 5 ANZ 5 ANZ 3 40 Advanced SELECT Statements Set Operations Corresponding columns in the select lists for the combined queries must have identical data types but the columns do not need to use the same identifier SELECT DISTINCT state FROM customer WHERE customer_num BETWEEN 120 AND 125 UNION SELECT DISTINCT code FROM state WHERE sname MATCHES a This SELECT statement selects the state column from the customer table and the corresponding code column from the state table It returns state code abbreviations for customer numbers 120 through 125 or for states whose sname ends in Aor a state AK AL AZ CA DE FL GA IA IN LA MN MT NC ND NE NJ OK PA sc SD VA Advanced SELECT Statements 3 41 Set Operations In compound queries the column names or display labels in the first SELECT statement are the ones that appear in the results Thus in this example the column name state from the first SELECT statement was used instead of the column name code from the second This SELECT statement p
34. You also can use the CURRENT function to return a value with the current date and time or the EXTEND function to adjust the precision of a DATE or DATETIME value Simple SELECT Statements 2 49 2 50 Single Table SELECT Statements Using DAY and CURRENT SELECT customer _num DAY call _dtime DAY res _dtime FROM cust_calls This SELECT statement returns the day of the month for the call_dtime and res_dtime columns in two expression columns customer num expression expression 106 12 12 110 7 T 119 T 2 121 10 10 127 31 116 28 28 116 21 27 SELECT customer_num DAY call_dtime DAY res_dtime FROM cust_calls WHERE DAY call_dtime lt DAY CURRENT This SELECT statement uses the DAY and CURRENT functions to compare col umn values to the current day of the month It selects only those rows where the value is earlier than the current day customer_num expression expression 106 12 12 110 7 7 119 1 2 Simple SELECT Statements Single Table SELECT Statements SELECT customer _num call code call descr FROM cust_calls WHERE call dtime lt CURRENT YEAR TO DAY This query shows another use of the CURRENT function selecting rows where the day is earlier than the current one customer_num 106 cal cal code D _descr Order was received but two of the cans of ANZ tennis balls within the case were empty customer_num 116 cal cal code I _descr Received plain white
35. data can sometimes be slower than updates of a fixed length field You can mitigate this effect by specifying r as a size that covers a high pro portion of the data items Then most rows use the reserve length only a little space is wasted in padding and updates are only slow when a nor mal value is replaced with one of the rare longer ones Implementing the Model 9 17 Defining the Domains Large Character Objects TEXT The TEXT data type stores a block of text It is designed to store self contained documents business forms program source or data files or memos Although you can store any data at all in a TEXT item IBM Informix tools expect that a TEXT item is printable so this data type should be restricted to printable ASCII text TEXT values are not stored with the rows of which they are a part They are allocated in whole disk pages usually areas away from rows See Locating Blob Data on page 10 19 How Blobs Are Used Collectively columns of type TEXT and BYTE are called Binary Large Objects or blobs The database server only stores and retrieves them Nor mally blob values are fetched and stored by programs written using IBM Informix 4GL or a language that supports embedded SQL such as IBM Informix ESQL C In such a program you can fetch insert or update a blob value in a manner similar to the way you read or write a sequential file In any SQL statement interactive or programmed a blob column c
36. effect of 4 23 multiple arms to reduce 10 7 Disk extent 10 8 Disk mirroring 10 5 Disk page buffer for 4 23 4 25 size of 4 23 10 4 Display label in ORDER BY clause 2 46 DISTINCT keyword relation to GROUP BY 3 4 restrictions in modifiable view 11 26 use in SELECT 2 20 with COUNT function 2 48 Distributed data 12 11 to 12 15 Distributed deadlock 7 29 Documentation notes Intro 21 Documentation types of documentation notes Intro 21 machine notes Intro 21 release notes Intro 21 DROP INDEX statement locks table 7 21 releasing an index 4 32 Index 5 6 Index Duplicate index keys 10 23 Dynamic SQL cursor use with 6 29 description of 6 5 6 26 freeing prepared statements 6 31 E Embedded SQL defined 6 4 languages available 6 4 End of data signal in SQLCODE 6 10 6 15 signal only for SELECT 7 14 when opening cursor 6 18 Entity integrity 5 18 naming 8 8 represented by a table 8 9 Environment variables Intro 11 Equals relational operator 2 28 2 62 Equi join 2 62 Errors after DELETE 7 4 codes for 6 10 dealing with 6 15 detected on opening cursor 6 18 during updates 5 21 inserting with a cursor 7 11 ISAM error code 6 11 ESQL cursor use 6 17 to 6 25 DELETE statement in 7 3 delimiting host variables 6 6 dynamic embedding 6 5 6 26 error handling 6 15 fetching rows from cursor 6 19 host variable 6 6 6 7 indicator variable 6 14 INSERT in 7 8 overview 6 3 to 6 35 7 3 to 7 33 preprocessor 6 4 scroll cursor
37. in each table To create a join you must specify a relationship called a join condition between at least one column from each table Because the columns are being compared they must have compatible data types When you join large tables performance will be better when the columns in the join condition are indexed Data types are described in Chapter 3 of IBM Informix Guide to SQL Reference and indexing is discussed in Chapters 4 and 10 of this manual Creating a Cartesian Product When you perform a multiple table query that does not explicitly state a join condition among the tables you create a Cartesian product A Cartesian prod uct consists of every possible combination of rows from the tables This is usually a very large unwieldy result and the data will not be accurate This SELECT statement selects from two tables and produces a Cartesian product SELECT FROM customer state 2 60 Simple SELECT Statements Multiple Table SELECT Statements Although there are only 52 rows in the state table and 28 rows in the cus tomer table the effect of this SELECT statement is to multiply the rows of one table by the rows of the other and retrieve an impractical 1456 rows customer num 101 fname Ludwig lname Pauli company All Sports Supplies address1 213 Erstwild Court address2 city Sunnyvale state CA zipcode 94086 phone 408 789 8075 code AK sname Alaska customer num 101 fname Ludwig lname
38. ple a document file as stored by a word processing program may contain very detailed structures describing the format of the document However only the word processing program itself can decipher the contents of the file because the structure is defined within the program not within the file A data model however is contained in the database it describes It travels with the database and is available to any program that uses the database The model defines not only the names of the data items but their data types as well so a program can adapt itself to the database For example a program can find out that in the current database a price item is a decimal number with eight digits two to the right of the decimal point Then it can allocate storage for anumber of that type How programs work with databases is the subject of Chapters 6 and 7 in this manual Querying Data Yet another difference between a database and a file is in the way you can interrogate them You can search a file sequentially looking for particular val ues at particular physical locations in each record That is you might ask of a file What records have numbers under 20 in the fifth field of each record Figure 1 2 illustrates this type of search 1 6 Database Fundamentals Figure 1 2 Databases What and Why 80 1015 Ea T ase tig racquet o 0 00 1 127e tennisbals 8 00 1012 06 18 91 1 case volleyballs 840 00 1011 06 18
39. semantic integrity is lost Splitting Tall Tables 10 30 Tuning the Model A large table poses large management problems The 400 megabyte table takes a long time to query of course but it also takes a long time to back up or restore Sorting becomes radically slower because the sort goes to three or more merge levels sorting can even become impossible because too much disk space is required Indexes become less effective because the index struc ture has three or more intermediate levels Consider splitting such a table into segments Each segment has the same arrangement of columns indexes and constraints but a different subset of rows The division into groups of rows should be based on the value of an attribute that appears in most queries probably the primary key so that a program or user can easily tell in which subtable a row belongs For example if the primary key is a number rows can be allocated to ten subtables based on a middle digit If rows include a time or date attribute it might be useful to split a table into segments by age especially if recent rows are used more often than older ones The benefits of splitting a large table are that the segments can be treated sep arately for copying sorting indexing archiving and restoring All these operations become easier The segments can be assigned to tblspaces in dif ferent ways to make the best use of disk devices And as long as most queries are based on the a
40. the data that is returned for one item in the select list The program can exam ine the array and discover that a row of data includes a decimal value a char acter value of a certain length and an integer Using this information the program can allocate memory to hold the retrieved values and put the necessary pointers in the data structure for the database server to use Freeing Prepared Statements A prepared SQL statement occupies space in memory With some database servers it can consume space owned by the database server as well as space belonging to the program This space is released when the program termi nates but in some programs you might want to release it earlier You can use the FREE statement to release this space It takes either the name of a statement or the name of a cursor that was declared FOR a statement name and releases the space allocated to the prepared statement SQL in Programs 6 31 Embedding Data Definition Quick Execution For simple statements that do not require a cursor or host variables you can combine the actions of the PREPARE EXECUTE and FREE statements into a single operation The EXECUTE IMMEDIATE statement takes a character string and in one operation prepares it executes it and frees the storage EXECUTE IMMEDIATE drop index my_temp_index This makes it easy to write simple SQL operations However since no USING clause is allowed the EXECUTE IMMEDIATE statement can
41. when you want informa tion about multiple entities you must join their tables There are many differ ent ways of joining tables The join operation is the subject of Chapter 3 of this manual 1 14 Database Fundamentals Structured Query Language stock Table stock num manu_code description unit_price unit unit_descr 1 HRO baseball gloves 250 00 case 10 gloves case 1 HSK baseball gloves 800 00 case 10 gloves case 1 SMT baseball gloves 450 00 case 10 gloves case 2 HRO baseball 126 00 case 24 case SELECTION 3 HSK baseball bat 240 00 case 12 case 4 HSK football 960 00 case 24 case 4 HRO football 480 00 case 24 case 5 NRG tennis racquet 28 00 each each P R O J E C T O N Figure 1 6 Illustration of selection and projection Structured Query Language Computer software has not yet reached a point where you can literally ask a database what orders have been placed by customers in New Jersey with ship dates in the second quarter You must still phrase questions in a restricted syntax that the software can easily parse You can pose the same question to the demonstration database in the following terms SELECT FROM customer orders WHERE customer customer_num orders customer_num AND customer state NJ AND orders ship date BETWEEN DATE 7 1 91 AND DATE 7 30 91 This question is a sample of the Structured Query Language SQL It is the language that you use to direct all operations on the database
42. 1 p 2 day p to hour 2 p 2 minute p to second 2 p 2 day p to minute 3 p 2 minute p to fraction f 2 p f 2 day p to second 4 p 2 second p to second 1 p 2 day p to fraction f 4 p f 2 second p to fraction f 1 p f 2 hour p to hour 1 p 2 fraction to fraction f 1 f 2 Round a fractional size to the next full byte Figure 9 4 All possible precisions of the INTERVAL data type with their sizes in bytes INTERVAL values can be negative as well as positive You can add or subtract them and you can scale them by multiplying or dividing by a number This is not true of either DATE or DATETIME It is reasonable to ask What is one half the number of days until April 23 but it is not reasonable to ask What is one half of April 23 9 14 Implementing the Model Defining the Domains Character Types All Informix database servers support the CHAR n data type IBM Informix OnLine supports three other data types that have special uses Character Data CHAR n The CHAR n data type contains a sequence of n ASCII characters The length n ranges from 1 to 32 511 Forcing the Format of a DATETIME or INTERVAL Value The database server always displays the components of an INTERVAL or DATETIME value in the order year month day hour minute second fraction It does not refer to the date format defined to the operating system as it does when formatting a DATE You can write a SELECT statement that displays the date p
43. 1 ratio 4 40 Optimizing Your Queries Summary Summary Note IBM Informix database servers earlier than version 4 1 do not permit you to use the ORDER BY and INTO TEMP clauses in the same query With these database servers you can achieve the preceding solution by selecting INTO TEMP without ordering then applying the desired ordering through a clustered index The improve ment is at most 15 to 1 rather than of 30 to 1 Poor performance can come from a number of sources not solely the SQL operations in a program Before you focus your attention on the code take the following steps e Examine the application in its context of machines people procedures and organization e Understand exactly what the application does for whom and why e Look for nontechnical solutions in the surrounding context e Develop a means of taking repeatable quantitative measurements of the performance of the application e Isolate the time consuming parts as narrowly as possible The performance of an individual query is determined by the optimizer a part of the database server that formulates the query plan the order in which tables are read from disk The optimizer exhaustively lists all possible query plans and estimates the amount of work each causes It passes the one with the lowest estimate to the database server for execution The following operations in a query are time consuming e Reading rows from disk sequentially nonsequ
44. 15 character data 9 15 choosing 9 19 chronological 9 12 conversion 5 8 6 13 DATE 9 12 DATETIME 9 13 DECIMAL 9 10 9 11 fixed point 9 11 floating point 9 9 INTEGER 9 7 INTERVAL 9 14 MONEY 9 11 numeric 9 7 REAL 9 9 SERIAL 9 7 SMALLFLOAT 9 9 TEXT 9 18 VARCHAR 9 16 Database application 1 17 archiving 1 12 concurrent use 1 9 current 12 12 defined 1 3 external 12 12 management of 1 11 mission critical 1 12 naming unique to engine 9 23 populating new tables 9 29 relation to dbspace 10 5 server 1 17 stores5 Intro 6 Database administrator DBA 11 7 Database lock 7 21 Database server definition of 1 17 DATABASE statement exclusive mode 7 21 explicit pathname 12 9 explicit sitename 12 10 locking 7 21 SQLAWARN after 6 11 with IBM Informix NET 12 8 Database level privilege description of 5 15 See also Privilege DATE data type description of 9 12 display format 9 13 functions in 2 49 in ORDER BY sequence 2 14 DATE function as time function 2 49 use in expression 2 54 DATETIME data type 4GL example 4 6 description of 9 13 displaying format 2 54 9 15 functions on 2 49 in ORDER BY sequence 2 14 relational expressions 2 27 precision and size 9 13 DAY function as time function 2 50 use as time function 2 49 DBANSIWARN environment variable 6 9 DBDATE environment variable 5 8 9 13 dbload utility loading data into a table 9 29 10 12 DBMONEY environment variable 9 12 DBPATH environment variable 12 10 12 11 dbs
45. 20 00 104 PRC 58 00 105 PRC 53 00 105 SHM 80 00 109 PRC 30 00 109 SHM 200 00 110 ANZ 244 00 110 HRO 260 00 110 HSK 308 00 110 PRC 236 00 110 SHM 228 00 111 SHM 499 99 114 PRC 120 00 201 ANZ 75 00 201 KAR 90 00 201 NKL 37 50 202 KAR 230 00 202 NKL 174 00 204 KAR 45 00 205 ANZ 312 00 205 HRO 312 00 205 NKL 312 00 301 ANZ 95 00 301 HRO 42 50 301 KAR 87 00 301 NKL 97 00 301 PRC 75 00 301 SHM 102 00 302 HRO 4 50 302 KAR 5 00 303 KAR 36 00 303 PRC 48 00 304 ANZ 170 00 304 HRO 280 00 306 PRC 160 00 306 SHM 190 00 307 PRC 250 00 309 HRO 40 00 309 SHM 40 00 3 46 Advanced SELECT Statements Set Operations Difference The difference between two sets of rows produces a table containing rows in the first set that are not also in the second set Use the keywords NOT EXISTS or NOT IN to introduce subqueries that show the difference between two sets Figure 3 3 illustrates the difference set operation SELECT stock _num manu_code unit price FROM stock WHERE stock_num NOT IN stock num SELECT stock num FROM items ORDER BY stock_num exists in notin stock table items table items table exists in stock table qualifies stock_num items table not in stock table Figure 3 3 The difference set operation The following example of a nested SELECT statement shows the difference between the stock and items tables SELECT stock_num manu_
46. 25 119 07 01 15 00 07 02 08 21 110 07 07 10 24 07 07 10 30 121 07 10 14 05 07 10 14 06 116 11 28 13 34 11 28 16 47 116 12 21 11 24 12 27 08 19 2 54 Simple SELECT Statements Single Table SELECT Statements Using the DATE Function This query retrieves DATETIME values only when call_dtime is later than the specified DATE SELECT customer num FROM cust_calls WHERE call _dtime gt DATE 12 31 90 call _dtime res _dtime It returns these rows customer _num call_dtime res dtime 106 110 119 121 127 1991 06 12 08 20 1991 07 07 10 24 1991 07 01 15 00 1991 07 10 14 05 1991 07 31 14 30 1991 06 12 08 25 1991 07 07 10 30 1991 07 02 08 21 1991 07 10 14 06 SELECT customer num DATE call_dtime DATE res _dtime FROM cust_calls WHERE call _dtime gt DATE called resolved 1 1 91 Here the SELECT statement converts DATETIME values to DATE format and displays the values with labels only when call_dtime is greater than or equal to the specified date customer num called resolved 106 06 12 1991 06 12 1991 110 07 07 1991 07 07 1991 119 07 01 1991 07 02 1991 121 07 10 1991 07 10 1991 127 07 31 1991 Other Functions and Keywords You also can use the LENGTH USER CURRENT and TODAY functions any where in an SQL expression that you would use a constant In addition with IBM Informix OnLine you can include the SITENAME keyword in a SELECT statement to display the name of th
47. 35 buffered log 9 24 clustered index 10 25 defragmenting a dbspace 10 11 depends on concurrency 7 17 disk access 4 22 4 24 4 32 disk access by rowid 4 25 disk arm motion 10 8 disk latency 4 24 dropping indexes to speed modifications 10 24 duplicate keys slow modifications 10 23 effect of BLOB location 10 19 effect of correlated subquery 4 34 effect of filter expression 4 10 4 35 effect of index damage 4 34 effect of indexes 4 12 10 22 to 10 23 effect of locking 7 18 effect of optimizer 4 8 effect of regular expressions 4 35 effect of table size 4 26 4 32 effect of updates 4 34 filter selectivity 4 17 fragmentation 10 11 hot spots finding 4 7 how indexes affect 4 25 improved by specifying optimization level 4 14 improved with temporary table 4 36 improving 4 29 index time during modification 10 21 journal updates 10 34 measurement 4 6 multiple access arms per table 10 7 network access 4 26 nonsequential access 4 25 of a LAN 12 5 optimizing 4 3 to 4 42 references to other books 4 3 row access 4 23 seek time 4 24 sequential access 4 24 4 32 sorting replaces nonsequential access 4 37 splitting tall tables 10 30 splitting wide tables 10 29 time costs of query 4 20 use of derived data 10 31 use of redundant data 10 32 Performance analysis 80 20 rule 4 7 measurement 4 6 methods 4 29 to 4 31 nonsequential access 4 37 to 4 40 optimizing techniques 4 4 setting up test environment 4 29 timing from 4GL progra
48. 415 534 8822 Sipes Redwood City CA 415 245 4578 Baxter Oakland CA 415 655 0011 Neelie Denver CoO 303 936 7731 Wallack Wilmington DE 302 366 7511 Hanlon Jacksonville FL 904 823 4239 Henry Brighton MA 617 232 4159 Satifer Blue Island NY 312 944 5691 Putnum Bartlesville OK 918 355 2074 2 32 Simple SELECT Statements Single Table SELECT Statements Identifying NULL Values Use the IS NULL or IS NOT NULL option to check for NULL values A NULL represents either a value that is unknown or not applicable or the absence of data A NULL value is not the same as a zero or blank SELECT order_num customer_num po_num ship date FROM orders WHERE paid _date IS NULL ORDER BY customer_num This SELECT statement returns all rows that have a NULL paid_date order num customer_num po_num ship date 1004 106 8006 05 30 1991 1006 112 Q13557 1007 117 278693 06 05 1991 1012 117 278701 06 29 1991 1016 119 PC6782 07 12 1991 1017 120 DM354331 07 13 1991 Forming Compound Conditions You can connect two or more comparison conditions or Boolean expressions by using the logical operators AND OR and NOT A Boolean expression eval uates as true or false or if NULL values are involved as unknown You can use TEXT or BYTE objects in a Boolean expression only when you test for a NULL value Here the operator AND combines two comparison expressions in the WHERE clause SELECT order_num customer_num po_num ship date FROM orders
49. 6 20 selecting single rows 6 11 SQL Communications Area 6 7 SQLCODE 6 10 SQLERRD fields 6 11 static embedding 6 5 UPDATE in 7 14 Estimating blobpages 10 18 maximum number of extents 10 10 size of index 10 16 table size with fixed length rows 10 13 table size with variable length rows 10 15 Exclusive lock 7 20 EXECUTE IMMEDIATE statement description of 6 32 EXECUTE statement description of 6 29 EXISTS keyword in a WHERE clause 3 29 use in condition subquery 11 28 Expression date oriented 2 49 description of 2 41 display label for 2 44 EXTEND function with DATE DATETIME and INTERVAL 2 49 2 54 Extended Relational Analysis basic ideas 8 6 overview 8 3 steps defined 8 8 to 8 24 9 19 to 9 22 table diagram format 8 11 Extent description of 10 8 sizes of 10 9 upper limit on 10 10 EXTENT SIZE keywords 10 9 External database 12 12 External table use of synonyms 12 13 F FETCH statement ABSOLUTE keyword 6 21 description of 6 19 sequential 6 21 with sequential cursor 6 22 File compared to database 1 3 permissions in UNIX 11 4 server 12 4 Filter expression effect on performance 4 10 4 35 evaluated from index 4 16 4 33 optimizer uses 4 10 4 15 selectivity estimates 4 17 Fixed point 9 11 FLOAT data type description of 9 9 Floating point 9 9 FLUSH statement count of rows inserted 7 11 writing rows to buffer 7 10 FOR UPDATE keywords conflicts with ORDER BY 7 8 not needed in ANSI compliant database 7 16 spec
50. 8 2 Building a Data Model Chapter Overview The first step in creating a database is to construct a data model a precise complete definition of the data to be stored This chapter contains a cursory overview of one method of doing this The chapters that follow describe how to implement a data model once you design it Why Build a Data Model A data model is a precise complete definition of the data you plan to store You probably already have an intuitive model of the data in mind but you should complete it using some type of formal notation This helps your design in two ways e It makes you think through the data model completely A mental model often contains unexamined assumptions formalizing the design reveals these points e Itis easier to communicate your design to other people A formal statement makes the model explicit so that others can return comments and suggestions in the same form Extended Relational Analysis Different books present different formal methods of modeling data Most methods force you to be thorough and precise If you have already learned some method by all means use it This chapter presents a summary of Extended Relational Analysis a modeling method devised by Relational Systems Corporation This modeling method is carried out in three steps 1 Identify the entities fundamental objects that the database describes 2 Identify the relationships between the entities Building a Dat
51. After you prepare an UPDATE or DELETE statement it is a good idea to test the fifth field of SOLAWARN to see if you used a WHERE clause see The SQLA WARN Array on page 6 11 SQL in Programs 6 27 Dynamic SQL Figure 6 7 6 28 SQL in Programs The result of preparing a statement is a data structure that represents the statement This data structure is not the same as the string of characters that produced it In the PREPARE statement you give a name to the data structure it is query_2 in the preceding example This name is used to execute the pre pared SQL statement The PREPARE statement does not limit the character string to one statement It may contain multiple SQL statements separated by semicolons A fairly complex example in IBM Informix ESQL COBOL is shown in Figure 6 7 EXEC SQL MOVE BEGIN WORK UPDATE account SET balance balance WHERE acct _number 27 UPDATE teller SET balance balance WHERE teller number UPDATE branch SET balance balance WHERE branch number INSERT INTO history VALUES timestamp values COMMIT WORK TO BIG QUERY END EXEC EXEC SQL PREPARE BIG Q FROM BIG QUERY END EXEC Preparing a string containing five SQL statements When this list of statements is executed host variables must provide values for six place holding question marks While it is more complicated to set up a multistatement list the performance is often better because fewer exch
52. IBM Informix ESQL C program that constructs prepares and executes SQL statements dynamically For example it enables its users to specify the col umns of a table using simple interactive menus When the user is finished DB Access builds the necessary CREATE TABLE or ALTER TABLE statement dynamically and prepares and executes it Preparing a Statement In form a dynamic SQL statement is like any other SQL statement that is writ ten into a program except that it cannot contain the names of any host variables This leads to two restrictions First if it is a SELECT statement it cannot include the INTO clause That clause names host variables into which column data is placed and host variables are not allowed in a dynamic statement Second wherever the name of a host variable normally appears in an expres sion a question mark is written as a placeholder You can prepare a statement in this form for execution with the PREPARE statement Here is an example in IBM Informix ESQL C prepare query 2 from select from orders where customer num and order date gt There are two question marks in this example indicating that when the state ment is executed the values of host variables are used at those two points You can prepare almost any SQL statement dynamically The only ones that cannot be prepared are the ones directly concerned with dynamic SQL and cursor management such as the PREPARE and OPEN statements
53. Prepared SELECT Statements 29 Dynamic Host Variables 31 Freeing Prepared Statements 31 Quick Execution 32 Embedding Data Definition 32 Embedding Grant and Revoke Privileges 32 Summary 35 6 2 SQL in Programs Chapter Overview In the examples in the chapters thus far SQL is treated as if it were an inter active computer language that is as if you could type a SELECT statement directly into the database server and see rows of data rolling back to you Of course that is not how things are Many layers of software stand between you and the database server The database server retains data in a binary form that must be formatted before it can be displayed It does not return a mass of data at once it returns one row ata time as some program requests it DB Access and IBM Informix SQL are two programs that perform this request ing and format and display the data They are designed to give you interac tive access to SQL Other programs are written for a specific application Such programs can be written in any of several languages Almost any program can contain SQL statements execute them and retrieve data from a database server This chapter explains how these activities are performed and indicates how you can write programs that perform them This chapter is only an introduction to the concepts that are common to SQL programming in any language Before you can write a successful program in a particular programming language y
54. Rows from Views It is possible for a view to produce duplicate rows even when the underlying table has only unique rows If the view SELECT statement can return dupli cate rows then the view itself can appear to contain duplicate rows You can prevent this problem in two ways One way is to specify DISTINCT in the select list in the view However that makes it impossible to modify through the view The alternative is to always select a column or group of Security Stored Procedures and Views 11 23 Using Views columns that is constrained to be unique You can be sure only unique rows are returned if you select the columns of a primary key or of a candidate key Primary and candidate keys are discussed in Chapter 8 Restrictions on Views Since a view is not really a table it cannot be indexed and it cannot be the object of such statements as ALTER TABLE and RENAME TABLE The columns of a view cannot be renamed with RENAME COLUMN To change anything about the definition of a view you must drop the view and re create it Because it must be merged with the user s query the SELECT statement on which a view is based cannot contain any of the following clauses INTO TEMP The user s query might contain INTO TEMP if the view con tains it also the data would not know where to go UNION The user s query might contain UNION indeed the query on the view might appear in a UNION clause in the user s query No meaning has b
55. Statements Creating Advanced Joins Outer Join for an Outer Join to a Third Table This SELECT statement creates an outer join that is the result of an outer join to a third table This third type is known as a nested outer join SELECT c customer_num lname o order_ num stock num manu_code quantity FROM customer c OUTER orders o OUTER items i WHERE c customer_num o customer_num AND o order_num i order_num AND manu_code IN KAR SHM ORDER BY lname This query first performs an outer join on the orders and items tables retriev ing information on all orders for items with a manu_code of KAR or SHM It then performs an outer join which combines this information with data from the dominant customer table This query preserves order numbers that the previous example eliminated returning rows for orders that do not contain items with either manufacturer code An optional ORDER BY clause reorganizes the data Advanced SELECT Statements 3 25 Creating Advanced Joins customer_num lname order _num stock num manu_code quantity 14 Albertson 18 Baxter 13 Beatty 03 Currie 15 Grant 1010 23 Hanlon 1020 204 KAR 2 23 Hanlon 1020 301 KAR 4 25 Henry 04 Higgins 1011 04 Higgins 1001 04 Higgins 1013 04 Higgins 1003 10 Jaeger 1008 10 Jaeger 1015 20 Jewell 1017 301 SHM 2 20 Jewell 1017 202 KAR 1 11 Keyes 1009 12 Lawson 1006 28 Lessor 09 Miller 26 Neelie 1022 22 O Brian 1019 111 SHM 3 16 Parmelee 1005 01 P
56. This query returns the rowid for only those rows entered by the user who entered the statement For example if the user riche entered this SELECT statement this would be the output rowid 258 259 Using the SITENAME Function Add the DBSERVERNAME keyword to a query to find out where the current database resides SELECT DBSERVERNAME server tabid rowid USER username FROM systables WHERE tabid gt 105 OR rowid lt 260 ORDER BY rowid This SELECT statement finds the server name and the user name as well as the rowid and the tabid which is the serial interval table identifier for system cat alog tables It assigns display labels to the DBSERVERNAME and USER expres sions and returns these 10 rows from the systables system catalog table server tabid rowid username manatee 1 257 zenda manatee 2 258 zenda manatee 3 259 zenda manatee 4 260 zenda manatee 105 274 zenda manatee 106 1025 zenda manatee 107 1026 zenda manatee 108 1027 zenda manatee 109 1028 zenda manatee 110 1029 zenda Note that you should never store a rowid in a permanent table or attempt to use it as a foreign key because the rowid can change For example if a table is dropped and then reloaded from external data all the rowids will be different 3 18 Advanced SELECT Statements Creating Advanced Joins Outer Joins Chapter 2 showed how to create and use some simple joins Whereas a simple join treats two or more joined tables equally an ou
57. a column contains strings that are not unique in each row you can remove those strings to a table in which only unique copies are stored For example the customer city column contains city names Some city names are repeated down the column and most rows have some trailing blanks in the field Using the VARCHAR data type eliminates the blanks but not the duplication You can create a table named cities as follows CREATE TABLE cities city num SERIAL PRIMARY KEY city name VARCHAR 40 UNIQUE Then you can change the definition of the customer table so that its city col umn becomes a foreign key that references the city_num column in the cities table You must change any program that inserts a new row into customer to insert the city of the new customer into cities The database server return code in the SQLCODE field can indicate that the insert failed because of a duplicate key It is not a logical error it simply means that some existing customer is located in that city However a 4GL program must use the WHENEVER com mand to trap errors otherwise the negative value in SQLCODE terminates the program Besides changing programs that insert data you also must change all pro grams and stored queries that retrieve the city name They must use a join into the new cities table to obtain their data The extra complexity in pro grams that insert rows and the extra complexity in some queries is the cost of giving up theore
58. a file or a database In a file it is simply a number that occurs at a certain point in the file A number ina data base however has a role assigned to it by the data model It may be a price Database Fundamentals 1 3 Databases What and Why that is associated with a product that was sold as one item of an order that was placed by a customer Each of these things prices products items orders and customers are also roles specified by the data model See Figure 1 1 The data model is designed when the database is created then units of data are inserted according to the plan laid out in the model In some books the term schema is used instead of data model 1 4 Database Fundamentals Databases What and Why 1015 06 27 91 1 case baseball 1014 06 25 91 1 case footballs 1013 06 22 91 1 each tennis racquet 19 80 1012 06 18 91 1 case volleyballs 840 00 1011 06 18 91 5 each tennis racquet 99 00 1010 06 17 91 1 case tennis balls 36 00 ORDERS order 1013 09 01 91 19 80 i WS Figure 1 1 Illustration of a data model Database Fundamentals 1 5 Databases What and Why Storing Data Another difference between a database and a file is that the organization of the database is stored with the database A file may have a complex inner structure but the definition of that structure is not within the file it is in the programs that create or use the file For exam
59. a language entities would be its nouns The first step in modeling is to choose the entities to record Each one becomes a table in the model You probably can list several entities immediately However if other people use the database you should poll them for their understanding of what kinds of fundamental things the database should contain 8 8 Building a Data Model Step 1 Name the Entities When the list of entities seems complete prune it by making sure that each one has the following qualities e Itis significant List only entities that are important to the users of the database and worth the trouble and expense of computer tabulation e Itis generic List only types of things not individual instances For instance symphony might be an entity but Beethoven s Fifth would be an instance e Itis fundamental List only entities that exist independently without needing something else to explain them Anything you could call a trait a feature or a description is merely an attribute not an entity For example a part num ber cannot exist without a more fundamental part entity Also do not list things that you can derive from other entities avoid for example any sum average or other quantity that you can calculate in a SELECT expression e Itis unitary Be sure that each entity you name represents a single class that it cannot be broken down into subcategories each with its own features In plan
60. a person for some busy sales man you know a home number an office number a paging number and a car phone But there also can be names with zero associated numbers You write 0 n opposite name and below number voice as shown in the following diagram name address number voice name none 0 n 0 1 0 n What of the other side of this relationship How many names can be associ ated with a voice number More than one name certainly your address book shows several people at one company for which there is a single number for incoming calls Can a number be associated with zero names No you decide there is no point recording a number unless it is used by somebody you know You write 1 m under number voice and opposite name You use m to show that this represents a different greater than 1 quantity than the n already noted in that cell name address number voice name none 0 n 1 m 0 1 0 n This is a many to many or m n relationship On one side it does not allow zero which means that when it is translated to a column definition no nulls are allowed Fill out the rest of the matrix in the same fashion as shown in Figure 8 7 Building a Data Model 8 17 Step 2 Define the Relationships name address number number number voice fax modem name none 0 n 1 m 1 m 1 0 1 0 n 0 n 0 n address none none 0 1 0 1 0 n 0 n number none 0 1 none voice 0 1
61. after you create the table 11 8 Security Stored Procedures and Views Granting Privileges Access Privileges Four privileges govern how users can access a table As the owner of the table you can grant or withhold these privileges independently e Select privilege allows selection including selecting into temporary tables e Insert privilege allows a user to add new rows e Update privilege allows a user to modify existing rows e Delete privilege allows a user to delete rows Select privilege is necessary for a user to retrieve the contents of a table How ever Select privilege is not a precondition for the other privileges A user can have Insert or Update privileges even when lacking Select privilege Privileges in the System Catalog Privileges are recorded in the system catalog tables Any user with Con nect privilege can query the system catalog tables to determine what privileges have been granted and to whom Database privileges are recorded in the sysusers table in which the pri mary key is user id and the only other column contains a single character C R or D for the privilege level A grant to the keyword of PUBLIC is reflected as a user name of public lowercase Table level privileges are recorded in systabauth which uses a compos ite primary key of the table number grantor and grantee In the tabauth column the privileges are encoded in a six letter list as follows unconditional Updat In
62. as in this example UPDATE call response SET user_id lenora WHERE received BETWEEN TODAY AND TODAY 7 The view requires rows in which user_id equals USER If this update is per formed by a user named tony the updated rows vanish from the view How ever you can create the view as shown in this example CREATE VIEW call response user_id received resolved duration AS SELECT user_id call_dtime res dtime res dtime call_dtime FROM cust_calls WHERE user_id USER WITH CHECK OPTION Then the preceding update by tony is rejected as an error You can use the WITH CHECK OPTION feature to enforce any kind of data constraint that can be stated as a Boolean expression For example create a view of a table in which all the logical constraints on data are expressed as conditions of the WHERE clause Then require all modifications to the table to be made through the view CREATE VIEW order_insert AS SELECT FROM orders O WHERE order date TODAY no back dated entries AND EXISTS ensure valid foreign key SELECT FROM customer C WHERE O customer_num C customer_num AND ship weight lt 1000 reasonableness checks AND ship charge lt 1000 WITH CHECK OPTION Because of EXISTS and other tests all of which are expected to be successful when retrieving existing rows this is a most inefficient view for displaying data from orders However if insertions to orders are made only through this 11 28 Security Stor
63. at the responder gets longer And the odds of a page remaining in the responder buffer become worse Thus network access costs can change quite suddenly from very low to extremely high The optimizer that IBM Informix OnLine uses assumes that access to a row over the network takes longer than access to a row in a local database The optimizer has no way to account for varying network loads so it is too pes simistic at times and too optimistic at others Making Queries Faster In general you can speed up a query by changing it so that it e Reads fewer rows e Avoids a sort sorts fewer rows or sorts on a simpler key e Reads rows sequentially instead of nonsequentially The way to achieve these ends is not always obvious The specific methods depend on the details of the application and the database design The follow ing paragraphs suggest a general approach followed by some techniques that apply in limited circumstances Preparing a Test Environment First select a single query that is too slow Then set up an environment in which you can take predictable repeatable timings of that query Without this environment you can never be sure whether a change helped If you are using a multiuser system or a network so that system load varies widely from hour to hour you may need to perform your experiments at the same time each day to obtain repeatable results You may even need to work at night If the query presently is embedded
64. be disregarded for estimating In short when a row is inserted or deleted at random allow three to four added page I O operations per index When a row is updated allow six to eight page I O operations for each index that applies to an altered column Bear in mind also that if a transaction is rolled back all this work must be undone For this reason rolling back a transaction can take a long time Since the alteration of the row itself requires only two page I O operations it is clear that index maintenance is the most time consuming part of data mod ification One way to reduce this cost is discussed under Dropping Indexes on page 10 24 Choosing Indexes Indexes are required on columns that must be unique and are not specified as primary keys In addition you should add an index in three other cases e Columns used in joins that are not specified as foreign keys e Columns frequently used in filter expressions e Columns frequently used for ordering or grouping Join Columns As discussed in Chapter 4 at least one column named in any join expression should have an index If there is no index the database server usually builds a temporary index before the join and discards it afterward that is almost always faster than performing a join by repeated sequential scans over a table When both columns in a join expression have indexes the optimizer has more options when it constructs the query plan As a general rule you s
65. can apply the Execute privilege on a procedure to authorize non owners to run a procedure If you create a procedure in a database that is not ANSI compliant the default procedure level privilege is Public you do not need to grant Execute privilege to specific users unless you have first revoked it If you create a procedure in an ANSI compliant database no other users have Execute privilege by default you must grant specific users Execute privilege The following example grants Execute privilege to the user orion so that orion can use the stored procedure named read address GRANT EXECUTE ON read_address TO orion Procedure level privileges are recorded in the sysprocauth system catalog table The sysprocauth table uses a primary key of the procedure number grantor and grantee In the procauth column the execute privilege is indi cated by a lowercase letter e If the execute privilege was granted with the WITH GRANT option the privilege is represented by an uppercase letter E Automating Privileges It might seem that this design forces you to execute a tedious number of GRANT statements when you first set up the database Furthermore privi leges require constant maintenance as people change their jobs For example if a clerk in Human Resources is terminated you want to revoke the Update privilege as soon as possible otherwise you risk the unhappy employee exe cuting a statement like the following one UPDAT
66. database files using an encryption utility Keep only the encrypted version In the latter two cases after making the copies you must remember to erase the original database files using a program that overwrites an erased file with null data Instead of removing the entire database directory you can copy and then erase the files that represent individual tables However do not overlook the fact that index files contain copies of the data from the indexed column or col umns Remove and erase the index files as well as the table files Granting Privileges The authorization to use a database is called a privilege For example the authorization to use a database at all is called the Connect privilege while the authorization to insert a row into a table is called the Insert privilege You control the use of a database by granting these privileges to other users or by revoking them Security Stored Procedures and Views 11 5 Granting Privileges Privileges are designed in two groups one group affects the entire database and the other group relates to individual tables Database Level Privileges The three levels of database privilege provide an overall means of controlling who accesses a database Connect Privilege The least of the privilege levels is Connect which gives a user the basic ability to query and modify tables Users with Connect privilege can perform the following functions e Execute the SELECT INSERT UPD
67. difference between Informix and ANSI SQL the IBM Informix Guide to SQL Reference describes both versions Since you proba bly intend to use only one version you will have to ignore the version you do not need ANSI Compliant Databases You can designate a database as ANSI compliant by using the MODE ANSI keywords when you create it Within such a database certain characteristics of the ANSI standard apply For example all actions that modify data auto matically take place within a transaction which means that the changes are made in their entirety or not at all Differences in the behavior of ANSI compliant databases are noted where appropriate in the IBM Informix Guide to SQL Reference The Database Software You only can access your database with the help of two layers of sophisti cated software You work directly with the top layer and it uses the bottom layer to access the data You command both layers using the Structured Query Language The Database Server The database server is the program that manages the contents of the database as they are stored on disk The database server knows how tables rows and columns are actually organized in physical computer storage The database server also interprets and executes all SQL commands Database Fundamentals 1 17 The Database Software The Applications A database application or simply application is a program that uses the data base It does so by calling on the
68. e You or whoever installs your IBM Informix products should refer to the UNIX Products Installation Guide for your particular release to ensure that your IBM Informix product is properly set up before you begin to work with it e If you are using your IBM Informix product across a network you may also want to refer to the appropriate IBM Informix NET and IBM Informix STAR Installation and Configuration Guide Introduction 17 Additional Documentation e Depending on the database server you are using you or your system administrator need either the IBM Informix OnLine Administrator s Guide or the IBM Informix SE Administrator s Guide e When errors occur you can look them up by number and find their cause and solution in the IBM Informix Error Messages manual If you prefer you can look up the error messages in the on line message file described in the section Error Message Files later in this Introduction Error Message Files 18 Introduction IBM Informix software products provide ASCII files that contain all of the error messages and their corrective actions For a detailed description of these error messages refer to the IBM Informix Error Messages manual in the IBM Informix Online Documentation site at http www 3 ibm com soft ware data informix pubs library In addition there are two ways in which you can access the error messages directly from the ASCII Error Message File e Use the finderr script to disp
69. error code error 143 ISAM error deadlock detected to the second program to request a lock The error code is the one the pro gram receives if it sets its lock mode to not wait for locks Thus if your pro gram receives an error code related to locks even after it sets lock mode to wait you know the cause is an impending deadlock Handling External Deadlock A deadlock can also occur between programs at different database servers In this case IBM Informix OnLine cannot instantly detect the deadlock Perfect deadlock detection requires excessive communications traffic between all database servers in a network Instead each database server sets an upper limit on the amount of time that a program can wait to obtain a lock on data at a different database server If the time expires the database server assumes that a deadlock was the cause and returns a lock related error code In other words when external databases are involved every program runs with a maximum lock waiting time The maximum is set for the database server and can be changed by the person who installs it Simple Concurrency If you are not sure which choice to make concerning locking and concurrency and if your application is straightforward have your program execute the following commands when it is starting up immediately after the first DATABASE statement SET LOCK MODE TO WAIT SET ISOLATION TO REPEATABLE READ Ignore the return codes from both statemen
70. filter it finds The selectivity is anumber between 0 and 1 that indicates the fraction of rows the optimizer thinks the filter will pass A very selective filter that passes very few rows is assigned a selectivity near 0 a filter that passes most rows is assigned a selectivity near 1 For details on this process see Filter Selectivity Assignments on page 4 17 The optimizer also notes other information about the query such as whether an index is sufficient If only an indexed column is selected it is faster to read the index pages and not read rows at all This is often possible with subqueries Optimizing Your Queries 4 15 The Query Optimizer In addition the optimizer notes whether an index can be used to evaluate a filter For this purpose an indexed column is a column that has an index or one that is named first in a composite index There are several cases to consider e When an indexed column is compared to a literal a host variable or an uncorrelated subquery the database server can look up matching values in the index instead of reading the rows When an indexed column is compared to a column in another table a join expression the database server can use the index to find matching values provided that the query plan calls for reading rows from the other table first The following join expression is an example WHERE customer customer_num orders customer_num If rows of customer are read first
71. forms of WHERE clauses force the optimizer to use sequential access even when indexes exist on all the tested columns The following query forces sequential access to the orders table SELECT FROM orders WHERE customer _num 104 AND order num gt 1001 OR order_num 1008 The key element is that two or more separate sets of rows are retrieved The sets are defined by relational expressions that are connected by OR In the example one set is selected by this test customer num 104 AND order num gt 1001 Optimizing Your Queries Making Queries Faster The other set is selected by this test order num 1008 The optimizer uses a sequential access path even though there are indexes on the customer_num and order_num columns You can speed queries of this form by converting them into UNION queries Write a separate SELECT statement for each set of rows and connect them with the UNION keyword Here is the preceding example rewritten this way SELECT FROM orders WHERE customer _ num 104 AND order _num gt 1001 UNION SELECT FROM orders WHERE order _num 1008 The optimizer uses an index path for each query Replacing Autoindexes with Indexes If the query plan includes an autoindex path to a large table take it as a rec ommendation from the optimizer that an index should be on that column It is reasonable to let the database server build and discard an index if you per form th
72. from a database table from a system catalog table a file that contains information on the database or from a view which is a virtual table created to contain a customized set of data System catalog tables are shown and views are discussed in the IBM Informix Guide to SQL Reference Relational Operations A relational operation involves manipulating one or more tables or relations to result in another table The three kinds of relational operation are selection projection and join This chapter includes examples of selection projection and simple joining Selection and Projection In relational terminology selection is defined as taking the horizontal subset of rows ofa single table that satisfies a particular condition This kind of SELECT statement returns some of the rows and all of the columns ina table Selection is implemented through the WHERE clause of a SELECT statement SELECT FROM customer WHERE state NJ Simple SELECT Statements 2 5 Introducing the SELECT Statement The result of this query contains the same number of columns as the customer table but only a subset of its rows Because the data in the selected columns does not fit on one line of the Interactive Editor screen the data is displayed vertically instead of horizontally customer _num fname lname company address1 address2 city state zipcode phone customer_num fname lname company address1 address2 city state zipcod
73. functions are COUNT AVG MAX MIN and SUM They take on values that depend on all the rows selected and return information about rows not the rows themselves You cannot use these functions with TEXT or BYTE columns Aggregates often are used to summarize information about groups of rows in a table This use is discussed in Chapter 3 When you apply an aggregate function to an entire table the result contains a single row that summarizes all of the selected rows This SELECT statement counts and displays the total number of rows in the stock table SELECT COUNT FROM stock This is the result count 73 This statement includes a WHERE clause to count specific rows in the stock table in this case only those rows that have a manu_code of SHM SELECT COUNT FROM stock WHERE manu_code SHM This is the result count 16 Simple SELECT Statements 2 47 Single Table SELECT Statements By including the keyword DISTINCT or its synonym UNIQUE and a column name in the SELECT statement you can tally the number of different manu facturer codes in the stock table SELECT COUNT DISTINCT manu_code FROM stock This is the result count 9 This SELECT statement computes the average unit_price of all rows in the stock table SELECT AVG unit_price FROM stock This is the result avg 196 00 This SELECT statement computes the average unit_price of just tho
74. goes on to delete the rows of stock that use manufacturer code HRO including the row just inserted by program A If program A used a lesser level of isolation the following sequence could have happened instead 1 Program A reads the Hero row of the manufact table to learn the manu facturer code No lock is placed Program B issues a DELETE statement for that row It succeeds Program B deletes all rows of stock that use manufacturer code HRO Program B ends Ch te ee O Program A not aware that its copy of the Hero row is now invalid inserts a new row of stock using the manufacturer code HRO 6 Program A ends At the end there is a row in stock that has no matching manufacturer code in manufact Furthermore Program B apparently has a bug it did not delete the rows it was supposed to delete The use of the Cursor Stability isolation level prevents these effects It is possible to rearrange the preceding scenario so that it fails even with Cursor Stability All that is required is for program B to operate on tables in the reverse sequence to program A If program B deletes from stock before it removes the row of manufact no degree of isolation can prevent an error Whenever this kind of error is possible it is essential that all programs involved use the same sequence of access Since Cursor Stability locks only one row at a time it restricts concurrency less than does a table lock or database lock Repeatable Read I
75. in the state column of the Aleta customer table lname city state phone Jewell Phoenix AZ 602 265 8754 Lessor Phoenix AZ 602 533 1817 O Brian Princeton NJ 609 342 0054 Shorter Cherry Hill NJ 609 663 6079 Note that you cannot test a TEXT or BYTE column with the IN keyword Simple SELECT Statements 2 31 Single Table SELECT Statements In this example of a query on an ANSI compliant database there are no quo tation marks around the table owner name Whereas the two previous que ries searched the table Aleta customer this SELECT statement searches the table ALETA customer which is a different table SELECT lname city state phone FROM Aleta customer WHERE state NOT IN AZ ORDER BY state NJ Here by adding the keyword NOT IN the subset is changed to exclude the subsets AZ and NJ in the state column The results are in order of state lname city state phone Pauli Sunnyvale CA 408 789 8075 Sadler San Francisco CA 415 822 1289 Currie Palo Alto CA 415 328 4543 Higgins Redwood City CA 415 368 1100 Vector Los Altos CA 415 776 3249 Watson Mountain View CA 415 389 8789 Ream Palo Alto CA 415 356 9876 Quinn Redwood City CA 415 544 8729 Miller Sunnyvale CA 408 723 8789 Jaeger Redwood City CA 415 743 3611 Keyes Sunnyvale CA 408 277 7245 Lawson Los Altos CA 415 887 7235 Beatty Menlo Park CA 415 356 9982 Albertson Redwood City CA 415 886 6677 Grant Menlo Park CA 415 356 1123 Parmelee Mountain View CA
76. in an INSERT DELETE or UPDATE statement is called a subquery Each subquery must contain a SELECT clause and a FROM clause and must be enclosed in parentheses that tell the database server to perform that operation first Subqueries can be correlated or uncorrelated A subquery or inner SELECT statement is correlated when the value it produces depends on a value pro duced by the outer SELECT statement that contains it Any other kind of sub query is considered uncorrelated The important feature of a correlated subquery is that because it depends on a value from the outer SELECT it must be executed repeatedly once for every value produced by the outer SELECT An uncorrelated subquery is executed only once Often you can construct a SELECT statement with a subquery to replace two separate SELECT statements Subqueries in SELECT statements allow you to e Compare an expression to the result of another SELECT statement e Determine whether an expression is included in the results of another SELECT statement e Determine whether any rows are selected by another SELECT statement An optional WHERE clause in a subquery often is used to narrow the search condition A subquery selects and returns values to the first or outer SELECT statement A subquery can return no value a single value or a set of values e If it returns no value the query returns no rows at all Such a subquery is equivalent to a NULL value e If it ret
77. index has been used to locate the row being altered Its index pages are found in the page buffers However the pages for any other indexes that need altering must be read from disk Under these assumptions index maintenance adds time to different kinds of modifications as follows e When a row is deleted from a table its entries must be deleted from all indexes The entry for the deleted row must be looked up two or three pages in and the leaf page must be rewritten one page out for a total of three or four page accesses per index e When a row is inserted its entries must be inserted in all indexes The place for entry of the inserted row must be found two or three pages in and rewritten one page out for a total of three or four page accesses per index e When a row is updated its entries must be looked up in each index that applies to a column that was altered two or three pages in The leaf page must be rewritten to eliminate the old entry one page out then the new column value must be located in the same index two or three more pages in and the row entered one more page out Tuning the Model 10 21 Managing Indexes Insertions and deletions change the number of entries on a leaf page In vir tually every pagents operation some additional work must be done because a leaf page has either filled up or emptied However since pagents is usually greater than 100 this occurs less than 1 of the time and can
78. index seems to be less effective than it should be yet bcheck reports no errors try dropping the index and re creating it Avoiding Correlated Subqueries A correlated subquery is one in which a column label appears in both the select list of the main query and the WHERE clause of the subquery Since the result of the subquery might be different for each row that the database server examines the subquery is executed anew for every row if the current correlation values are different from the previous ones The optimizer tries to use an index on the correlation values to cluster identical values together This procedure can be extremely time consuming Unfortunately some que ries cannot be stated in SQL without the use of a correlated subquery When you see a subquery in a time consuming SELECT statement look to see if it is correlated An uncorrelated subquery one in which no row values from the main query are tested within the subquery is only executed once If so try to rewrite the query to avoid it If you cannot look for ways to reduce the number of rows that are examined for instance try adding other filter expressions to the WHERE clause or try selecting a subset of rows into a temporary table and searching only them 4 34 Optimizing Your Queries Making Queries Faster Avoiding Difficult Regular Expressions The MATCHES and LIKE keywords support wildcard matches technically known as regular expressions Some regular e
79. into an outer join by inserting the key word OUTER directly before the name of the subservient tables in the FROM clause As shown later in this section you can include the OUTER keyword more than once in your query Before you make heavy use of outer joins you should determine whether one or more simple joins will do You often can get by with a simple join when you do not need supplemental information from other tables The examples in this section use table aliases for brevity Table aliases are discussed in the preceding chapter Advanced SELECT Statements 3 19 Creating Advanced Joins Simple Join This is an example of the type of simple join on the customer and cust_calls tables shown in Chapter 2 of this manual SELECT c customer_num c lname c company c phone u call _dtime u call_ descr FROM customer c cust_calls u WHERE c customer_num u customer num This query returns only those rows where the customer has made a call to customer service 3 20 Advanced SELECT Statements Creating Advanced Joins customer_num iname company phone call dtime call_descr customer_num iname company phone call _dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call _dtime call_ descr customer_num inam
80. is unchanged The following two queries are equivalent SELECT fname surname FROM customer SELECT fname lname FROM name_only When you alter a table by dropping a column views are not modified If they are used error 217 Column not found in any table in the query occurs The reason views are not dropped is that you can change the order of columns in a table by dropping a column and then adding a new column of the same name If you do this views based on that table continue to work They retain their original sequence of columns IBM Informix OnLine permits you to base a view on tables and views in exter nal databases Changes to tables and views in other databases are not reflected in views Such changes might not be apparent until someone que ries the view and gets an error because an external table changed Modifying Through a View It is possible to modify views as if they were tables Some views can be mod ified and others not depending on their SELECT statements The restrictions are different depending on whether you use DELETE UPDATE or INSERT statements No modification is possible on a view when its SELECT statement contains any of the following features e A join of two or more tables Many anomalies arise if the database server tries to distribute modified data correctly across the joined tables e Anaggregate function or the GROUP BY clause The rows of the view represent many combined rows of data t
81. is a physical limit on the size of any statement when considered as a character string However this limit probably is larger than any practical statement you are likely to compose Perhaps you want to check whether information has been entered correctly in the database One way to find errors in a database is to write a query that returns output only when errors exist A subquery of this type serves as a kind of audit query SELECT FROM items WHERE total price quantity SELECT unit price FROM stock WHERE stock stock num items stock num AND stock manu_code items manu_code 3 36 Advanced SELECT Statements Set Operations This SELECT statement returns only those rows for which the total price of an item on an order is not equal to the stock unit price times the order quantity Assuming that no discount has been applied such rows must have been entered incorrectly in the database For example item_num order _num stock num manu_code quantity total _price 1 1004 1 HRO 1 960 00 2 1006 5 NRG 5 190 00 Set Operations Union The standard set operations union intersection and difference let you manipu late database information These three functions enable you to use SELECT statements to check the integrity of your database after you have performed an update insert or delete They can be useful when you are transferring data to a history table for example and want to verify that the correct data is in the
82. is certainly small in this sense In the stores5 database the state table that relates abbreviations to names of states has a total size less than 1 000 bytes it fits in at most two pages It can be included in any query at almost no cost No matter how it is used even if it is read sequentially many times it costs two disk accesses at most The Cost of Network Access Whenever data is moved over a network additional delays are imposed Networks are used in two contexts e Using IBM Informix NET the application sends a query across the net work to a database server in another machine The database server performs the query using its locally attached disk The output rows are returned over the network to the application e Using the IBM Informix STAR distributed data component of IBM Informix OnLine a database server in one machine can read and update rows from tables in databases located on other machines Both contexts may apply it is possible to use IBM Informix NET to call on one IBM Informix OnLine server and send that server a query that causes it to use tables at yet other servers 4 26 Optimizing Your Queries Time Costs of a Query The data sent over a network consists of command messages and buffer sized blocks of row data While many differences of detail exist between the two contexts they can be treated identically under a simple model in which one machine the sender sends a request to another t
83. is returned INTEGER The database server converts the result to integer truncating fractional digits if necessary If the integer part of the converted number does not fit the receiving variable an error occurs CHARACTER The database server converts the decimal value to a character string If the string is too long for the receiving variable it is trun cated and the second field of SOLAWARN is set to W SQL in Programs 6 13 Retrieving Single Rows Dealing with Null Data 6 14 SQL in Programs What if the program retrieves a null value Null values can be stored in the database but the data types supported by programming languages do not recognize a null state A program must have some way of recognizing a null item to avoid processing it as data Indicator variables meet this need in the embedded language products An indicator variable is an additional variable that is associated with a host vari able that might receive a null item When the database server puts data in the main variable it also puts a special value in the indicator variable to show whether the data is null select paid date into Sop_date op d_ind from orders where order num the order if op d ind lt 0 data was null rstrdate 01 01 1900 amp op date In this IBM Informix ESQL C example a single row is selected and a single value is retrieved into the host variable op_date Since the value might be null an indicator vari
84. know that and the page size you can estimate the number of entries per page This estimate is approximate since first some data com pression is used in storing keys and second not all pages are full The number of levels depends on the number of rows to be indexed and the number of entries per page Suppose a page holds 100 keys Then a table of 100 rows has a single index page the root page A table with between 101 and 10 000 rows has a two level index consisting of a root page and from 2 to 100 leaf pages A table with as many as 1 000 000 rows has only a 3 level index so the preceding index must belong to a table of considerable size e When the responder acts on the request it incurs the time costs of disk access and in memory operations as described in the preceding topics e Transmission of the response is again subject to network delays The important point about network access is its extreme variability In the best case when neither the network nor the responder is busy transmission and queueing delays are insignificant and the responder sends a row almost 4 28 Optimizing Your Queries Making Queries Faster as quickly as a local database server could do it Furthermore when the sender asks for a second row the page is likely still to be in the responder page buffers Unfortunately as network load goes up all of these factors tend to go bad at the same time Transmission delays rise in both directions The queue
85. level is a sophisticated cost based strategy that examines all the reasonable choices and selects the best overall alterna tive However for large joins this level may incur more overhead than you want in extreme cases performance degradation can be severe The low opti mization level eliminates unlikely join strategies during the early stages reducing the amount of time and resources spent during optimization The risk with this level is that the optimal strategy is not selected because it was eliminated from consideration during the early stages You normally obtain optimum overall performance with the default optimization level If experi mentation with your application reveals that the low optimization level is best then you should set your optimization level to low Providing Input The optimizer can only be successful if its estimates are accurate They need not be accurate in absolute terms but they must be relatively accurate so that better plans produce lower estimates than worse plans However the opti mizer has only limited information To keep its own work down to a small fraction of the execution time it has to make do with the information in the system catalog tables and other summary information There is no time for example for the optimizer to perform a SELECT COUNT operation to obtain an accurate count of the rows in a table 4 14 Optimizing Your Queries The Query Optimizer The information available to th
86. list and per forms the update if that row matches Updating with Uniform Values Each assignment after the keyword SET specifies a new value for a column That value is applied uniformly to every row that is updated In the examples in the previous section the new values were constants but you can assign 5 12 Modifying Data Statements That Modify Data any expression including one based on the column value itself Suppose the manufacturer code HRO has raised all prices by 5 and you must update the stock table to reflect this UPDATE stock SET unit price unit price 1 05 WHERE manu_code HRO You can also use a subquery as part of the assigned value When a subquery is used as an element of an expression it must return exactly one value one column and one row Suppose that you decide that for any stock number you must charge a higher price than any manufacturer of that product You need to update the prices of all unshipped orders UPDATE items SET total price quantity SELECT MAX unit price FROM stock WHERE stock stock_ num items stock_num WHERE items order num IN SELECT order num FROM orders WHERE ship date IS NULL The first SELECT statement returns a single value the highest price in the stock table for a particular product This is a correlated subquery because a value from items appears in its WHERE clause it must be executed for every row that is updated The second SELECT state
87. means of entering nonprintable characters However when rows are created by a program using embedded SQL the program can insert any character except the null binary zero character It is not a good idea to store nonprintable characters in a character column since standard programs and utilities do not expect them The advantage of the CHAR n data type is that it is available on all database servers Its only disadvantage is that its length is fixed When the length of data values varies widely from row to row space is wasted Variable Length Strings VARCHAR m r Often the items in a character column have differing lengths that is many have an average length and only a few have the maximum length The VARCHAR mm r data type is designed to save disk space when storing such data A column defined as VARCHAR r is used just like one defined as CHAR n When you define a VARCHAR m r column you specify m as the maximum length of a data item Only the actual contents of each item are stored on disk with a one byte length field The limit on m is 255 that is a VARCHAR m r value can store up to 255 characters If the column is indexed the limit on m is 254 The second parameter r is an optional reserve length that sets a lower limit on the length of an item as stored on disk When an item is shorter than 1 r bytes are nevertheless allocated to hold it The purpose is to save time when rows are updated See Variable Length Execut
88. named next_cust returns either information about a new customer or null data to signal the end of input WHENEVER ERROR CONTINUE do not terminate on error BEGIN WORK OPEN new_custs WHILE status 0 CALL next_cust RETURNING the_company the_fname the_lnam IF the company IS NULL THEN EXIT WHILE END IF PUT new_custs END WHILE IF status 0 THEN no problem in a PUT FLUSH new_custs write any last rows END IF IF status 0 THEN no problem writing COMMIT WORK make it permanent ELSE ROLLBACK WORK retract any changes END IF Figure 7 4 Continuing Figure 7 3 the code that uses the insert cursor The code in Figure 7 4 calls next_cust repeatedly When it returns non null data the PUT statement sends the returned data to the row buffer When the buffer fills up the rows it contains are automatically sent to the database server The loop normally ends when next_cust has no more data to return Then the FLUSH statement is used to write any rows that remain in the buffer after which the transaction is terminated Examine the INSERT statement in Figure 7 3 once more The statement by itself not part of a cursor definition inserts a single row into the customer table In fact the whole apparatus of the insert cursor can be dropped from the example code and the INSERT statement can be written into Figure 7 4 where the PUT statement now stands The difference is that an insert cursor causes a program to run somewh
89. number none none fax number none modem Figure 8 7 A completed matrix for an address book The following decisions are reflected in Figure 8 7 8 18 Building a Data Model A name can be associated with more than one fax number for example a company can have several fax machines Going the other way a fax num ber can be associated with more than one name for example several people can use the same fax number A modem number must be associated with exactly one name This is an arbitrary decree to complicate the example pretend it is a requirement of the design However a name can have more than one associated modem number for example a company computer can have several dial up lines While there is some relationship between a voice number and an address in the real world none needs to be recorded in this model There already is an indirect relationship through name There can be more than one modem or fax at a given address on the other hand a given modem or fax has one address and there can be modems or faxes whose addresses are not known A voice phone can be associated with one fax phone and vice versa This relationship reflects the fact that there is often a voice line to the operator of one of these machines Step 2 Define the Relationships You might disagree with some of these decisions for example why a rela tionship between voice numbers and modem numbers is not supported If
90. on granting privileges directly on this table The following examples take a different approach Assume that when the table was created the following statement was executed REVOKE ALL ON hr data FROM PUBLIC This is not necessary in an ANSI compliant database Now you create a series of views for different classes of users For those who should have read only access to the nonsensitive columns you create the following view CREATE VIEW hr public AS SELECT emp_key emp name hire date dept_num user_id FROM hr data 11 30 Security Stored Procedures and Views Privileges and Views Users who are given Select privilege for this view can see nonsensitive data and update nothing For the clerks in the Human Resources department who must enter new rows you create a different view CREATE VIEW hr enter AS SELECT emp_key emp name hire date dept_num FROM hr data You grant these users both Select and Insert privileges on this view Because you the creator of both the table and the view have Insert privilege on the table and the view you can grant Insert privilege on the view to others who have no privileges on the table On behalf of the clerk in the MIS department who enters or updates new user ids you create still another view CREATE VIEW hr MIS AS SELECT emp_key emp name user_id FROM hr data This view differs from the previous view in that it does not expose the depart ment number and dat
91. once Provided that the database server is the only program using the disk the seek time cost is also minimized The disk pages of consecutive rows are usu ally in consecutive locations on the disk so the access arm moves very little from one page to the next Even when that is not the case groups of consec utive pages are usually located together so that only a few long seeks are needed For example IBM Informix OnLine allocates disk space to a table in multipage extents Extents may be separated on the disk but within an extent the pages are close together Even latency costs may be lowest when pages are read sequentially This depends on the hardware and when operating system files are used on the methods of the operating system Disks are usually set up so that when pages are read sequentially latency is minimized On the other hand it is possible to set up a disk so that a full rotation occurs between each sequential page drastically slowing sequential access 4 24 Optimizing Your Queries Time Costs of a Query The Cost of Nonsequential Access Disk costs are higher when the rows of a table are called for in a sequence that is unrelated to physical order Practical tables are normally much larger than the database server page buffers so only a small part of the table pages can be held in memory When a table is read in nonsequential order only a few rows are found in buffered pages Usually one disk page is read for ever
92. phone CHAR 18 18 homerow 134 rowsize lt pageuse overpage 0 rowsize lt pageuse datrows 14 floor pageuse homerow datpages 108 ceiling estrows datrows expages 0 estrows X overpage Figure 10 6 Estimating the size of the customer table 10 14 Tuning the Model Calculating Table Sizes Estimating Variable Length Rows When a table contains one or more VARCHAR columns its rows have varying lengths This introduces uncertainty You must form an estimate of the typical size of each VARCHAR column based on your understanding of the data When IBM Informix OnLine allocates space to rows of varying size it consid ers a page to be full when there is not room for an additional row of the max imum size This can limit the allocation of rows to pages Calculate the following variables maxrow the sum of the maximum sizes of all columns in the table plus 4 bytes Treat TEXT and BYTE columns as having size 56 typrow the sum of the estimated typical sizes of all columns in the table plus 4 bytes homerow if typrow lt pageuse then typrow else 4 remainder typrow pageuse Let homerow be the amount of a typical row that fits on the home page it is typrow if one page is sufficient overpage if typrow lt pageuse then 0 else floor typrow pageuse Let overpage be the number of expansion pages needed for the typical row it is zero when a typical row fits on a page homemax if maxrow lt pageuse the
93. produces an error code SQL in Programs 6 29 Dynamic SQL 6 30 SQL in Programs Instead a dynamic SELECT statement is attached to a cursor Then the cursor is opened and used in the usual way The cursor to be used with a prepared statement is declared for that statement name Here is an example from IBM Informix 4GL LET select_2 select order_num order date from orders where customer num and order date gt PREPARE q_orders FROM select_2 DECLARE cu_orders CURSOR FOR q_orders OPEN cu_orders USING q_c_ number q o date FETCH cu_orders INTO _o num f_o date The following list identifies the stages of processing in this example 1 A character string expressing a SELECT statement is placed in a program variable It employs two place holding question marks 2 The PREPARE statement converts the string into a data structure that can be executed The data structure is associated with a name q_orders 3 A cursor named cu_orders is declared and associated with the name of the prepared statement 4 When the cursor is opened the prepared statement is executed The USING clause in the OPEN statement provides the names of two host vari ables whose contents are substituted for the question marks in the original statement 5 The first row of data is fetched from the open cursor The INTO clause of the FETCH statement specifies the host variables that are to receive the fetched column values Later
94. programs and stored queries that use an asterisk to mean all columns depends on the final order of columns but that does not affect the model Column values must be unitary A column can contain only single values never lists or repeating groups Composite values must be broken into separate columns For example if at some point you treat a person s first and last names as separate values they must be in separate columns not in a single name column If your previous experience is only with data organized as arrays or sequen tial files these rules might seem unnatural However relational database the ory shows that you can represent all types of data using only tables rows and columns that follow these rules With only a little practice the rules become automatic 8 6 Building a Data Model Basic Ideas Primary Keys The primary key of a table is the column whose values are different in every row Because they are different they make each row unique If there is no one such column the primary key is a composite of two or more columns whose values taken together are different in every row Every table in the model must have a primary key This follows automatically from the rule that all rows must be unique If necessary the primary key is composed of all the columns taken together Null values are never allowed in a primary key column Null values are not comparable that is they cannot be said to be alike or diffe
95. repeatable measurements with a hand operated stopwatch With practice most people can obtain timings that are repeatable within two tenths of a second Manual timing is useful if you are measuring only a few events that are at least several seconds long Time from Operating System Commands Your operating system probably has a command that displays the time You can package an operation to be timed between two time commands in a command script Time from the Programming Language Most programming languages have a library function for the time of day If you have access to the source code you can insert statements to measure the time of specific actions For example if the application is written in 4GL you 4 6 Optimizing Your Queries Optimizing Techniques can use the CURRENT function to obtain the current time as a DATETIME value A 4GL program can perform automated timing with code similar to the following fragment DEFINE start_time DATETIME HOUR TO FRACTION 2 elapsed INTERVAL MINUTE 4 TO FRACTION 2 LET start_time EXTEND CURRENT HOUR TO FRACTION 2 here perform the operation to be timed LET elapsed EXTEND CURRENT HOUR TO FRACTION 2 start_time DISPLAY Elapsed time was elapsed Elapsed time in a multiprogramming system or network environment does not always correspond to execution time Most C libraries contain a function that returns the CPU time of a program and C functions can be c
96. revise this solution to return counts of the number of parts at each level Dynamic SQL 6 26 SQL in Programs While static SOL is extremely useful it does require that you know the exact content of every SQL statement at the time you write the program For exam ple you must state exactly which columns are tested in any WHERE clause and exactly which columns are named in any select list This is no problem when you write a program to perform a specific well defined task But the database tasks of some programs cannot be perfectly defined in advance In particular a program that must respond to an interac tive user might need the ability to compose SQL statements in response to what the user enters Dynamic SQL allows a program to form an SQL statement during execution so that the contents of the statement can determine user input This is done in three steps 1 The program assembles the text of an SQL statement as a character string stored in a program variable 2 Itexecutes a PREPARE statement which asks the database server to exam ine the statement text and prepare it for execution 3 It uses the EXECUTE statement to execute the prepared statement Dynamic SQL In this way a program can construct and then use any SQL statement based on user input of any kind For example it can read a file of SQL statements and prepare and execute each DB Access the utility that you use to explore SQL interactively is an
97. rows from query results Sort retrieved data with the ORDER BY clause and the DESC keyword Use the BETWEEN IN MATCHES and LIKE keywords and various rela tional operators in the WHERE clause to create a comparison condition Create comparison conditions that include values exclude values find a range of values with keywords relational operators and subscripting and find a subset of values Perform variable text searches using exact text comparisons variable length wildcards and restricted and unrestricted wildcards Use the logical operators AND OR and NOT to connect search conditions or Boolean expressions in a WHERE clause Use the ESCAPE keyword to protect special characters in a query Search for NULL values with the IS NULL and IS NOT NULL keywords in the WHERE clause Use arithmetic operators in the SELECT clause to perform computations on number fields and display derived data Use substrings and subscripting to tailor your queries Assign display labels to computed columns as a formatting tool for reports Use the aggregate functions COUNT AVG MAX MIN and SUM in the SELECT clause to calculate and retrieve specific data Include the time functions DATE DAY MDY MONTH WEEKDAY YEAR CURRENT and EXTEND plus the TODAY LENGTH and USER functions in your SELECT statements 2 74 Simple SELECT Statements Summary This chapter also introduced simple join conditions that enable you to select and d
98. rows in order One way the database server does this is to select all the rows into a temporary table and sort the table But as dis cussed in Chapter 4 if the ordering columns are indexed the optimizer sometimes plans to read the rows in sorted order through the index thus avoiding a final sort Since the keys in an index are in sorted sequence the index really represents the result of sorting the table By placing an index on the ordering column or columns you can replace many sorts during queries with a single sort when the index is created Duplicate Keys Slow Index Modifications When duplicate keys are permitted in an index the entries that have any sin gle value are grouped in a list When the selectivity of the column is high these lists are generally short But when there are only a few unique values the lists become quite long and in fact can cross multiple leaf pages For example in an index on a column whose only values are M for married and S for single all the index entries are contained in just two lists of dupli cates Such an index is not of much use but at least it works for querying the database server can read out the list of rows that have one value or the other Tuning the Model 10 23 Managing Indexes When an entry must be deleted from a list of duplicates the database server must read the whole list and rewrite some part of it When it adds an entry the database server puts the new row at the e
99. section discusses methods for calculating the approximate sizes of tables and indexes in disk pages Like the previous sections it applies only to IBM Informix OnLine Estimates of this kind are useful when you are plan ning the layout of a database on disk These calculations aim to estimate the number of disk pages that are used to hold different parts of a table If the table already exists or if you can build a demonstration table of realistic size using simulated data you do not have to make estimates You can run tbcheck and obtain exact numbers You can calculate a series of values to produce the estimates You need the fol lowing values in all estimates Let the values be as follows estrows the number of rows you estimate the table has when it reaches its normal size pagesize the size of a page reported by tbstat c under the head BUFFSIZE pageuse pagesize 28 the space available for data on a disk page In the calculations in this chapter loor x means the largest integer smaller than x while ceiling x means the smallest integer larger than x Estimating Fixed Length Rows When a table contains no VARCHAR columns its rows all have the same size Calculate the following additional variables Let the values be as follows rowsize the sum of the sizes of all columns in the table plus 4 bytes Sizes of different data types are discussed in Chapter 9 Treat TEXT and BYTE columns as having size 56 homer
100. servers are not designed with tricks of this kind in mind When an unauthorized user tries to query one of the tables the database server probably returns an error mes sage about not being able to locate a file This may confuse users Single User Systems Typical single user systems have few software controls on file access you can only make a database inaccessible to others by writing it on a disk that you can detach from the machine and keep locked None of these techniques apply when you use the IBM Informix OnLine data base server It controls its own disk space at the device level bypassing the file access mechanisms of the operating system 11 4 Security Stored Procedures and Views Granting Privileges Securing Confidential Data No matter what access controls the operating system gives you when the contents of an entire database are highly sensitive you might not want to leave it on a public disk fixed to the machine You can circumvent normal software controls when the data must be secure When the database is not being used by you or another authorized person it does not have to be available on line You can make it inaccessible to every one in several ways with varying degrees of inconvenience e Detach the physical medium from the machine and take it away If the disk itself is not removable the disk drive might be removable e Copy the database directory to tape and take possession of the tape e Copy the
101. standard in 7 27 signalled in SQLAWARN 6 11 table privileges 11 8 ANY keyword beginning a subquery 3 31 Application common features 1 19 description of 1 18 design of order entry 5 21 handling errors 6 15 in network 12 7 performance analysis of 4 5 report generator 1 18 screen forms 1 18 user written 1 19 Archiving description of 1 12 5 23 IBM Informix OnLine methods 5 25 transaction log 5 24 Arithmetic operator in expression 2 41 Asterisk use in SELECT 2 12 Attribute 8 22 Automatic type conversion See Data type conversion AVG function as ageregate function 2 47 B Backup See Archive bcheck utility 4 34 BEGIN WORK statement specifies start of a transaction 5 22 BETWEEN operator 2 30 Binary Large Object BLOB choosing location for 10 19 disk storage for 10 5 10 6 estimating disk space for 10 18 blobspace 10 5 10 19 Boldface type Intro 11 Boolean expression and logical operator 2 33 Buffered logging 9 24 BYTE data type choosing location for 10 19 description of 9 19 disk storage for 10 5 estimating disk space for 10 18 restrictions with GROUP BY 3 6 restrictions with LIKE or MATCHES 2 34 restrictions with relational expression 2 27 C Candidate key attribute depends on 8 22 description of 8 7 Cartesian product basis of any join 2 62 description of 2 60 CHAR data type 9 15 in relational expressions 2 27 replacing with TEXT 10 28 replacing with VARCHAR 10 27 subscripting 2 39 substrings of
102. statement is executed properly it only means that the statement has correct syntax It might refer to a nonexistent table or contain many other kinds of errors that can only be detected during execution IF status 0 THEN EXECUTE the_grant END IF If the preparation is successful the next step is to execute the prepared state ment The remainder of the function in Figure 6 9 displays an error message if anything goes wrong As written it makes no distinction between an error from the PREPARE operation and one from the EXECUTE operation and it does not attempt to interpret the numeric error code leaving it to the user to interpret SQL statements can be written into programs as if they were normal state ments of the programming language Program variables can be used in WHERE clauses and data from the database can be fetched into them A pre processor translates the SQL code into procedure calls and data structures Statements that do not return data or queries that return only one row of data are written like ordinary imperative statements of the language Que ries that can return more than one row are associated with a cursor that rep resents the current row of data Through the cursor the program can fetch each row of data as it is needed Static SQL statements are written into the text of the program However the program can form new SQL statements dynamically as it runs and execute them also In the most advanced c
103. statements are embedded One or more stored procedures The compiled procedures made up of SQL and SPL Structured Procedure Language statements which are stored in an executable form in the database One or more computers The machines that store the programs and the databases One or more maintainers The people responsible for maintaining the programs One or more users The people whose work the system is supposed to amplify or simplify One or more organizations The groups that own the computers and choose what work is to be done You may work in a large corporation where each of these components is separate Or you may be the proprietor maintainer and sole user of a desk top workstation In every case it is important to recognize two points about the system as a whole First the goal of the system is to serve its users Any effort you spend optimizing programs is wasted unless the result helps the users in some way Second SQL statements are only a small part of the sys tem Often the most effective improvements can be found in other parts of the system The following paragraphs outline a general procedure for analyzing any computer performance problem Follow the procedure to help avoid over looking possible solutions including the nontechnical ones that sometimes provide the best answer to performance problems Verifying the Problem Before you begin optimizing SQL statements be sure the problem lies with the
104. subqueries by nest ing a SELECT statement in the WHERE clause of another SELECT statement and showed the use of aggregate functions in subqueries 3 48 Advanced SELECT Statements Summary e Demonstrated the use of the keywords ALL ANY EXISTS IN and SOME in creating subqueries and the effect of adding the keyword NOT or a relational operator e Discussed the set operations union intersection and difference e Showed how to use the UNION and UNION ALL keywords to create com pound queries consisting of two or more SELECT statements Advanced SELECT Statements 3 49 Optimizing Your Queries Chapter Overview 3 Optimizing Techniques 4 Verifying the Problem 4 Considering the Total System 5 Understanding the Application 5 Measuring the Application 6 Manual Timing 6 Time from Operating System Commands 6 Time from the Programming Language 6 Finding the Guilty Functions 7 Keeping an Open Mind 7 The Query Optimizer 8 The Importance of Table Order 8 A Join Without Filters 8 A Join with Column Filters 10 Using Indexes 12 The Sort Merge Join Technique 13 How the Optimizer Works 14 Selecting an Optimization Level 14 Providing Input 14 Assessing Filters 15 Selecting Table Access Paths 17 Selecting the Query Plan 18 Reading the Plan 19 Time Costs of a Query 20 Activities in Memory 20 Disk Access Management 22 Disk Pages 23 Page Buffers 23 The Cost of Reading a Row 23 The Cost of Sequential Access 24 The Cost
105. success since it inserted as many rows as it was asked to do that is zero To find out how many rows are inserted updated or deleted a program can test the third element of SQLERRD The count of rows is there regard less of the value zero or negative in SQLCODE 7 14 Programs That Modify Data Using UPDATE Using an Update Cursor An update cursor permits you to delete or update the current row that is the most recently fetched row Here is an example in IBM Informix ESQL COBOL of the declaration of an update cursor EXEC SQL DECLARE names CURSOR FOR SELECT fname lname company FROM customer FOR UPDATE END EXEC The program that uses this cursor can fetch rows in the usual way EXEC SQL FETCH names INTO FNAME LNAME COMPANY END EXEC If the program then decides that the row needs to be changed it can do so IF COMPANY IS EQUAL TO SONY EXEC SQL UPDATE customer SET fname Midori lname Tokugawa WHERE CURRENT OF names END EXEC The words CURRENT OF names take the place of the usual test expressions in the WHERE clause In other respects the UPDATE statement is the same as usual even including the specification of the table name which is implicit in the cursor name but required nevertheless The Purpose of the Keyword UPDATE The purpose of the keyword UPDATE in a cursor is to let the database server know that the program can update or delete any row tha
106. swim caps 313 ANZ instead of navy with team logo 313 SHM customer _num 116 cal cal code _descr Second complaint from this customer Received two cases right handed outfielder gloves 1 HRO instead of one case lefties Simple SELECT Statements 2 51 Single Table SELECT Statements Using MONTH SELECT customer_num MONTH call _dtime call month MONTH res_dtime res_month FROM cust_calls This SELECT statement uses the MONTH function to extract and show what month the customer call was received and resolved and uses display labels for the resulting columns However it does not make a distinction between years customer _num call_month res _ month 106 6 6 110 7 7 119 7 7 121 zi 7 127 7 116 11 11 116 12 12 SELECT customer num MONTH call _dtime called MONTH res_dtime resolved FROM cust_calls WHERE DAY res_dtime lt DAY CURRENT This SELECT statement uses the MONTH function plus DAY and CURRENT to show what month the customer call was received and resolved if DAY is ear lier than the current day customer num called resolved 106 6 6 110 7 T 119 7 7 121 7 7 2 52 Simple SELECT Statements Single Table SELECT Statements Using WEEKDAY SELECT customer _num WEEKDAY call_dtime called WEEKDAY res_dtime resolved FROM cust_calls ORDER BY resolved In this SELECT statement the WEEKDAY function is used to indicate which day of the week calls were receive
107. the Demonstration Database on IBM Informix OnLine 7 Creating the Demonstration Database on IBM Informix SE 8 New Features in IBM Informix Server Products Version 5 x 9 Document Conventions 10 Typographical Conventions 11 Syntax Conventions 11 Example Code Conventions 16 Additional Documentation 17 Online Manuals 17 Error Message Files 18 Documentation Notes Release Notes Machine Notes 21 Compliance with Industry Standards 21 IBM Welcomes Your Comments 22 Chapter 1 Chapter 2 iv Table of Contents Database Fundamentals Chapter Overview 1 3 Databases What and Why 1 3 The Data Model 1 3 Concurrent Use 1 9 Centralized Management 1 11 Important Database Terms 1 12 The Relational Model 1 12 Structured Query Language 1 15 Standard SQL 1 16 Informix SQL and ANSISQL 1 16 ANSI Compliant Databases 1 17 The Database Software 1 17 The Database Server 1 17 The Applications 1 18 Interactive SQL 1 18 Reports and Forms 1 18 General Programming 1 19 Applications and Database Servers 1 19 Summary 1 20 Simple SELECT Statements Chapter Overview 2 3 Introducing the SELECT Statement 2 3 Some Basic Concepts 2 4 What This Chapter Contains 2 11 Single Table SELECT Statements 2 12 Selecting All Columns and Rows 2 12 Selecting Specific Columns 2 19 Using the WHERE Clause 2 26 Creating a Comparison Condition 2 27 Expressions and Derived Values 2 41 Using Functions in SELECT Statements 2 47 Multiple Table SELECT State
108. the loop These versions have no measurable difference in performance because the time cost of a test of sqlcode is a tiny fraction of the cost of a fetch Locating the INTO Clause The INTO clause names the host variables that are to receive the data returned by the database server It must appear in either the SELECT or the FETCH statements but not both Here is the example reworked to specify host vari ables in the FETCH statement DECLARE the item CURSOR FOR SELECT order_num item_num stock num FROM items OPEN the_item WHILE status 0 FETCH the item INTO o num i_num s_num IF status 0 THEN DISPLAY o num i num s num END IF END WHILE The second form has the advantage that different rows can be fetched into different variables For example you can use this form to fetch successive rows into successive elements of an array Cursor Input Modes For purposes of input a cursor operates in one of two modes sequential or scrolling A sequential cursor can fetch only the next row in sequence Hence it can only read through a table once each time it is opened A scroll cursor can fetch the next row or any prior row so it can read rows multiple times Here is a sequential cursor declared in IBM Informix ESQL C EXEC SQL DECLARE pcurs CURSOR FOR SELECT customer num lname city FROM customer 6 20 SQL in Programs Retrieving Multiple Rows After it is opened this cursor can be used only with a sequ
109. the mirrored dbspace and let the important tables reside there by default Tables that are part of the data base but which are not used by the critical programs can be located in non mirrored spaces Sharing Temporary Space When databases are large and disk space is in short supply the normal dbspaces might not have enough room for those large temporary tables that can be helpful in improving query performance However a temporary table 10 6 Tuning the Model IBM Informix OnLine Disk Storage only exists for the life of the program that creates it even less time if the pro gram drops the table promptly Set up a single dbspace for temporary tables It can be used repeatedly by many programs Assigning Dedicated Hardware A dbspace can equal a chunk and a chunk can equal a device Thus you can place a table on a disk device that is dedicated to its use When disk drives have different performance levels you can put the tables with the highest fre quency of use on the fastest drives By giving a high use table a dedicated access arm you can reduce contention with applications that use other tables This does not reduce contention between programs using the same table unless the table itself is spread across multiple devices as suggested in the next paragraph Assigning Additional Access Arms to a Table Figure 10 2 A dbspace can comprise multiple chunks and each chunk can represent a different disk This permits you
110. the pages of the primary key index to be read in order and only one time each The presence of indexes also slows down the population of tables when you use the LOAD command or the dbload utility Loading a table that has no indexes at all is a very quick process little more than a disk to disk sequen tial copy but updating indexes adds a great deal of overhead The fastest way to load a table is as follows 1 Drop the table if it exists 2 Create the table without specifying any unique constraints 3 Load all rows into the table 4 Alter the table to apply the unique constraints 5 Create the non unique indexes If you cannot guarantee that the loaded data satisfies all unique constraints you must create the unique indexes before you load the rows It saves time if the rows are presented in the correct sequence for at least one of the indexes if you have a choice make it the one with the largest key This minimizes the number of leaf pages that must be read and written Clustered Indexes The term clustered index is a misnomer There is nothing special about the index it is the table that is modified so that its rows are physically ordered to agree with the sequence of entries in the index When you know that a table is ordered by a certain index you can take advantage of the knowledge to avoid sorting You can also be sure that when the table is searched on that column it is read effectively in sequential order ins
111. there are ten update events recorded in the log file If the size of the log file is a problem you can start a fresh log Choose a time when the database is not being updated so no trans actions are active and copy the existing log to another medium That copy represents all modifications for some period of time preserve it carefully Then start a new log file If you ever have to restore the database you must apply all the log files in their correct sequence Concurrency and Locks Archiving IBM Informix OnLine The IBM Informix OnLine database server contains elaborate features to sup port archiving and logging They are described in the IBM Informix OnLine Administrator s Guide Conceptually the facilities of IBM Informix OnLine are similar to those already described but they are more elaborate for the following reasons e IBM Informix OnLine has very stringent requirements for performance and reliability for example it supports making archive copies while databases are in use e It manages its own disk space e It performs logging concurrently for all databases using a limited set of log devices These facilities are usually managed from a central location so the users of the databases never have to be concerned with them If you want to make a personal archive copy of a single database or table that is held by IBM Informix OnLine you can do it with the tbunload utility This program copies a table or a database t
112. this fact and makes it easy to write queries that access huge numbers of pages nonsequentially Sometimes you can improve a query by substituting the sorting ability of the database server for nonsequential access The following example demonstrates this and also demonstrates how to make numerical estimates of the cost of a query plan Imagine a large manufacturing firm whose database includes three tables shown in schematic form in Figure 4 6 Table diagrams in this form are described in Chapter 8 of this manual Not all the columns are shown The first table part contains parts used in the products of the company The second vendor contains data about the vendors who provide the parts The third parven records which parts are available from which vendors and at what price Optimizing Your Queries 4 37 Making Queries Faster part vendor part_num_ part_desc vendor_num_ vendor_name pk pk 100 000 spiral spanner 9 100 000 Wrenchers SA 999 999 spotted paint 9 999 999 Spottiswode parven part_num vendor_num_ price ok fk pk fk 100 000 9 100 000 14 98 999 999 9 999 999 0 066 Figure 4 6 Three tables from a manufacturing database The following query is run regularly against these tables to produce a report of all available prices SELECT part_desc vendor name price FROM part vendor parven WHERE part part_num parven part_num AND parven vendor num vendor
113. those orders and then inserts a row in cust_calls for each order INSERT INTO cust_calls customer_num call_descript SELECT customer_num order _num FROM orders WHERE paid date IS NOT NULL AND ship date IS NULL This SELECT statement returns two columns The data from these columns in each selected row is inserted into the named columns of the cust_calls table Then an order number from order_num a serial column is inserted into the call description which is a character column Remember that the database server allows you to insert integer values into a character column It automat ically converts the serial number to a character string of decimal digits Restrictions on the Insert Selection There are four restrictions on the SELECT statement e It cannot contain an INTO clause e Itcannot contain an INTO TEMP clause e Itcannot contain an ORDER BY clause e It cannot refer to the table into which you are inserting rows The INTO INTO TEMP and ORDER BY clause restrictions are minor The INTO clause is not useful in this context it is discussed in Chapter 6 of this manual You can work around the INTO TEMP clause restriction by first selecting the data you want to insert into a temporary table and then inserting the data from the temporary table using the INSERT statement Likewise the lack of an ORDER BY clause is not important If you need to ensure that the new rows are physically ordered in the table you can first
114. to assign multiple disk access arms to one table Figure 10 2 shows an example in graphical terms device 0x21 device 0x27 device 0x22 1 gt dbspace three_arms A dbspace distributed over three disks The dbspace named three_arms comprises chunks on three different disks Each chunk is approximately one third the size of an important heavily used table The third chunk is larger to allow for growth When multiple pro grams query the table their I O operations are distributed over the three disks reducing contention for the use of the hardware In an arrangement like this the multiple disks can act as mirrors for each other For example device 0x21 can be mirrored on 0x27 0x27 on 0x22 and 0x22 on 0x21 As long as any two devices are operational the dbspace is Tuning the Model 10 7 IBM Informix OnLine Disk Storage usable However if a single piece of hardware such as a disk controller is common to all three disks this type of mirror arrangement is still vulnerable to failure of that component Tblspaces Extents 10 8 Tuning the Model The total of all disk space allocated to a table is the tblspace of the table The tblspace includes pages allocated to data rows of that table and pages allo cated to indexes It also includes pages used by blob columns that are located in the tblspace but not pages used by blob data in a separate blobspace This choice is discussed under Locating Blob
115. view If you had only Insert privi lege on the underlying table you receive only Insert privilege on the view and so on This test ensures that users cannot use a view to gain access to any privileges that they did not already have Since you cannot alter or index a view the Alter and Index privileges are never granted on a view Security Stored Procedures and Views 11 29 Privileges and Views Privileges When Using a View When you attempt to use a view the database server only tests the privileges you have been granted on the view It does not also test your right to access the underlying tables If you created the view your privileges are the ones noted in the preceding paragraph If you are not the creator you have the privileges that were granted to you by the creator or someone who had privileges WITH GRANT OPTION The implication of this is that you can create a table and revoke public access to it Then you can grant limited access privileges to the table through views This can be demonstrated through the previous examples using the hr_data table Its definition is repeated in Figure 11 10 CREATE TABLE hr data emp key INTEGER emp name CHAR 40 hire date DATE dept_num SMALLINT user id CHAR 18 salary DECIMAL 8 2 performance level CHAR 1 performance notes TEXT Figure 11 10 A table of confidential employee information duplicate of Figure 11 1 In Figure 11 10 the example centered
116. with 4 15 querying other databases 12 11 signalled in SQLAWARN 6 11 when tables are locked 7 21 IBM Informix SE creating database 9 25 in network 12 5 IBM Informix STAR 4 26 12 12 Icon explanation of Intro 13 IN keyword locating BLOB column 10 19 use in CREATE DATABASE 10 6 in CREATE TABLE 10 6 10 9 Index 7 8 Index IN relational operator 3 29 Index adding for performance 4 32 10 22 clustered 10 25 composite 4 33 disk space used by 4 32 10 16 10 20 dropping 10 24 duplicate entries 10 16 10 23 in GROUP BY 4 16 in ORDER BY 4 16 managing 10 20 optimizer 4 33 optimizer uses 4 12 4 15 performance effects 4 25 physical order and 4 13 time cost of 10 21 updating affects 4 34 utility to test or repair 4 34 when not used by optimizer 4 32 4 35 Index privilege 11 10 Indicator variable definition of 6 14 Industry standards compliance with Intro 21 Informix SQL creating database with 6 32 9 28 UNLOAD statement 9 29 Insert cursor definition of 7 8 use of 7 11 Insert privilege 11 9 11 29 INSERT statement and end of data 7 14 constant data with 7 11 count of rows inserted 7 11 duplicate values in 5 7 embedded 7 8 to 7 14 inserting multiple rows 5 9 rows 5 6 single rows 5 7 null values in 5 7 number of rows 6 11 privilege for 11 6 11 9 SELECT statement in 5 9 time to update indexes 10 21 VALUES clause 5 7 with a view 11 27 Inserting rows of constant data 7 11 INTEGER data type description of 9 7 Int
117. you do revise the matrix and the tables that follow Add Relationships to Tables After you discover all the relationships you record them in the form of new columns and tables You record a 1 n relationship by inserting a new column in one of the tables that represent entities Add the column to the table for the entity that associ ates with just one other entity The new column contains the foreign key of the other entity For example consider the 1 n relationship between names and modem numbers in the following diagram number modem name 1 0 n A name can associate with n modems but a modem number associates with just one name Therefore the new column is added to the modem table and it contains a foreign key to the name table as shown in the following diagram Name Modem NameString MdmNumber Namestring PK UA PK UA FK NN Gaius C Caesar 416 566 7024 Nite Owl BBS SPOR S A 33 1 42 70 67 74 CompuServe The flag NN for never null documents the decision that a modem must be associated with a name If you permitted a modem to have no associated name the NN flag is omitted and null values are permitted in this column of the table Building a Data Model 8 19 Step 2 Define the Relationships A 1 1 relationship such as the relationship between voice and fax numbers is handled like a 1 n relationship by adding a foreign key column in the table of one entity to link it to t
118. zero values SELECT order num stock _num manu_code total_price FROM items WHERE total _price lt ALL SELECT total price FROM items WHERE order num 1023 This SELECT statement lists the following information for all orders that con tain an item for which the total price is less than the total price on every item in order number 1023 order_num stock num manu_code total_price 1003 9 ANZ 20 00 1005 6 SMT 36 00 1006 6 SMT 36 00 1010 6 SMT 36 00 1013 5 ANZ 19 80 1013 6 SMT 36 00 1018 302 KAR 15 00 3 30 Advanced SELECT Statements Subqueries in SELECT Statements Using ANY Use the keyword ANY or its synonym SOME preceding a subquery to deter mine whether a comparison is true for at least one of the values returned If the subquery returns no values the search condition is false Since there were no values the condition could not be true of one of them SELECT DISTINCT order_num FROM items WHERE total _price gt ANY SELECT total price FROM items WHERE order num 1005 This query finds the order number of all orders that contain an item for which the total price is greater than the total price of any one of the items in order number 1005 returning these rows order_num 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 Advanced SELECT Statements 3 31 Subqueries in SELECT Statements S
119. 0000076 0x00000077 0x00000078 0x00000079 Ox0000007A 0x0000007B Ox0000007C 0x0000007D Ox0000007E Ox0000007F 0x00000080 hexzip Ox00016F86 Ox00016FA5 0x0001705F Ox00016F4A O0x00016F46 Ox00016F6F 0x00017060 Ox00016F6F Ox00016F86 Ox00016F6E 0x00016F85 Ox00016F46 Ox00016F49 Ox00016F6E Ox00016F49 Ox00016F58 Ox00016F6F 0x00017191 0x00001F42 0x00014C18 0x00004DBA 0x0000215C 0x00007E00 0x00012116 0x00000857 0x0001395B Ox0000EBF6 0x00014C10 hexrow 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 Ox0000000A 0x0000000B 0x0000000C 0x0000000D Ox0000000E Ox0000000F 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000015 0x00000016 0x00000017 0x00000018 0x00000019 Ox0000001A 0x0000001B 0x0000001C Simple SELECT Statements 2 59 Multiple Table SELECT Statements Multiple Table SELECT Statements You can select data from two or more tables by naming these tables in the FROM clause Add a WHERE clause to create a join condition between at least one related column in each table This creates a temporary composite table in which each pair of rows that satisfies the join condition is linked to form a single row A simple join combines information from two or more tables based on the rela tionship between one column in each table A composite join is a join between two or more tables based on the relationship between two or more columns
120. 1991 07 10 1991 06 22 199 04 013 B77930 08 06 1991 07 13 1991 07 10 199 21 018 22942 08 06 1991 07 16 1991 07 11 199 22 019 Z55709 08 21 1991 06 21 1991 06 14 199 11 009 4745 08 22 1991 06 29 1991 06 17 199 15 010 429Q 08 22 1991 07 25 1991 07 23 199 24 021 C3288 08 22 1991 07 30 1991 07 24 199 27 023 KF2961 08 29 1991 07 03 1991 06 18 199 04 011 B77897 08 31 1991 07 16 1991 06 27 199 10 015 MAOO3 09 02 1991 07 30 1991 07 24 199 26 022 w9925 09 20 1991 07 16 1991 07 11 199 23 020 W2286 When you SELECT and ORDER BY several columns in a table you might find it easier to use integers to refer to the position of the columns in the ORDER BY clause SELECT customer num order num po_num order date FROM orders ORDER BY 4 1 SELECT customer num order num po_num order date FROM orders ORDER BY order date customer_num Simple SELECT Statements 2 23 Single Table SELECT Statements These two statements retrieve and display the same data customer_num order num po_num order date 104 1001 B77836 05 20 1991 101 1002 9270 05 21 1991 104 1003 B77890 05 22 1991 106 1004 8006 05 22 1991 116 1005 2865 05 24 1991 112 1006 Q13557 05 30 1991 117 1007 278693 05 31 1991 110 1008 L2230 06 07 1991 111 1009 4745 06 14 1991 115 1010 4299 06 17 1991 104 1011 B77897 06 18 1991 117 1012 278701 06 18 1991 104 1013 B77930 06 22 1991 106 1014 8052 06 25 1991 110 1015 MA003 06 27 1991 119 1016 PC6782 06 29 1991 120 1017 DM354331 07 0
121. 2 25 truncation signalled 6 11 Check constraint definition of 5 19 Chunk description of 10 4 mirrored 10 5 CLOSE DATABASE statement effect on database locks 7 21 Clustered index description of 10 25 COBOL 6 6 Codd E F 1 12 Column defining 8 6 in relational model 1 13 8 6 label on 3 42 Column filter See Filter expression Column number 2 23 Column level privilege 11 10 Command script creating database 9 28 COMMIT WORK statement closes cursors 7 32 releases locks 7 23 7 32 sets SOQLCODE 7 5 Committed Read isolation level 7 25 Comparison condition description of 2 27 Compliance with industry standards Intro 21 Composite index use 4 33 Composite key 8 10 Compound query 3 37 Concurrency Committed Read isolation 7 25 Cursor Stability isolation 7 25 database lock 7 21 deadlock 7 29 description of 5 25 7 17 Dirty Read isolation 7 24 effect on performance 7 17 isolation level 7 24 kinds of locks 7 20 lock duration 7 23 lock scope 7 20 maximizing 10 33 10 36 Repeatable Read isolation 7 26 SERIAL values 9 7 table lock 7 21 Connect privilege 11 6 Constraint defining domains 9 3 optimizer uses 4 15 Contact information Intro 22 Contention for bottleneck tables 10 35 for disk access arms 10 7 reducing 10 33 10 36 Conventions example code Intro 16 syntax Intro 11 typographical Intro 11 Coordinated deletes 7 6 Correlated subquery definition of 3 29 example of 3 33 COUNT function and GROUP BY 3 6 as aggreg
122. 20 null NameFax NameVce NameString FaxNumber NameString VceNumber PK FK PK FK PK FK PK FK Gaius C Caesar 926 6741 Gaius C Caesar 1 800 274 8184 SPOR S A 61 62 435 143 SPOR S A 011 49 89 922 030 J Modem MdmNumber NameString VceNumber AddressCode PK UA FK NN FK FK 416 566 7024 Nite Owl BBS 926 6300 1001 a aa CompuServe null 1020 Figure 8 8 The data model with relationships between entities defined Building a Data Model 8 21 Step 3 List the Attributes Step 3 List the Attributes When all entities and relationships are found the model contains all the tables it can have However entities have attributes that is characteristics qualities amounts or features These attributes are added to the model as new columns Select Attributes In selecting attributes choose ones that have the following qualities They are significant Include only attributes that are important to the users of the database They are direct not derived An attribute that can be derived from existing attributes for instance through an expression in a SELECT statement should not be made part of the model The presence of derived data greatly complicates the main tenance of a database Ata later stage of the design discussed in Chapter 10 you can consider adding derived attributes to improve performance but at this stage you should exclude them Select Attribute Tables Yo
123. 4 28 The root page since it is used so often is almost always found in a page buffer The odds of finding a leaf page ina buffer depend on the size of the index the odds become poorer as the size of the table increases Optimizing Your Queries 4 25 Time Costs of a Query If a table is very large so that the number of index leaf pages is much larger than the buffer space almost every search causes a leaf page to be read in addition to the page containing the row The number of pages read is approx imately 2r where r is the number of rows to be looked up Although it is costly this kind of access is still a bargain since the alternative is to perform Each look up by reading the entire orders table with disk costs proportional tor The other way the database server uses an index is to read it sequentially It does this to fetch the rows of a table in a specific order other than the physical order For this kind of access the database server reads the leaf pages in sequence treating them as a list of rows in key sequence Since the index pages are read only once the total of disk operations is proportional to r i where i is the number of leaf pages in the index The Cost of Small Tables One conclusion you can draw from the preceding paragraphs is that small tables are never slow A table is small if it occupies so few pages that it can be retained entirely in the page buffers Any table that fits in four or fewer pages
124. 6 SQL in Programs discusses calling the database server retrieving rows and embedding data Chapter 7 Programs That Modify Data provides an in depth look at INSERT DELETE and UPDATE statements as well as a complete discus sion on concurrency and locking data Chapter 8 Building a Data Model describes the components of a data model and provides a step by step procedure for building one Chapter 9 Implementing the Model tells you how to define the data base domains and create the database Chapter 10 Tuning the Model discusses many of the details that help you set up an efficient database model including disk storage calculating table sizes managing indexes and maximizing concurrency Chapter 11 Security and Views details how you can ensure data secu rity by granting privileges and using stored procedures and views Chapter 12 Networks and Distribution discusses networks and how you can best set up a database to work over one A Notices appendix describes IBM products features and services IBM Informix Products That Use SQL IBM Informix Products That Use SOL IBM produces many application development tools and CASE tools that use SQL Application development tools currently available include products such as IBM Informix SQL IBM Informix 4GL and the IBM Informix 4GL Inter active Debugger and embedded language products such as IBM Informix ESQL C IBM Inform
125. 6 Simple SELECT Statements Single Table SELECT Statements Here the data is shown in ascending order of unit_price and where two or more rows have the same unit_price for example 20 00 48 00 312 00 the manu_code is in alphabetical order stock_num 302 302 301 204 108 305 303 311 manu_code description HRO KAR ANZ ANZ PRC PRC SMT HRO KAR SHM ANZ HRO PRC SHM ANZ RO KL MT RO RC HM SHM NZ nYa NKL SHM HSK HSK ice pack ice pack tennis racquet volleyball net frnt derailleur bicycle stem tennis racquet running shoes putter crankset tennis ball first aid kit socks water gloves helmet 3 golf balls 3 golf balls 3 golf balls baseball gloves football bicycle brakes 10 spd assmbld 12 spd assmbld basketball irons wedge 18 spd assmbld baseball gloves volleyball football 4 5 19 20 20 23 25 42 45 45 48 48 48 48 308 312 312 312 450 480 480 499 549 600 670 685 800 840 960 unit_price 50 00 80 00 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 99 00 00 00 90 00 00 00 unit unit descr each each each each each each eacn each each each each each each each each each each each each each case 24 cans case case 4 case box 24 pairs box box 4 pairs box case 4 case case 24 case case 24 case case 24 case
126. 74 8184 011 49 89 922 030 PK UA FK NN FK FK 416 566 7024 33 1 42 70 67 Nite Owl BBS CompuServe 926 6300 null Figure 8 1 The data model of a personal address book Building a Data Model 8 5 Basic Ideas Basic Ideas The following ideas are fundamental to most relational data model methods including Extended Relational Analysis Tables Rows and Columns You are already familiar with the idea of a table composed of rows and columns But you must respect four rules while you are defining the tables of a formal data model Rows must stand alone Each row of a table is independent and does not depend on any other row of the same table As a consequence the order of the rows in a table is not significant in the model The model should still be correct even if all the rows of a table are shuffled into random order After the database is implemented you can tell the database server to store rows in a certain order for the sake of efficiency but that does not affect the model Rows must be unique In every row some column must contain a unique value If no single col umn has this property the values of some group of columns taken as a whole must be different in every row Columns must stand alone The order of columns within a table has no meaning in the model The model should still be correct even if the columns are rearranged After the database is implemented
127. 8 13 34 0 03 13 106 maryj D 1991 06 12 08 20 0 00 05 121 maryj O 1991 07 10 14 05 0 00 01 127 maryj I 1991 07 31 14 30 110 riche L 1991 07 07 10 24 0 00 06 119 riche B 1991 07 01 15 00 0 17 21 Using Display Labels You can assign a display label to a computed or derived data column to replace the default column header expression In the three preceding examples you can define a display label after the computation in the SELECT clause The results displayed will be the same as shown earlier but the column display ing derived values will now have descriptive headers SELECT stock num description unit unit_descr unit_price unit _price 1 07 taxed FROM stock WHERE unit price gt 400 Here the label taxed is assigned to the expression in the select list that dis plays the results of the operation unit_price 1 07 stock _num description unit unit_descr unit price taxed 1 baseball gloves case 10 gloves case 800 00 856 0000 1 baseball gloves case 10 gloves case 450 00 481 5000 4 football case 24 case 960 00 1027 2000 4 football case 24 case 480 00 513 6000 7 basketball case 24 case 600 00 642 0000 8 volleyball case 24 case 840 00 898 8000 102 bicycle brakes case 4 sets case 480 00 513 6000 111 10 spd assmbld each each 499 99 534 9893 112 12 spd assmbld each each 549 00 587 4300 113 18 spd assmbld each each 685 90 733 9130 203 irons wedge case 2 sets case 670 00 716 9000 2 44 Simple SELECT Sta
128. 9 1991 121 1018 822942 07 10 1991 122 1019 255709 07 11 1991 123 1020 W2286 07 11 1991 124 1021 C3288 07 23 1991 126 1022 W9925 07 24 1991 127 1023 KF2961 07 24 1991 2 24 Simple SELECT Statements Single Table SELECT Statements You can include the DESC keyword in the ORDER BY clause when you have assigned integers to column names SELECT customer_num order_num po_num order date FROM orders ORDER BY 4 DESC 1 Here data is sorted first in descending order by order_date and within date in ascending order by customer_num Selecting Substrings You can select part of the value of a CHARACTER column by including a substring in the select list Suppose your marketing department is planning a mailing to your customers and wants a rough idea of their geographical dis tribution based on zip codes SELECT zipcode 1 3 customer_num FROM customer ORDER BY zipcode Simple SELECT Statements 2 25 Single Table SELECT Statements This SELECT statement uses a substring to select the first three characters of the zipcode column which identify the state and the full customer_num and lists them in ascending order by zip code zipcode customer _ num 021 125 080 119 085 122 198 121 322 123 604 127 740 124 802 126 850 128 850 120 940 105 940 112 940 113 940 11 5 940 104 940 116 940 110 940 114 940 106 940 108 940 117 940 111 940 101 940 109 941 102 943 103 943 107 946 118 Using the WH
129. 91 5 each tennis racquet 99 00 1010 06 17 91 1 case tennis balls 36 00 ORDERS Searching a file sequentially In contrast when you query a database you use the terms defined by its model To a database you can pose questions such as What orders have been placed for products made by the Shimara Corporation by customers in New Jersey with ship dates in the second quarter Figure 1 3 illustrates this type of query In other words when you interrogate data stored in a file you must state your question in terms of the physical layout of the file When you query a database you can ignore the arcane details of computer storage and state your query in terms that reflect the real world at least to the extent that the data model itself reflects the real world In this manual Chapters 2 and 3 discuss the language you use for making queries Chapters 8 through 11 discuss designing an accurate robust data model for other people to query Database Fundamentals 1 7 Databases What and Why RUN Next Restart Exit Display the next page of query results 1019 Bob Shorter swim cap 07 16 91 Figure 1 3 Querying a database Modifying Data The model also makes it possible to modify the contents of the database with less chance for error You can query the database with commands such as Find every stock item with a manufacturer of Presta or Schraeder and increase its price by 13 You state changes in te
130. AR 50 20 Telephone CHAR 13 only valid phone numbers True false CHAR 1 Y true N false DEFAULT N Voice phone type CHAR 10 Figure 9 5 The domains needed to complete the address book data model When you complete the list write the names of the domains under the col umns that use them in the display of the tables of the model For instance you write the domain Telephone under six columns in five tables of the address book model Figure 9 6 shows the complete model Implementing the Model 9 21 Defining the Domains NameString AddressCode BirthDate PK UA FK Gaius C Caesar SPOR S A Name Address AddressCode 1001 1020 Address code Street 17 03 1990 null Birthday City StaProv Postcode PK SA 1001 1020 Address code Voice VceNumber 2430 Tasso St 8 411 Bohannon Drive Street address PK UA 1 800 274 8184 011 49 89 922 030 Telephone Fax FaxNumber Voice phone type AddressCode St Louis Lenaxa City VceNumber CA Abta 83267 1048 TW2 5AQ State province Postal code OperFrom OperTill PK UA FK FK 926 6741 61 62 435 143 Telephone NameFax NameString 1001 1020 Address code FaxNumber PK FK PK FK Gaius C Caesar SPOR S A Name Modem MdmNumber 926 6741 61 62 435 143 Telephone NameS
131. ATE and DELETE statements provided that they have the necessary table level privileges e Execute a stored procedure provided that they have the necessary table level privileges e Create views provided that they are permitted to query the tables on which the views are based e Create temporary tables and create indexes on the temporary tables Connect privilege is necessary before users can access a database at all Ordi narily in a database that does not contain highly sensitive or private data you GRANT CONNECT TO PUBLIC shortly after creating the database The Users and the Public Privileges are granted to single users by name or to all users under the name of PUBLIC Any grant to the public serves as a default privilege Prior to executing a statement the database server determines whether the user has the necessary privileges The information is in the system catalog see Privileges in the System Catalog on page 11 9 The database server looks first for privileges granted specifically to the requesting user If it finds such a grant it takes that information and stops If there has been no grant to that user the database server looks for privi leges granted to public If it finds a relevant one it uses that Thus you can set a minimum level of privilege for all users by granting privileges to public You can override that in specific cases by granting higher individual privileges to users 11 6 Security S
132. Communications Area SQLCA altered by end of transaction 7 5 description of 6 7 inserting rows 7 11 SQLAWARN array description of 6 11 syntax of naming 6 10 with PREPARE 6 27 SQLCODE field after opening cursor 6 18 description of 6 10 end of data on SELECT only 7 14 end of data signalled 6 15 set by DELETE 7 4 set by DESCRIBE 6 31 set by PUT FLUSH 7 11 SQLERRD array count of deleted rows 7 4 count of inserted rows 7 11 count of rows 7 14 description of 6 11 syntax of naming 6 10 START DATABASE statement adding a transaction log 9 26 Static SOL 6 5 STATUS variable 4GL 6 10 Stored procedure security purposes 11 3 stores5 database copying Intro 7 creating on IBM Informix OnLine Intro 7 creating on IBM Informix SE Intro 8 overview Intro 6 Structured Query Language See SQL Subquery correlated 3 29 3 33 4 34 in DELETE statement 5 6 in SELECT 3 29 to 3 37 in UPDATE SET 5 13 in UPDATE WHERE 5 12 performance of 4 34 restrictions with UPDATE 5 13 Subscripting 2 39 Substring 2 25 SUM function as ageregate function 2 47 Symbol table 10 28 Synonym 12 13 to 12 14 chains of 12 14 Syntax diagram conventions Intro 11 elements of Intro 15 System catalog number of rows in a table 4 9 privileges in 5 16 11 9 querying 5 16 syscolauth 11 9 systabauth 5 16 11 9 systables 4 9 sysusers 11 9 used by optimizer 4 9 T Table bottleneck 10 35 contained in one dbspace 10 5 creating a table 9 26 dedicated device for 10 7 d
133. Compliance with Industry Standards Documentation Notes Release Notes Machine Notes In addition to the set of manuals the following on line files located in the INFORMIXDIR release directory may supplement the information in IBM Informix Guide to SQL Tutorial Online File Purpose SQOLTDOC_5 txt The documentation notes file describes features that are not covered in the manual or that were modified since publication ENGREL_5 txt The release notes file describes feature differences from earlier versions of IBM Informix products and how these differences might affect current products This file also contains information about any known problems and their workarounds ONLINE_5 txt The machine notes file describes any special actions that you must take to configure and use IBM Informix products on your computer Machine notes are named for the product described Please examine these files because they contain vital information about appli cation and performance issues A number of IBM Informix products also provide on line Help files that walk you through each menu option To invoke the Help feature simply press CTRL W wherever you are in your IBM Informix product Compliance with Industry Standards The American National Standards Institute ANSI has established a set of industry standards for SQL IBM Informix SQL based products are fully com pliant with SQL 92 Entry Level published as ANSI X3 135 1992 which is id
134. Data The second form of UPDATE statement replaces the list of assignments with a single bulk assignment in which a list of columns is set equal to a list of val ues When the values are simple constants this form is nothing more than the form of the previous example with its parts rearranged as in this example UPDATE customer SET fname lname WHERE customer_num Barnaby Dorfler 103 There is no advantage to writing the statement this way In fact it is harder to read since it is not obvious which values are assigned to which columns However when the values to be assigned come from a single SELECT state ment this form makes sense Suppose that changes of address are to be applied to several customers Instead of updating the customer table each time a change is reported the new addresses are collected in a single tempo rary table named newaddr It contains columns for the customer number and the address related fields of the customer table Now the time comes to apply all the new addresses at once This idea of collecting routine changes ina separate table and applying them in a batch outside of prime hours is one of the performance techniques covered in Chapter 10 of this manual UPDATE customer SET address1l address2 city state zipcode SELECT address1 address2 city state zipcode FROM newaddr WHERE newaddr customer_ num customer customer_num WHERE customer_num IN SELECT customer num FROM
135. Data on page 10 19 The tblspace is an accounting entity only it does not correspond to any par ticular part of a dbspace The indexes and data extents that make up a table can be scattered throughout the dbspace The tbcheck utility with the pt option returns information on the status of tblspaces including the counts of pages allocated and in use for each one You can use this information to monitor the growth of a table over time As you add rows to a table IBM Informix OnLine allocates disk space to it in units called extents Each extent is a block of physically contiguous pages from the dbspace Even when the dbspace comprises more than one chunk extents are always allocated entirely within a single chunk to remain contig uous Contiguity is important to performance When the pages of data are contig uous disk arm motion is minimized when the database server reads the rows sequentially The mechanism of extents is a compromise between the following competing requirements e Most dbspaces are shared among several tables e The size of some tables is not known in advance e Tables can grow at different times and different rates e All the pages of a table should be adjacent for best performance Since table sizes are not known table space cannot be preallocated There fore extents are added only as they are needed but all the pages in any one extent are contiguous for better performance IBM Informix OnLine Disk S
136. E hr data SET emp name hire date dept num NULL NULL 0 Less dramatic but equally necessary changes of privilege are required daily or even hourly in any model that contains sensitive data If you anticipate this need you can prepare some automated tools to help in the maintenance of privileges Security Stored Procedures and Views 11 13 Granting Privileges Your first step should be to specify privilege classes that are based on the jobs of the users not on the structure of the tables For example a first line man ager needs the following privileges e Select and limited Update privilege on the hypothetical hr_data table e Connect privilege to this and other databases e Some degree of privilege on several tables in those databases When the manager is promoted to a staff position or sent to a field office you must revoke all those privileges and grant a new set of privileges Define the privilege classes you support and for each class specify the data bases tables and columns to which you must give access Then devise two automated procedures for each class one to grant the class to a user and one to revoke it Automating with IBM Informix 4GL The mechanism you use depends on your operating system and other tools If you are a programmer the most flexible tool is probably IBM Informix 4GL 4GL makes it quite easy to program a simple user interaction as in this fragment DEFINE mgr_id char 20 P
137. E table L ie 7 ss E table 3 Figure 10 5 A dbspace reorganized to make tables compact Use the following steps to reorganize a dbspace e Copy the tables in the dbspace to tape individually using the tbunload utility e Drop all the tables in the dbspace e Re create the tables using the tbload utility The tbload utility re creates the tables with the identical properties they had before including the same extent sizes When a new extent is created adja cent to the previous extent the two are treated as a single extent You can also unload a table using the UNLOAD command of DB Access IBM Informix SQL or IBM Informix 4GL and reload the table using the com panion LOAD command or the dbload utility However these operations convert the table into character form while tbload and tbunload work with binary copies of disk pages There are two more ways to reorganize a single table If you use the ALTER TABLE command to add or drop a column or to change the data type of a col umn the table is copied and reconstructed If you create a clustered index or alter an index to cluster the table is sorted and rewritten See Clustered Indexes on page 10 25 In both cases the table is written on other areas of the dbspace However if other tables are in the dbspace there is no guarantee that all the new extents are adjacent 10 12 Tuning the Model Calculating Table Sizes Calculating Table Sizes This
138. ECT order_num COUNT number SUM total price price FROM items GROUP BY 1 ORDER BY 3 When you build your SELECT statement remember that all non aggregate columns that are in the select list in the SELECT clause must also be included in the group list in the GROUP BY clause The reason for this is that a SELECT with GROUP BY must return only one row per group Columns that are listed after GROUP BY are certain to reflect only one distinct value within a group and that value can be returned However a column not listed after GROUP BY might contain different values in the rows that are contained in a group Advanced SELECT Statements 3 7 Using the GROUP BY and HAVING Clauses You can use the GROUP BY clause in a SELECT statement that joins tables SELECT o order_num SUM i total_ price FROM orders o items i WHERE o order date gt 01 01 90 AND o customer_num 110 AND o order_num i order_num GROUP BY o order_num This query joins the orders and items tables assigns table aliases to them and returns the following two rows order _num sum 1008 940 00 1015 450 00 Using the HAVING Clause The HAVING clause usually complements a GROUP BY clause by applying one or more qualifying conditions to groups after they are formed similar to the way the WHERE clause qualifies individual rows One advantage to using a HAVING clause is that you can include aggregates in the search condition whereas you cannot inclu
139. ECT statement returns the following set of rows customer _num call code call _dtime res dtime 106 D 1991 06 12 08 20 1991 06 12 08 25 121 0 1991 07 10 14 05 1991 07 10 14 06 127 1 1991 07 31 14 30 2 28 Simple SELECT Statements Single Table SELECT Statements Excluding Rows Use the relational operators or lt gt to exclude rows in a WHERE clause The following examples assume that you are selecting from an ANSI compliant database and thus they specify the owner or login name of the cre ator of the customer table This qualifier is not required when the creator of the table is the current user or when the database is not ANSI compliant although it is not incorrect to include it in either case For a complete discus sion of owner naming see the IBM Informix Guide to SQL Reference SELECT customer_num company city state FROM odin customer WHERE state CA SELECT customer _num company city state FROM odin customer WHERE state lt gt CA Both of these statements exclude values by specifying that in the customer table owned by the user odin the value in the state column should not be equal to CA customer num company city state 119 The Triathletes Club Cherry Hill NJ 120 Century Pro Shop Phoenix AZ 121 City Sports Wilmington DE 122 The Sporting Life Princeton NJ 123 Bay Sports Jacksonville FL 124 Putnum s Putters Bartlesville OK 125 Total Fitness Sports Brighton MA 126 Neelie s Discou
140. ERE Clause Perhaps you want to see only those orders placed by a particular customer or the calls entered by a particular customer service representative You would add a WHERE clause to a SELECT statement to retrieve these specific rows from a table You can use the WHERE clause to set up a comparison condition or a join condition This section demonstrates only the first use Join conditions are described in a later section and in the next chapter 2 26 Simple SELECT Statements Single Table SELECT Statements The set of rows returned by a SELECT statement is the active set for that state ment A singleton SELECT statement returns a single row In IBM Informix 4GL or an embedded language program the retrieval of multiple rows requires the use of a cursor See Chapters 6 and 7 in this manual Creating a Comparison Condition Figure 2 2 The WHERE clause of a SELECT statement specifies the rows you want to see A comparison condition employs specific keywords and operators to define the search criteria For example you might use one of the keywords BETWEEN IN LIKE or MATCHES to test for equality or the keywords IS NULL to test for null values You can combine the keyword NOT with any of these keywords to specify the opposite condition Figure 2 2 lists the relational operators you can use in a WHERE clause in place of a keyword to test for equality Operator Operation equals or lt gt does not equal gt gre
141. Further they demonstrate a query on an external table Here the stock table is in the external database sloth which besides being outside the current stores5 database is on a separate database server called meerkat Simple SELECT Statements 2 35 Single Table SELECT Statements For details on external tables external databases and networks see Chapter 12 in this manual See also the IBM Informix Guide to SQL Reference SELECT FROM sloth meerkat stock WHERE manu_code LIKE R AND unit_price gt 100 ORDER BY description unit price SELECT FROM sloth meerkat stock WHERE manu_code MATCHES R AND unit_price gt 100 ORDER BY description unit price Both SELECT statements retrieve only those rows for which the middle letter of the manu_code is R RC twin jogger 280 00 each each RO watch 280 00 box 10 box stock _num manu_code description unit_price unit unit descr 205 HRO 3 golf balls 312 00 each 24 case 306 PRC Tandem adapter 160 00 each each 307 PRC baby jogger 250 00 each each 2 HRO baseball 126 00 case 24 case 1 HRO baseball gloves 250 00 case 10 gloves case 7 HRO basketball 600 00 case 24 case 102 PRC bicycle brakes 480 00 case 4 sets case 114 PRC bicycle gloves 120 00 case 10 pairs case 4 HRO football 480 00 case 24 case 110 PRC helmet 236 00 case 4 case 110 HRO helmet 260 00 case 4 case P H The comparison _R_ for LIKE or R for MATCHES specifies from left to righ
142. HAR 10 CREATE TABLE FAX FaxNumber CHAR 13 PRIMARY KEY AddressCode INTEGER VceNumber CHAR 13 OperFrom DATETIME HOUR TO MINUTE OperTill DATETIME HOUR TO MINUTE FOREIGN KEY AddressCode REFERENCES ADDRESS AddressCode FOREIGN KEY VceNumber REFERENCES VOICE VceNumber CREATE TABLE NAMEVCE NameString VARCHAR 50 20 VceNumber CHAR 13 PRIMARY KEY NameString VceNumber FOREIGN KEY NameString REFERENCES NAME NameString FOREIGN KEY VceNumber REFERENCES VOICE VceNumber CREATE TABLE NAMEFAX NameString VARCHAR 50 20 FaxNumber CHAR 13 PRIMARY KEY NameString FaxNumber FOREIGN KEY NameString REFERENCES NAME NameString FOREIGN KEY FaxNumber REFERENCES FAX FaxNumber i CREATE TABLE MODEM MdmNumber CHAR 13 PRIMARY KEY NameString VARCHAR 50 20 NOT NULL VceNumber CHAR 13 AddressCode INTEGER B300 CHAR 1 DEFAULT N B1200 CHAR 1 DEFAULT N B2400 CHAR 1 DEFAULT N FOREIGN KEY NameString REFERENCES NAME NameString FOREIGN KEY VceNumber REFERENCES VOICE VceNumber FOREIGN KEY AddressCode REFERENCES ADDRESS AddressCode i Figure 9 7 The CREATE TABLE statements for the address book data model Implementing the Model 9 27 Creating the Database Using Command Scripts You can create the database and tables by entering the statements interac tively But what if you have to do it again or several more times Y
143. HERE customer state state code The result of this query is composed of specified rows and columns from both the customer and state tables city state zipcode sname Bartlesville OK 74006 Oklahoma Blue Island NY 60406 New York Brighton MA 02135 Massachusetts Cherry Hill NJ 08002 New Jersey Denver CO 80219 Colorado Jacksonville FL 32256 Florida Los Altos CA 94022 California Menlo Park CA 94025 California Mountain View CA 94040 California Mountain View CA 94063 California Oakland CA 94609 California Palo Alto CA 94303 California Palo Alto CA 94304 California Phoenix AZ 85008 Arizona Phoenix AZ 85016 Arizona Princeton NJ 08540 New Jersey Redwood City CA 94026 California Redwood City CA 94062 California Redwood City CA 94063 California San Francisco CA 94117 California Sunnyvale CA 94085 California Sunnyvale CA 94086 California Wilmington DE 19898 Delaware 2 10 Simple SELECT Statements Introducing the SELECT Statement What This Chapter Contains This chapter introduces the basic methods for retrieving data from a rela tional database More complex uses of SELECT statements such as subque ries outer joins and unions are discussed in the next chapter Most of the examples in this chapter are taken from the nine tables in the stores5 demonstration database which is installed with the software for your IBM Informix application development tool In the interest of brevity the examples may show only part of the data t
144. IVE RENAME TABLE customer TO old_cust CREATE SYNONYM customer FOR stores5 db_ crunch customer CLOSE DATABASE When you execute a query within stores5 avignon a reference to table customer finds the synonym and is redirected to the version on the new com puter This is also true of queries executed from database server nantes The synonym in the database stores5 nantes still redirects references to customer to database stores5 avignon however the new synonym there sends the query to database stores5 db_crunch Chains of synonyms can be useful when as in this example you want to redi rect all access to a table in one operation However as soon as possible you should update all users databases so their synonyms point directly to the table There is extra overhead in handling the extra synonyms and if any computer in the chain is down the table cannot be found 12 14 Networks and Distribution Summary Modifying External Tables Summary The following example shows how you can modify external tables DATABASE stores5 nantes BEGIN WORK UPDATE stores5 avignon customer SET phone 767 8592 WHERE customer num 149 COMMIT WORK You can modify more than one table in the same transaction However the same IBM Informix OnLine database server if you are not using OnLine with IBM Informix STAR or IBM Informix TP XA must manage all the tables in a single transaction In the preceding example an external t
145. Institute ANSI issued the SQL1 standard in 1986 This standard defines a core set of SQL features and the syntax of statements such as SELECT Informix SOL and ANSI SOL The SQL version that is supported by IBM Informix products is highly com patible with standard SQL it is also compatible with the IBM version of the language However it does contain extensions to the standard that is extra options or features for certain statements and looser rules for others Most of the differences occur in the statements that are not in everyday use For exam ple few differences occur in the SELECT statement which accounts for 90 of the SOL use for a typical person However the extensions do exist and that creates a conflict Thousands of our customers have embedded Informix style SQL in programs and stored queries They rely on us to keep its language the same Other customers require the ability to use databases in a way that conforms exactly to the ANSI standard They rely on us to change its language to conform 1 16 Database Fundamentals The Database Software We resolved the conflict with the following compromise e Our version of SQL with its extensions to the standard is available by default e You can ask any Informix SQL language processor to check your use of SQL and post a warning flag whenever you use an Informix extension This resolution is fair but makes the SQL documentation more complicated Wherever there is a
146. Line to tell you what was chosen Other IBM Informix database servers use the file stor age of the host operating system so their page size is the block size used by the host operating system One kilobyte 1 024 bytes is a typical size but you should check it for the operating system you use It is possible to define tables so wide that one row fills a page some database servers permit a row to exceed the size of a page However a typical row size is between 50 and 200 bytes so in a typical table a disk page contains from 5 to 50 rows An index entry consists of a key value and a 4 byte pointer so an index page typically contains from 50 to 500 entries Page Buffers The database server has a set of memory spaces in which it keeps copies of the disk pages it read most recently It does this in the hope that these pages will be needed again If they are the database server will not have to read them from disk Like the size of a disk page the number of these page buffers depends on the database server and the host operating system The Cost of Reading a Row When the database server needs to examine a row that is not already in mem ory it must read it from disk It does not read just one row it reads the pages that contain the row When a row is larger than a page it reads as many whole pages as necessary The cost of reading one page is the basic unit of work that the optimizer uses for its calculations The actual cost of
147. ND PROCEDURE Figure 11 4 Stored procedure to restrict reads on customer data 11 18 Security Stored Procedures and Views Using Stored Procedures Restricting Changes to Data Figure 11 5 Using stored procedures you can restrict changes made to a table Simply channel all changes through a stored procedure The stored procedure makes the changes rather than users making the changes directly If you want to limit users to deleting one row at a time to ensure that they do not acciden tally remove all the rows in the table set up the database with the following privileges e You are the DBA of the database e All the users have Connect privilege to the database They may or may not have Resource privilege They do not have Delete for this example privilege on the table being protected e Your stored procedure is created using the DBA keyword e Your stored procedure performs the deletion Write a stored procedure similar to the one in Figure 11 5 which deletes rows from the customer table using a WHERE clause with the customer_num provided by the user CREATE DBA PROCEDURE delete _customer cnum INT DELETE FROM customer WHERE customer_num cnum END PROCEDURE Stored procedure to delete a row Monitoring Changes to Data Using stored procedures you can create a record of changes made to a data base You can record changes made by a particular user or you can make a record of each time a change is
148. OnLine database servers You can use synonyms to disguise the locations of these tables Networks and Distribution 12 15 Notices IBM may not offer the products services or features discussed in this document in all countries Consult your local IBM repre sentative for information on the products and services currently available in your area Any reference to an IBM product program or service is not intended to state or imply that only that IBM product program or service may be used Any functionally equivalent product program or service that does not infringe any IBM intellectual property right may be used instead However it is the user s responsibility to evaluate and verify the operation of any non IBM product program or service IBM may have patents or pending patent applications covering subject matter described in this document The furnishing of this document does not give you any license to these patents You can send license inquiries in writing to IBM Director of Licensing IBM Corporation North Castle Drive Armonk NY 10504 1785 U S A For license inquiries regarding double byte DBCS information contact the IBM Intellectual Property Department in your country or send inquiries in writing to IBM World Trade Asia Corporation Licensing 2 31 Roppongi 3 chome Minato ku Tokyo 106 0032 Japan A 2 The following paragraph does not apply to the United Kingdom or any other country where such
149. Pauli company All Sports Supplies address1 213 Erstwild Court address2 city Sunnyvale state CA Zipcode 94086 phone 408 789 8075 code HI sname Hawaii customer num 101 fname Ludwig lname Pauli company All Sports Supplies address1l 213 Erstwild Court address2 city Sunnyvale state CA Zipcode 94086 phone 408 789 8075 code CA sname California Note that some of the data displayed in the concatenated rows is inaccurate For example while the city and state from the customer table indicate an address in California the code and sname from the state table might be for a different state Simple SELECT Statements 2 61 Multiple Table SELECT Statements Creating a Join Conceptually the first stage of any join is the creation of a Cartesian product To refine or constrain this Cartesian product and eliminate meaningless rows of data include a WHERE clause with a valid join condition in your SELECT statement This section illustrates equi joins natural joins and multiple table joins More complex forms such as self joins and outer joins are covered in Chapter 3 Equi Join An equi join is a join based on equality or matching values This equality is indicated with an equal sign in the comparison operation in the WHERE clause SELECT FROM manufact stock WHERE manufact manu_code stock manu_code This SELECT statement joins the manufact and stock tables on the manu_code column retrieving onl
150. R n Length exceeds 255 bytes ied TEXT VARCHAR m r BYTE Figure 9 1 A diagram of the decisions to be made in choosing a data type 2 of 2 9 6 Implementing the Model Defining the Domains Numeric Types Informix database servers support eight numeric data types Some are best suited for counters and codes some for engineering quantities and some for money Counters and Codes INTEGER and SMALLINT The INTEGER and SMALLINT data types hold small whole numbers They are suited for columns that contain counts sequence numbers numeric identity codes or any range of whole numbers when you know in advance the max imum and minimum values to be stored Both types are stored as signed binary integers INTEGER values have 32 bits and can represent whole numbers from 2 through 231_1 that is from 2 147 483 647 through 2 147 483 647 The maximum negative number 2 147 483 248 is reserved and cannot be used SMALLINT values have only 16 bits They can represent whole numbers from 32 767 through 32 767 The maximum negative number 32 768 is reserved and cannot be used These data types have two advantages e They take up little space 2 bytes per value for SMALLINT and 4 bytes per value for INTEGER e Arithmetic expressions like SUM and MAX and sort comparisons can be done very efficiently on them The disadvantage to using INTEGER and SMALLINT is the limited range of values they can store The data
151. R value is displayed just as CHARACTER values are displayed e If you select a TEXT column the contents of the TEXT column are dis played and you can scroll through them Simple SELECT Statements 2 11 Single Table SELECT Statements e Ifyou query ona BYTE column the words lt BYTE value gt are displayed instead of the actual value Differences specific to VARCHAR TEXT and BYTE are noted as appropriate throughout this chapter For additional information on these and other data types see Chapter 9 in this manual See also the IBM Informix Guide to SQL Ref erence Single Table SELECT Statements There are many ways to query ona single table in a database You can tailor a SELECT statement to e Retrieve all or specific columns e Retrieve all or specific rows e Perform computations or other functions on the retrieved data e Order the data in various ways Selecting All Columns and Rows The most basic SELECT statement contains just the two required clauses SELECT and FROM Using the Asterisk The following statement specifies all the columns in the manufact table in a select list A select list is a list of the column names or expressions that you want to project from a table SELECT manu_code manu_name lead_time FROM manufact The following statement uses the wildcard as shorthand for the select list The asterisk stands for the names of all the columns in the table You can use the asterisk whenever yo
152. ROMPT What is the user id of the new manager FOR mgr_id CALL table grant SELECT hr data mgr_id Unfortunately although IBM Informix 4GL allows you to mix GRANT and REVOKE statements freely with other program statements it does not permit you to create parameters from them from program variables To customize a GRANT statement with a user id taken from user input the program must build the statement as a string prepare it with a PREPARE statement and exe cute it with an EXECUTE statement These statements are discussed in detail in Chapter 6 where the following example is analyzed in detail 11 14 Security Stored Procedures and Views Figure 11 2 Granting Privileges Figure 11 2 shows one possible definition of the 4GL function table_grant that is invoked by the CALL statement in the preceding example FUNCTION table grant priv_to_grant table name user_id DEFINE priv_to_ grant char 100 may include column list table name CHAR 20 user_id CHAR 20 grant stmt CHAR 200 LET grant stmt GRANT priv_to grant ON table name TO user_id WHENEVER ERROR CONTINUE PREPARE the_grant FROM grant_stmt IF status 0 THEN EXECUTE the_grant END IF IF status lt gt 0 THEN DISPLAY Sorry got error status attempting DISPLAY grant_stmt END IF WHENEVER ERROR STOP FUNCTION END A 4GL function that builds prepares and executes a GRANT statement Automating with a C
153. Relay Module IBM Informix NET only The Relay Module component of IBM Informix NET resides on the client machine in a distributed data processing environment and relays messages between the application development tool and an IBM Informix OnLine or IBM Informix SE database server through a net work interface The Relay Module allows version 5 0 application develop ment tools to connect to a remote database server without the need to run an IBM Informix database server process on the client Two Phase Commit IBM Informix STAR only The new two phase commit protocol allows you to manipulate data in multiple databases on multiple OnLine database servers within a single transaction It ensures that transactions that span more than one OnLine database server are committed on an all or nothing basis Support for Transaction Processing in the XA Environment IBM Informix TP XA only IBM Informix TP XA allows you to use the IBM Informix OnLine database server as a Resource Manager in conformance with the X Open Preliminary Specification April 1990 Distributed Transaction Processing The XA Interface The IBM Informix TP XA User Manual describes the changes in the behavior of existing SQL statements that manage transactions in an X Open environment Document Conventions 10 Introduction This manual assumes that you are using IBM Informix OnLine as your data base server Features and behavior specific to IBM Informix SE are noted throug
154. TO is used to specify the program or host variable to receive data from a SELECT statement in the IBM Informix 4GL and IBM Informix ESQL products Complete syntax and rules for using the SELECT statement are shown in Chapter 7 of IBM Informix Guide to SQL Refer ence Some Basic Concepts The SELECT statement unlike INSERT UPDATE and DELETE statements does not modify the data in a database It is used simply to query on the data Whereas only one user at a time can modify data any number of users can query on or select the data concurrently The statements that modify data are discussed in Chapter 5 The INSERT UPDATE and DELETE statements appear in Chapter 7 of IBM Informix Guide to SQL Reference Privileges Before you can query on data you must have CONNECT privilege to the data base and SELECT privilege to the tables in it These privileges normally are granted to all users as a matter of course Database access privileges are dis cussed in Chapter Overview on page 11 3 of this manual and in the GRANT and REVOKE statements in Chapter 7 of IBM Informix Guide to SQL Reference In a relational database a column is a data element that contains a particular type of information that occurs in every row in the table A row is a group of related items of information about a single entity across all columns ina database table 2 4 Simple SELECT Statements Introducing the SELECT Statement You can select columns and rows
155. WHERE paid date IS NULL AND ship date IS NOT NULL ORDER BY customer num Simple SELECT Statements 2 33 Single Table SELECT Statements This SELECT statement returns all rows that have a NULL paid_date and that do not also have a NULL ship_date order num customer _num po_num ship date 1004 106 8006 05 30 1991 1007 117 278693 06 05 1991 1012 117 278701 06 29 1991 1016 119 PC6782 07 12 1991 1017 120 DM354331 07 13 1991 Using Variable Text Searches You can use the keywords LIKE and MATCHES for variable text queries based on substring searches of CHARACTER fields Include the keyword NOT to indicate the opposite condition The keyword LIKE is the ANSI standard whereas MATCHES is an Informix extension Variable text search strings can include the wildcards listed in Figure 2 3 with LIKE or MATCHES Symbol Meaning LIKE evaluates to zero or more characters _ evaluates to a single character escapes special significance of next character MATCHES evaluates to zero or more characters evaluates to a single character except NULL evaluates to single character or range of values escapes special significance of next character geri Figure 2 3 Wildcards used with LIKE and MATCHES You cannot test a TEXT or BYTE column with LIKE or MATCHES Using Exact Text Comparisons The following examples include a WHERE clause that searches for exact text comparisons by using the keyword LIKE or MATCHES or the
156. a Model 8 3 Why Build a Data Model 3 Identify the attributes intrinsic features associated with the entities and relationships Chapter 9 adds a fourth step specifying the domain data type of each attribute The end product of modeling is a set of tables like those in Figure 8 1 which shows the final set of tables for a personal address book The personal address book is an example developed in this chapter It is used rather than the stores5 database used in the rest of this book because it is small enough to be developed completely in one chapter but large enough to show the entire method 8 4 Building a Data Model Why Build a Data Model Name NameString AddressCode BirthDate PK UA Gaius C Caesar SPOR S A a Address AddressCode FK 17 03 1990 null StaProv City Postcode PK SA 1001 1020 VceNumber 2430 Tasso St 8 St Louis 411 Bohannon Drive Lenaxa PK UA 1 800 274 8184 011 49 89 922 030 Fax FaxNumber AddressCode VceNumber OperFrom 83267 1048 TW2 5AQ OperTill PK UA FK 926 6741 61 62 435 143 NameFax NameString 926 6300 FaxNumber NameString PK FK VceNumber PK FK PK FK PK FK Gaius C Caesar SPOR S A Modem MdmNumber 926 6741 61 62 435 143 Gaius C Caesar SPOR S A NameString VceNumber AddressCode 1 800 2
157. able at database server avignon is updated You also can modify other tables at avignon in the same transaction However you cannot modify a table in the current data base since the current database is managed by nantes The simplest network the LAN lets multiple workstations share a disk Each workstation has its application program and its own copy of the database server but the tables it uses can be located on disks attached to one or more computers Multiple workstations share the data but all input and output travels over the network and that can cause a performance problem The more general form of network supported by IBM Informix NET and IBM Informix STAR products separates the application from the database server The application runs in one machine while the database server oper ates in the computer to which the data is physically attached There are many possible combinations of network software operating systems and database servers and each has its subtleties that must be mastered In general networking the crucial moment occurs when the application opens a database At that moment based on information in the command or in an environment variable the network software locates the database and sets up communication to the database server that manages it When you use IBM Informix OnLine with the IBM Informix STAR feature installed you can query and modify tables from multiple databases managed by multiple IBM Informix
158. able named op_d_ind is associated with the host vari able It must be declared as a short integer elsewhere in the program Following execution of the SELECT statement the program tests the indicator variable for a negative value A negative number usually 1 means that the value retrieved into the main variable is null If that is the case this program uses a C function to assign a default value to the host variable The function rstrdate is part of the IBM Informix ESQL C product The syntax you use to associate an indicator variable differs with the lan guage you are using but the principle is the same in all However indicator variables are not used explicitly in 4GL or in SPL since in those languages null values are supported for variables In 4GL the preceding example is written as follows SELECT paid _ date INTO op date FROM orders WHERE order num the order IF op date IS NULL THEN LET op date date 01 01 1900 END IF Retrieving Single Rows Dealing with Errors Although the database server handles conversion between data types auto matically several things still can go wrong with a SELECT statement In SQL programming as in any kind of programming you must anticipate errors and provide for them at every point End of Data One common event is that no rows satisfy a query This is signalled by a code of 100 in SQLCODE or sqlca sqlcode as it is also known in ESQL C follow ing a SELECT state
159. able with null data An Insert Example The preceding section on the DELETE statement contains an example whose purpose is to look for and delete duplicate rows of a table see Deleting with a Cursor on page 7 7 A better way to do the same thing is to select the desired rows instead of deleting the undesired ones The IBM Informix 4GL code in Figure 7 5 shows one way to do this The example is written in IBM Informix 4GL to take advantage of some features that make SQL programming easy 7 12 Programs That Modify Data Figure 7 5 Using INSERT BEGIN WORK INSERT INTO new_orders SELECT FROM ORDERS main WHERE 1 SELECT COUNT FROM ORDERS minor WHERE main order_ num minor order_num COMMIT WORK DEFINE ord_row RECORD LIKE orders last_ord LIKE orders order_num DECLARE dup row CURSOR FOR SELECT FROM ORDERS main INTO ord_row WHERE 1 lt SELECT COUNT FROM ORDERS minor WHERE main order_num minor order_num ORDER BY order date DECLARE ins row CURSOR FOR INSERT INTO new_orders VALUES ord_row BEGIN WORK OPEN ins_row LET last_ord 1 FOREACH dup_row IF ord_row order_num lt gt last_ord THEN PUT ins row LET last_ord ord_row order_num END IF END FOREACH CLOSE ins_row COMMIT WORK A 4GL program that re creates a table without duplicates This example begins with an ordinary INSERT statement that finds all the nonduplicated rows of the table and inserts them into another table presum ably c
160. ables Once specified a parent child relationship between two tables is enforced by the database server Other constraints allow you to specify a default value for a column or to specify a condition for a column that an inserted value must meet Stored Procedures A stored procedure is a function written by a user using a combination of SQL statements and Stored Procedure Language SPL Once created a procedure is stored as an object in the database in a compiled optimized form and is available to other users with the appropriate privileges In a client server environment the use of stored procedures can significantly reduce network traffic Dynamic SQL Support is provided for the X Open implementation of dynamic SQL using a system descriptor area This support involves the new SQL state ments ALLOCATE DESCRIPTOR DEALLOCATE DESCRIPTOR GET DESCRIPTOR and SET DESCRIPTOR as well as changes in the syntax of existing dynamic management statements Optimizer Enhancement You can use the new SET OPTIMIZATION statement to instruct the data base server to select a high or low level of query optimization The default level of HIGH causes the database server to examine and select the best of all possible optimization strategies Since this level of optimization may result in a longer than desired optimization time for some queries you have the option of setting an optimization level of LOW Introduction 9 Document Conventions e
161. achine Notes 21 Compliance with Industry Standards 21 IBM Welcomes Your Comments 22 2 Introduction In This Introduction This introduction provides an overview of the information in this manual and describes the conventions it uses About this Manual This book is a tutorial on the Structured Query Language SQL as it is imple mented by IBM Informix products IBM Informix Guide to SQL Tutorial and its companion volume IBM Informix Guide to SQL Reference tell you how to cre ate manage and use relational databases with IBM Informix software tools IBM Informix Guide to SQL Tutorial was written for people who already know how to use computers To use this book effectively you regularly should use a computer either a desktop workstation or a terminal connected to a larger machine in the course of your daily work You need to know how to start programs create and copy files and execute other common commands of your computer operating system You also need to have the following IBM Informix software e An IBM Informix OnLine database server or an IBM Informix SE database server The database server either must be installed in your machine or in another machine to which your machine is connected over a network e An IBM Informix application development tool such as IBM Informix SQL IBM Informix 4GL or DB Access The application development tool enables you to compose queries send them to the database server and view
162. ack This can only occur if the loop generates enough rows to fill the buffer at least once otherwise the PUT statement cannot generate an error The program might end the loop with rows still in the buffer possibly with out inserting any rows at all Then the SQL status is zero and the FLUSH oper ation is performed If the FLUSH operation produces an error code the transaction is rolled back Only when all inserts are successfully performed is the transaction committed Rows of Constants The insert cursor mechanism supports one special case where high perfor mance is easy to obtain This is the case in which all of the values listed in the INSERT statement are constants no expressions and no host variables just literal numbers and strings of characters No matter how many times such an INSERT operation is performed the rows it produces are identical In that case there is no point in copying buffering and transmitting each identical row Programs That Modify Data 7 11 Using INSERT Instead for this kind of INSERT operation the PUT statement does nothing whatever except to increment a counter When finally a FLUSH operation is performed a single copy of the row and the count of inserts is passed to the database server The database server creates and inserts that many rows in one operation It is not common to insert a quantity of identical rows You can do it when you first establish a database to populate a large t
163. action This is sometimes possible but it may become impractical if there are very many rows to update The num ber of locks can be too large and they are held for the duration of the program Programs That Modify Data Summary Summary A solution supported by IBM Informix database servers is to add the key words WITH HOLD to the declaration of the master cursor Such a cursor is referred to as a hold cursor and is not closed at the end of a transaction The database server still closes all other cursors and it still releases all locks but the hold cursor remains open until it is explicitly closed Before you attempt to use a hold cursor you must be sure that you under stand the locking mechanism described here and also that you understand the programs that are running concurrently The reason is that whenever COMMIT WORK is executed all locks are released including any locks placed on rows fetched through the hold cursor This has little importance if the cursor is used as intended for a single for ward scan over a table However you are allowed to specify WITH HOLD for any cursor including update cursors and scroll cursors Before you do this you must understand the implications of the fact that all locks including locks on entire tables are released at the end of a transaction A program can execute the INSERT DELETE and UPDATE statements just as they were described in Chapter 5 A program also can scan through a ta
164. alled from 4GL programs and ACE reports Finding the Guilty Functions In most programs a very small fraction of the code typically 20 or less accounts for the bulk of the program execution time typically 80 or more The 80 20 rule as it is called holds in most cases often the proportions are even greater After you establish a timing mechanism use it to define the hot spots in the application that is the statements that consume most of the time Keeping an Open Mind With embedded SQL in which one statement can trigger thousands of disk accesses it is likely that the guilty 20 includes some SQL However this is by no means certain If you do not begin your examination of the problem with an open mind it is easy to overlook the part of a program that is consuming the most time If the sluggish operations are not due to the SQL turn to the books cited on page 4 3 If the SQL statements need attention you need to understand the actions of the query optimizer Optimizing Your Queries 4 7 The Query Optimizer The Query Optimizer The optimizer component of the database server decides how to perform a query Its most important job is to decide the order in which to examine each table row To make that decision it has to decide on the most efficient way to access each table by a sequential scan of its rows by an existing index or by a temporary index built for the occasion and it has to estimate how many rows eac
165. and allocates storage for it You can use the cursor declared in the preceding example to read once through the items table Cur sors can be declared to read both backward and forward see Cursor Input Modes on page 6 20 This cursor since it lacks a FOR UPDATE clause prob ably is used only to read data not to modify it The use of cursors to modify data is covered in Chapter 7 of this manual Opening a Cursor 6 18 SQL in Programs The program opens the cursor when it is ready to use it The OPEN statement activates the cursor It passes the associated SELECT statement to the database server which begins the search for matching rows The database server pro cesses the query to the point of locating or constructing the first row of out put It does not actually return that row of data but it does set a return code in SQLCODE Here is the OPEN statement in IBM Informix 4GL OPEN the_item Since this is the first time that the database server has seen the query it is the time when many errors are detected After opening the cursor the program should test SQLCODE If it contains a negative number the cursor is not usable There may be an error in the SELECT statement or some other prob lem may be preventing the database server from executing the statement Retrieving Multiple Rows If SQLCODE contains a zero the SELECT statement is syntactically valid and the cursor is ready for use At this point however the pro
166. anges take place between the program and the database server Dynamic SQL Executing Prepared SOL Figure 6 8 Once a statement is prepared it can be executed any number of times State ments other than SELECT statements and SELECT statements that return only a single row are executed with the EXECUTE statement Figure 6 8 shows how IBM Informix ESQL C prepares and executes a multi statement update of a bank account Schar bigquery 15 begin work stcat update account set balance balance where bigquery stcat acct_number bigquery stcat update teller set balance balance where bigquery stcat teller number bigquery stcat update branch set balance balance where bigquery stcat branch number bigquery stcat insert into history values timestamp values bigquery stcat commit work bigquery SPREPARE bigq FROM Sbigquery SEXECUTE bigq USING delta Sacct_number delta Steller number delta branch_number Preparing and executing a multistatement operation in ESQL C The USING clause of the EXECUTE statement supplies a list of host variables whose values are to take the place of the question marks in the prepared statement Using Prepared SELECT Statements A dynamically prepared SELECT statement cannot simply be executed it might produce more than one row of data and the database server not knowing which row to return
167. annot be used in the following ways e Inarithmetic or Boolean expressions e Ina GROUP BY or ORDER BY clause e Ina UNIQUE test e For indexing either by itself or as part of a composite index In a SELECT statement entered interactively or in a form or report a blob can only e Be selected by name optionally with a subscript to extract part of it e Have its length returned by selecting LENGTH column e Be tested with the IS NOT NULL predicate In an interactive INSERT statement you can use the VALUES clause to insert a blob value but the only value you can give that column is null However you can use the SELECT form of the INSERT statement to copy a blob value from another table In an interactive UPDATE statement you can update a blob column to null or to a subquery returning a blob column 9 18 Implementing the Model Defining the Domains The advantage of the TEXT data type over CHAR n and VARCHAR m is that the size of a TEXT data item has no limit except the capacity of disk storage to hold it The disadvantages of the TEXT data type are as follows e Itis allocated in whole disk pages a short item wastes space e There are restrictions on how you can use a TEXT column in an SQL state ment See How Blobs Are Used on page 9 18 e Itis not available with all Informix database servers You can display TEXT values in reports generated with IBM Informix 4GL pro grams or the ACE report writer You ca
168. art of a DATETIME value in the system defined format The trick is to isolate the component fields using the EXTEND function and pass them through the MDY function which converts them to a DATE Here is a partial example Sioumislem sos MDY EXTEND DATE_RECEIVED MONTH TO MONTH EXTEND DATE RECEIVED DAY TO DAY EXTEND DATE RECEIVED YEAR TO YEAR BROMM RE Cheba Smee When you are designing a report using IBM Informix 4GL or IBM Informix SQL you have the greater flexibility of the PRINT statement Select each component of a DATETIME or INTERVAL value as an expression using EXTEND Give each expression an alias for convenience Combine the components in a PRINT expression with the desired punctuation GINHAC oos EXTEND START_TIME HOUR TO HOUR H EXTEND START_TIME MINUTE TO MINUTE M Then in the report PRINT Start work at H USING amp amp M USING amp amp hours Implementing the Model 9 15 Defining the Domains Whenever a CHAR n value is retrieved or stored exactly n bytes are trans ferred If an inserted value is short it is extended with spaces to make up n bytes A value longer than n is truncated There is no provision for variable length data in this format A CHAR n value can include tabs and spaces but normally contains no other nonprinting characters When rows are inserted using INSERT or UPDATE or when rows are loaded with a utility program there is no
169. ased and the new row is locked Thus by fetching through an update cursor you can be sure that the fetched row is locked as long as you are using it The row cannot become stale You are also assured of fetching only committed data since locks on rows that are updated are held until the end of the transaction Depending on the host operating system and the database server you might experience a perfor mance penalty for using an update cursor this way Locking Updated Rows When a cursor is declared FOR UPDATE locks are handled as follows Before a row is fetched it is locked or if it cannot be locked the program is made to wait or an error is returned The next time a fetch is requested the database server notes whether the cur rent row is modified using either UPDATE or DELETE with WHERE CURRENT OF and whether a transaction is in progress If both of these things are true the lock on the row is retained Otherwise the lock is released Thus if you perform updates within a transaction all updated rows remain locked until the transaction ends Rows that are not updated are locked only while they are current Rows updated outside a transaction or in a database that does not use transaction logging are also unlocked as soon as another row is fetched Programs That Modify Data 7 31 Hold Cursors Hold Cursors 7 32 Figure 7 7 When transaction logging is used the database server guarantees that any thing done
170. ases the program can obtain information about the number and types of columns that a query returns and dynami cally allocate the memory space to hold them SQL in Programs 6 35 Programs That Modify Data Chapter Overview 3 Using DELETE 3 Direct Deletions 4 Errors During Direct Deletions 4 Using Transaction Logging 5 Coordinated Deletions 6 Deleting with a Cursor 7 Using INSERT 8 Using an Insert Cursor 8 Declaring an Insert Cursor 9 Inserting with a Cursor 10 Status Codes After PUT and FLUSH 11 Rows of Constants 11 An Insert Example 12 Using UPDATE 14 Using an Update Cursor 15 The Purpose of the Keyword UPDATE 15 Updating Specific Columns 16 UPDATE Keyword Not Always Needed 16 Cleaning up a Table 16 Concurrency and Locking 17 Concurrency and Performance 17 Locking and Integrity 18 Locking and Performance 18 Concurrency Issues 18 How Locks Work 20 Kinds of Locks 20 Lock Scope 20 The Duration of a Lock 23 Locks While Modifying 23 Setting the Isolation Level 24 Dirty Read Isolation 24 Committed Read Isolation 25 Cursor Stability Isolation 25 Repeatable Read Isolation 26 Setting the Lock Mode 27 Waiting for Locks 28 Not Waiting for Locks 28 Waiting a Limited Time 28 Handling a Deadlock 29 Handling External Deadlock 29 Simple Concurrency 29 Locking with Other Database Servers 30 Isolation While Reading 30 Locking Updated Rows 31 Hold Cursors 32 Summary 33 7 2 Programs That Modify Data Chapter Ove
171. at do not specify a default value or do not permit nulls However you can list the col umns in any order as long as the values for those columns are listed in the same order After the INSERT statement is executed the following new row is inserted into the stock table stock num manu_code description unit price unit unit descr 115 SHM tyre pump 114 Both the unit and unit_descr are blank indicating that null values are in those two columns Since the unit column permits nulls one can only guess the number of tire pumps that were purchased for 114 Of course if a default value of box had been specified for this column then box would have been the unit of measure In any case when inserting values into specific col umns of a table pay special attention to what data is needed to make sense of that row Multiple Rows and Expressions The other major form of the INSERT statement replaces the VALUES clause with a SELECT statement This feature allows you to insert the following data e Multiple rows with only one statement a row is inserted for each row returned by the SELECT statement e Calculated values the VALUES clause only permits constants since the select list can contain expressions Modifying Data 5 9 Statements That Modify Data 5 10 Modifying Data For example suppose a follow up call is required for every order that has been paid for but not shipped The following INSERT statement finds
172. at faster 7 10 Programs That Modify Data Using INSERT Status Codes After PUT and FLUSH When a program executes a PUT statement the program should test whether the row was placed in the buffer successfully If the new row fits in the buffer the only action of PUT is to copy the row to the buffer No errors can occur in this case However if the row does not fit the entire buffer load is passed to the database server for insertion An error can occur in this case The values returned into the SQL Communications Area give the program the information it needs to sort out all these cases SQLCODE is set after every PUT statement to zero if there is no error and to a negative error code if there is an error The third element of SQLERRD is set to the number of rows actually inserted into the table It is set to zero if the new row is merely moved to the buffer to the count of rows that were in the buffer if the buffer load is inserted without error or to the count of rows inserted before an error occurs if one does occur Read the code Figure 7 4 once again to see how SQLCODE is used First if the OPEN statement yields an error the loop is not executed because the WHILE condition fails the FLUSH operation is not performed and the trans action is rolled back Second if the PUT statement returns an error the loop ends because of the WHILE condition the FLUSH operation is not performed and the transaction is rolled b
173. atabase server from locking a row Since the issue of locking affects all types of modifications it is discussed in a separate section later in this chapter Other rarer types of error can strike after deletions begin for example hard ware errors that occur while the database is being updated 7 4 Programs That Modify Data Using DELETE Using Transaction Logging The best way to prepare for any kind of error during a modification is to use transaction logging In the event of an error of any kind you can tell the data base server to put the database back the way it was Here is the preceding example extended to use transactions begin work start the transaction delete from items where order num Sonum del _ result sqlca sqlcode save two error del_isamno sqlca sqlerrd 1 code numbers del_rowcnt sqlca sqlerrd 2 and count of rows if del_result lt 0 some problem rollback work put everything back else everything worked OK commit work finish transaction An important point in this example is that the program saves the important return values in the SQLCA before it ends the transaction The reason is that both the ROLLBACK WORK and COMMIT WORK statements like all SOL state ments set return codes in the SQLCA Executing a ROLLBACK WORK state ment after an error wipes out the error code unless it was saved it cannot be reported to the u
174. ate function 2 47 count rows to delete 5 5 use in a subquery 3 33 5 6 with DISTINCT 2 48 CREATE DATABASE statement and dbspace 10 6 in command script 9 28 sets shared lock 7 21 SQLAWARN after 6 11 using with IBM Informix NET 12 8 IBM Informix OnLine 9 23 IBM Informix SE 9 25 CREATE INDEX statement locks table 7 21 CREATE SYNONYM statement 12 13 CREATE TABLE statement description of 9 26 EXTENT SIZE clause 10 9 IN clause 12 8 in command script 9 28 locating BLOB column 10 19 LOCK MODE clause 7 22 NEXT SIZE clause 10 9 sets initial SERIAL value 9 8 CREATE VIEW statement restrictions on 11 24 using 11 22 Current database definition of 12 12 CURRENT function 4GL example 4 6 comparing column values 2 49 Cursor active set of 6 21 closing 7 32 declaring 6 18 for insert 7 8 for update 7 15 7 23 hold 7 32 opening 6 18 6 21 retrieving values with FETCH 6 19 scroll 6 20 sequential 6 20 6 22 Index 3 4 Index with prepared statements 6 29 WITH HOLD 7 32 10 34 Cursor Stability isolation level 7 25 D Data definition statements 6 32 Data integrity 5 21 to 5 23 Data model address book model 8 5 8 11 attribute 8 22 defining relationships 8 14 denormalizing 10 27 to 10 32 description of 1 3 8 3 domains 9 22 entity 8 8 many to many relationship 8 16 8 20 one to many relationship 8 15 8 19 one to one relationship 8 15 8 20 See also Relational model Data type automatic conversions 6 13 BYTE 9 19 CHAR 9
175. atements 2 37 Single Table SELECT Statements WHERE Clause with Variable Length Wildcard These examples use a wildcard at the end of a string to retrieve all the rows where the description begins with the characters bicycle SELECT FROM stock WHERE description LIKE bicycles ORDER BY description manu_code SELECT FROM stock WHERE description MATCHES bicycle ORDER BY description manu_code Either SELECT statement returns these rows stock num manu_code description unit _price unit unit descr 102 PRC bicycle brakes 480 00 case 4 sets case 102 SHM bicycle brakes 220 00 case 4 sets case 114 PRC bicycle gloves 120 00 case 10 pairs case 107 PRC bicycle saddle 70 00 pair pair 106 PRC bicycle stem 23 00 each each 101 PRC bicycle tires 88 00 box 4 box 101 SHM bicycle tires 68 00 box 4 box 105 PRC bicycle wheels 53 00 pair pair 105 SHM bicycle wheels 80 00 pair pair The comparison bicycle or bicycle specifies the characters bicycle followed by any sequence of zero or more characters It matches bicycle stem with stem matched by the wildcard It matches to the char acters bicycle alone if there is a row with that description The next SELECT statement narrows the search further by adding another comparison condition that excludes a manu_code of PRC SELECT FROM stock WHERE description LIKE bicycle AND manu_code NOT LIKE PRC ORDER BY description manu_code The SELECT statement retri
176. ater than gt greater than or equal to lt less than lt less than or equal to Relational operators that test for equality For CHAR expressions greater than means after in ASCII collating order where lowercase letters are after uppercase letters and both are after numer als See the ASCII Character Set chart in the IBM Informix Guide to SQL Refer ence For DATE and DATETIME expressions greater than means later in time and for INTERVAL expressions it means of longer duration You cannot use TEXT or BYTE columns in string expressions except when you test for NULL values You can use the preceding keywords and operators in a WHERE clause to cre ate comparison condition queries that e Include values e Exclude values e Find a range of values Simple SELECT Statements 2 27 Single Table SELECT Statements e Find a subset of values e Identify NULL values You also can use the preceding keywords and operators in a WHERE clause to create comparison condition queries that perform variable text searches using e Exact text comparison e Single character wildcards e Restricted single character wildcards e Variable length wildcards e Subscripting The examples that follow illustrate these types of queries Including Rows Use the relational operator to include rows in a WHERE clause SELECT customer _num call_code call _dtime res dtime FROM cust_calls WHERE user_id maryj This SEL
177. attempt to insert NULL in such a column the statement is rejected Or a column in the table may not permit duplicate values If you specify a value that is a duplicate of Modifying Data 5 7 5 8 Modifying Data Statements That Modify Data one already in such a column the statement is rejected Some columns may even restrict the possible column values allowed These restrictions are placed on columns using data integrity constraints For more information on data restrictions see the section Database Privileges on page 5 15 Only one column in a table can have the SERIAL data type The database server will generate values for a serial column To make this happen specify the value zero for the serial column and the database server generates the next actual value in sequence Serial columns do not allow null values You can specify a nonzero value for a serial column as long as it does not duplicate any existing value in that column and the database server uses the value However that nonzero value may set a new starting point for values that the database server generates The next value the database server gener ates for you is one greater than the maximum value in the column Do not specify the currency symbols for columns that contain money values Just specify the numeric value of the amount The database server can convert between numeric and character data types You can give a string of numeric characters for example
178. auli 1002 24 Putnum 1021 202 KAR 3 08 Quinn 07 Ream 02 Sadler 27 Satifer 1023 110 SHM 1 27 Satifer 1023 105 SHM 1 27 Satifer 1023 306 SHM 1 19 Shorter 1016 101 SHM 2 17 Sipes 1012 17 Sipes 1007 05 Vector 21 Wallack 1018 302 KAR 3 06 Watson 1014 06 Watson 1004 There are two ways to state the join conditions when you apply an outer join to the result of an outer join to a third table The two subservient tables are joined but you can join the dominant table to either subservient table with out affecting the results if the dominant table and the subservient table share a common column 3 26 Advanced SELECT Statements Creating Advanced Joins Outer Join of Two Tables to a Third Table This SELECT statement shows an outer join that is the result of an outer join of each of two tables to a third table In this fourth type of outer join join rela tionships are possible only between the dominant table and the subservient tables SELECT c customer_num lname o order num order date call dtime FROM customer c OUTER orders o OUTER cust_calls x WHERE c customer_num o customer_num AND c customer_num x customer_num INTO TEMP service This query individually joins the subservient tables orders and cust_calls to the dominant customer table it does not join the two subservient tables An INTO TEMP clause selects the results into a temporary table for further manipulation or queries Advanced SELECT Statements 3 27
179. automatically the isolation level in an ANSI compliant database Repeatable Read is required to ensure operations behave in accor dance with the ANSI standard for SQL Setting the Lock Mode The lock mode determines what happens when your program encounters locked data One of three things occurs when a program attempts to fetch or modify a locked row e The program receives an immediate return from the database server with an error code in SQLCODE e The program is suspended until the lock is removed by the program that placed it e The program is suspended for a time and then if the lock is not removed it receives an error return code from the database server You choose among these results with the command SET LOCK MODE Programs That Modify Data 7 27 Concurrency and Locking Waiting for Locks If you prefer to wait and this is the best choice for many applications exe cute the following command SET LOCK MODE TO WAIT When this lock mode is set your program usually ignores the existence of other concurrent programs When it needs to access a row that another pro gram has locked your program waits until the lock is removed then pro ceeds The delays are usually imperceptible Not Waiting for Locks The disadvantage of waiting for locks is that the wait might become very long although properly designed applications should hold their locks very briefly When the possibility of a long delay is not accep
180. ball gloves 250 00 262 5000 1 Husky baseball gloves 800 00 840 0000 1 Smith baseball gloves 450 00 472 5000 2 Hero baseball 126 00 132 3000 3 Husky baseball bat 240 00 252 0000 4 Hero football 480 00 504 0000 4 Husky football 960 00 1008 0000 306 Shimara tandem adapter 190 00 199 5000 307 ProCycle infant jogger 250 00 262 5000 308 ProCycle twin jogger 280 00 294 0000 309 Hero ear drops 40 00 42 0000 309 Shimara ear drops 40 00 42 0000 310 Anza kick board 84 00 88 2000 310 Shimara kick board 80 00 84 0000 311 Shimara water gloves 48 00 50 4000 312 Hero racer goggles 72 00 75 6000 312 Shimara racer goggles 96 00 100 8000 You can query on this table and join it with other tables thus avoiding a mul tiple sort and moving more quickly through the database Temporary tables are discussed at greater length in Chapter 4 of this manual Simple SELECT Statements 2 73 Summary Summary This chapter introduced sample syntax and results for basic kinds of SELECT statements that are used to query on a relational database Earlier sections of the chapter showed how to perform the following activities Select all columns and rows from a table with the SELECT and FROM clauses Select specific columns from a table with the SELECT and FROM clauses Select specific rows from a table with the SELECT FROM and WHERE clauses Use the DISTINCT or UNIQUE keyword in the SELECT clause to eliminate duplicate
181. balls unit_price 312 00 unit each catalog _num 10048 cat_descr Combination fluorescent yellow and standard white cat_advert HiFlier Golf Balls Case Includes Fluorescent Yellow and Standard White lead_time 4 stock_num 301 manu_code HRO description running shoes unit_price 42 50 unit each catalog _num 10050 cat_descr Engineered for serious training with exceptional stability Fabulous shock absorption Great durability Specify mens womens size cat_advert Pronators and Supinators Take Heart A Serious Training Shoe For Runners Who Need Motion Control lead_time 4 Note that you cannot ORDER BY the TEXT column cat_descr or the BYTE column cat_picture Simple SELECT Statements 2 71 Multiple Table SELECT Statements You also can use aliases to shorten your queries on external tables residing in external databases SELECT order num lname fname phone FROM masterdb central customer c sales western orders o WHERE c customer_num o customer_num AND order_num lt 1010 This SELECT statement joins columns from two tables that reside in different databases and systems neither of which is the current database or system By assigning the aliases c and o to the long database system table names masterdb central customer and sales western orders respectively you can use the aliases to shorten the expression in the WHERE clause and retrieve this information order_num lname fname phone 1001 Higgins An
182. base name Lo IN dbspace Ea SE Log Clause Variables Keywords OL Ob Lea Glaus Clause Punctuation SE Log Clause s WITH LOGIN pathname ac a MODE ANSI Subdiagrams OL Log Clause Bb WITH Ei LOG BUFFERED LOG MODE ANSI Figure 1 Elements of a syntax diagram To construct a statement using this diagram start at the top left with the key words CREATE DATABASE Then follow the diagram to the right proceeding through the options that you want The diagram conveys the following information 1 You must type the words CREATE DATABASE 2 You must supply a database name 3 You can stop taking the direct route to the terminator or you can take one or more of the optional paths 4 If desired you can designate a dbspace by typing the word IN and a dbspace name Introduction 15 Document Conventions 5 If desired you can specify logging Here you are constrained by the data base server with which you are working e If youare using IBM Informix OnLine go to the subdiagram named OL Log Clause Follow the subdiagram by typing the keyword WITH then choosing and typing either LOG BUFFERED LOG or LOG MODE ANSI Then follow the arrow back to the main diagram e If you are using IBM Informix SE go to the subdiagram named SE Log Clause Follow the subdiagram by typing the keywords WITH LOG IN typing a double quote supplying a pathname and closing the quotes You can then choose the MODE ANSI
183. base server does not store a value that exceeds the capacity of an integer Of course this is not a problem when you know the maximum and minimum values to be stored Automatic Sequences SERIAL The SERIAL data type is simply INTEGER with a special feature Whenever a new row is inserted into a table the database server automatically generates a new value for a SERIAL column A table can have only one SERIAL column Because the database server generates them the serial values in new rows are Implementing the Model 9 7 Defining the Domains always different even when multiple users are adding rows at the same time This is a useful service since it is quite difficult for an ordinary program to coin unique numeric codes under those conditions How Many Serialized Rows After inserting 231 rows in a table the database server uses up all of the positive serial numbers Should you be concerned about this Probably not since to make this happen you need to insert a row every second for 68 years However if it did occur the database server would continue gen erating new numbers It would treat the next serial quantity as a signed integer Since it only uses positive values it would simply wrap around and start generating integer values beginning with 1 The sequence of generated numbers always increases When rows are deleted from the table their serial numbers are not reused This means that rows sorted on a SERIAL column are retur
184. bases to entire tables to disk pages to sin gle rows or to index key values The size of the object being locked is referred to as the scope of the lock sometimes called the lock granularity In general the larger the scope of a lock the more concurrency is reduced but the sim pler programming becomes 7 20 Programs That Modify Data Concurrency and Locking Database Locks You can lock an entire database The act of opening a database places a shared lock on the name of the database A database is opened with the statements DATABASE or CREATE DATABASE As long as a program has a database open the shared lock on the name prevents any other program from drop ping the database or putting an exclusive lock on it You can lock an entire database exclusively with the following statement DATABASE database name EXCLUSIVE The statement succeeds if no other program has opened that database Once the lock is placed no other program can open the database even for reading because its attempt to place a shared lock on the database name fails A database lock is only released when the database is closed That can be done explicitly with the CLOSE DATABASE statement or implicitly by execut ing another DATABASE statement Since locking a database reduces concurrency in that database to zero it makes programming very simple concurrent effects cannot happen How ever you should only lock a database when no other programs need acces
185. be traced back to the transaction that entered the row It is usually much faster to insert a new row in an update journal than actu ally to perform the update on one or more base tables For one thing the jour nal has at most one index to update while the base tables usually have several For another locking delays are almost nil since inserting a row ina table with no indexes requires only a lock on the inserted row Another pro gram can insert its row even before the first program commits its transaction Also since no updates are performed on the primary tables their pages are not locked This allows query programs to run without delays After peak usage hours perhaps after close of business you run a batch pro gram to validate and apply the updates row by row as they were inserted You obviously would want to take pains to see that no update is forgotten or applied twice regardless of possible system failures One way to update the base table is to use two cursors The first cursor is a hold cursor it is used to scan the rows of the journal See Hold Cursors on page 7 32 For each row of the journal the program goes through the following steps 1 Issue the BEGIN WORK command 2 Fetch the rows from the tables being updated using an update cursor This locks only these rows 3 Validate the update information from the journal against the data in the target rows Apply the updates to the target tables Upda
186. before the other program has a chance to update it Your program shows you only original rows 3 After your program fetches some original rows the other program catches up and goes on to update some rows your program has yet to read Then it executes COMMIT WORK Your program might return a mixture of original rows and updated rows 4 Same as number 3 except that after updating the table the other program issues ROLLBACK WORK Your program can show you a mixture of original rows and updated rows that no longer exist in the database The first two possibilities are harmless In case 1 the update is complete before your query begins It makes no difference whether it finished a micro second ago or a week ago In case 2 your query is in effect complete before the update begins The other program might have been working just one row behind yours or it might not start until tomorrow night it does not matter The second pair of chances however can be very important to the design of some applications In case 3 the query returns a mix of updated and original data That can be a negative thing in some applications In others for instance one that is taking an average of all prices it might not matter at all In case 4 it can be disastrous if a program returns some rows of data that because their transaction was cancelled can no longer be found in the table Programs That Modify Data 7 19 Concurrency and Locking An
187. ble with a cursor updating or deleting selected rows It also can use a cursor to insert rows with the benefit that the rows are buffered and sent to the data base server in blocks In all of these activities the program must take pains to detect errors and to return the database to a known state when one occurs The most important tool for doing this is the transaction Without transaction logging the program has a more difficult time recovering from errors Whenever multiple programs have access to a database concurrently and when at least one of them can modify data all programs must allow for the possibility that another program can change the data even as they read it The database server provides a mechanism of locks and isolation levels that usu ally allow programs to run as if they were alone with the data Programs That Modify Data 7 33 Building a Data Model Chapter Overview 3 Why Build a Data Model 3 Extended Relational Analysis 3 Basic Ideas 6 Tables Rows and Columns 6 Primary Keys 7 Candidate Keys 7 Foreign Keys Join Columns 8 Step 1 Name the Entities 8 Entity Keys 9 User Assigned Keys 10 Composite Keys 10 System Assigned Keys 10 Time Dependent Keys 10 Entity Tables 11 The Address Book Example 11 Step 2 Define the Relationships 14 Discover the Relationships 14 Add Relationships to Tables 19 Step 3 List the Attributes 22 Select Attributes 22 Select Attribute Tables 22 Summary 24
188. ble indexes can change its methods The Active Set for a Sequential Cursor The database server wants to tie up as few resources as possible in maintain ing the active set of a cursor If it can do so the database server never retains more than the single row that is fetched next It can do this for most sequen tial cursors On each fetch it returns the contents of the current row and locates the next one The Active Set for a Scroll Cursor 6 22 SQL in Programs All the rows in the active set for a scroll cursor must be retained until the cur sor is closed This is because the database server cannot be sure which row the program asks for next Retrieving Multiple Rows Most frequently the database server implements the active set of a scroll cur sor as a temporary table The database server might not fill this table imme diately however unless it created a temporary table to process the query Usually it creates the temporary table when the cursor is opened Then the first time a row is fetched the database server copies it into the temporary table and returns it to the program When a row is fetched for a second time it can be taken from the temporary table This scheme uses the fewest resources in the event that the program abandons the query before it fetches all the rows Rows that are never fetched are not created or saved The Active Set and Concurrency When only one program is using a database the members of the a
189. bspace depending on its use If a space con tains databases and tables it is a dbspace If it is dedicated to holding Binary Large Objects the blob data types TEXT and BYTE it is a blobspace Chunks are assigned to a space when it is created Chunks also can be added to a space later One dbspace the root dbspace is the first created it always exists It is the most important space because it holds the control information that describes all other spaces and chunks Parts of a single database can appear in two or more dbspaces However a single table is always completely contained in one dbspace Disk Mirroring Individual spaces can be mirrored The chunks of a mirrored space are paired with other chunks of equal size Whenever a page is written to one of the chunks it is also written to the mirror chunk When one chunk suffers a hard ware failure the database server uses its mirror to continue processing with out interruption When the broken chunk is restored to service or when a substitute chunk is assigned IBM Informix OnLine automatically brings it back to equality with the working chunk and continues operations When any dbspaces are mirrored the root dbspace also should be mirrored Otherwise if it is lost to hardware failure all IBM Informix OnLine data is unusable regardless of mirrors If your database has extreme requirements for reliability in the face of hard ware failure you should arrange for it to be place
190. called a cursor A cursor is a data structure that represents the current state of a query The gen eral sequence of program operations is as follows 1 The program declares the cursor and its associated SELECT statement This merely allocates storage to hold the cursor 2 The program opens the cursor This starts the execution of the associated SELECT statement and detects any errors in it 3 The program fetches a row of data into host variables and processes it 4 The program closes the cursor after the last row is fetched These operations are performed with SQL statements named DECLARE OPEN FETCH and CLOSE SQL in Programs 6 17 Retrieving Multiple Rows Declaring a Cursor A cursor is declared using the DECLARE statement This statement gives the cursor a name specifies its use and associates it with a statement Here is a simple example in IBM Informix 4GL DECLARE the item CURSOR FOR SELECT order_num item_num stock _num INTO o num i num s num FROM items The declaration gives the cursor a name the_item in this case and associates it with a SELECT statement Chapter 7 of this manual discusses how a cursor also can be associated with an INSERT statement The SELECT statement in this example contains an INTO clause That is one of two ways in which you can specify the variables that receive data The DECLARE statement is not an active statement it merely establishes the features of the cursor
191. ce they are stored in executable format You can use a stored procedure to control access to individual tables and col umns in the database You can accomplish various degrees of access control through a procedure A powerful feature of SPL is the ability to designate a stored procedure as a DBA privileged procedure Writing a DBA privileged procedure you can allow users who have few or no table privileges to have DBA privileges when they execute the procedure In the procedure users can carry out very specific tasks with their temporary DBA privilege The DBA privileged feature allows you to accomplish the following tasks e You can restrict how much information individual users can read from a table e You can restrict all the changes made to the database and ensure that entire tables are not emptied or changed accidentally e You can monitor all of a certain class of changes made to a table such as deletions or insertions e You can restrict all object creation data definition to occur within a stored procedure so that you have complete control over how tables indexes and views are built Creating and Executing Stored Procedures To write a stored procedure put the SQL statements that you want to be run as part of the procedure inside the CREATE PROCEDURE statement You can also use the additional SPL statements to control the flow of operation within the statement These additional statements include IF THEN ELSE FOR and ot
192. cell represents the relationship between names and addresses What type is this relationship A name you decide can have zero or one address but no more than one You write 0 1 opposite name and below address as shown in the following diagram name address name none An address however can be associated with more than one name For exam ple you can know several people at one company or two or more people who live at the same address Can an address be associated with zero names That is should it be possible for an address to exist when no names use it You decide that yes it can Below address and opposite name you write 0 n as shown in the following diagram name address name none 0 n 0 1 If you decided that an address could not exist without being associated with at least one name you write 1 n instead of 0 n When a relationship is limited on either side to 1 it is a 1 n relationship The relationship between names and addresses is a 1 n relationship Since zero is a possibility you must allow nulls when the relationship is encoded as a column in a table 8 16 Building a Data Model Step 2 Define the Relationships Now consider the next cell the relationship between a name and a voice number How many voice numbers can a name be associated with one or more than one Glancing at your address book you see that often you have noted more than one telephone number for
193. ched the row can take some time before it issues the UPDATE or DELETE statement or it can simply fetch the next row When it is time to modify a row the database server obtains an exclusive lock on the row If it already had a promotable lock it changes it to exclusive status The duration of an exclusive row lock depends on whether transactions are in use If they are not in use the lock is released as soon as the modified row is written to disk When transactions are in use all such locks are held until the end of the transaction This prevents other programs from using rows that might be rolled back to their original state When transactions are in use a key lock is used whenever a row is deleted This prevents the occurrence of the following error e Program A deletes a row e Program B inserts a row having the same key e Program A rolls back its transaction forcing the database server to restore its deleted row What is to be done with the row inserted by B By locking the index the database server prevents a second program from inserting a row until the first program commits its transaction Programs That Modify Data 7 23 Concurrency and Locking The locks placed while reading are controlled by the current isolation level which is the next topic Setting the Isolation Level The isolation level is the degree to which your program is isolated from the concurrent actions of other programs IBM Informix OnLine offer
194. chema utility 9 28 dbspace definition of 10 5 division into extents 10 8 for temporary tables 10 6 mirrored 10 5 multiple access arms in 10 7 on dedicated device 10 7 relation to tblspace 10 8 root 10 5 selecting with CREATE DATABASE 9 24 Deadlock detection 7 29 DECIMAL data type fixed point 9 11 floating point 9 10 signalled in SQLAWARN 6 11 DECLARE statement description of 6 18 FOR INSERT clause 7 8 FOR UPDATE 7 15 WITH HOLD clause 7 33 Default value description of 5 19 Delete privilege 11 9 11 29 DELETE statement all rows of table 5 4 and end of data 7 14 applied to view 11 26 coordinated deletes 7 6 count of rows 7 4 description of 5 4 embedded 6 6 7 3 to 7 8 number of rows 6 11 preparing 6 27 privilege for 11 6 11 9 time to update indexes 10 21 transactions with 7 5 using subquery 5 6 WHERE clause restricted 5 6 with cursor 7 7 Demonstration database copying Intro 7 installation script Intro 6 overview Intro 6 Denormalizing 10 27 Derived data introduced for performance 10 31 produced by view 11 22 DESCRIBE statement describing statement type 6 31 Dirty Read isolation level 7 24 Disk access chunk 10 4 cost to read a row 4 23 dbspace 10 5 latency of 4 24 nonsequential 4 25 nonsequential avoided by sorting 4 37 performance 4 24 to 4 26 4 32 reducing contention 10 7 seek time 4 24 sequential 4 24 4 32 sequential forced by query 4 32 4 35 using rowid 4 25 Disk buffer See Page buffer Disk contention
195. ck 7 20 setting lock mode 7 27 types of locks database lock 7 21 exclusive lock 7 20 key lock 7 22 page lock 7 22 promotable lock 7 20 7 23 row lock 7 22 shared lock 7 20 table lock 7 21 with DELETE 7 4 update cursor 7 23 Logical operator AND 2 33 NOT 2 33 OR 2 33 M Machine notes Intro 21 MATCHES relational operator character class 2 37 in WHERE clause 2 34 MAX function as aggregate function 2 47 MDY function as time function 2 49 Message file for error messages Intro 18 MIN function as aggregate function 2 47 Mirror See Disk mirroring MODE ANSI keywords ANSI compliant database 1 17 ANSI compliant logging 9 25 specifying transactions 5 22 Model See Data model MONEY data type 9 12 description of 9 11 display format 9 12 in INSERT 5 8 MONTH function as time function 2 49 N Natural join 2 65 Network data sent over 4 27 performance of 4 26 simple model of 4 27 Network File System NFS 12 9 Networking configurations 12 3 connecting to data 12 7 description of 12 3 distributed data 12 11 file server 12 4 Local Area Network LAN 12 4 NEXT SIZE keywords specifying size of extents 10 9 Index 9 NFS See Network File System Nonsequential access See Disk access nonsequential NOT logical operator 2 33 NOT NULL keywords use in CREATE TABLE 9 26 NOT relational operator 2 30 Not equals relational operator 2 29 NULL relational operator 2 33 Null value detecting in ESQL 6 14 in INSERT stat
196. code unit_price FROM stock WHERE stock_num NOT IN SELECT stock_num FROM items ORDER BY stock_num Advanced SELECT Statements 3 47 Summary The results contain all the elements from only the first set returning the following 17 rows stock num manu_code unit _price 102 PRC 480 00 102 SHM 220 00 106 PRC 23 00 107 PRC 70 00 108 SHM 45 00 112 SHM 549 00 113 SHM 685 90 203 NKL 670 00 305 HRO 48 00 308 PRC 280 00 310 ANZ 84 00 310 SHM 80 00 311 SHM 48 00 312 HRO 72 00 312 SHM 96 00 313 ANZ 60 00 313 SHM 72 00 Summary This chapter was built on concepts introduced in Chapter 2 It provided sam ple syntax and results for more advanced kinds of SELECT statements which are used to perform a query on a relational database This chapter e Introduced the GROUP BY and HAVING clauses which can be used with aggregates to return groups of rows and apply conditions to those groups e Described how to use the rowid to retrieve internal record numbers from tables and system catalog tables and discussed the serial internal table identifier or tabid e Showed how to join a table to itself with a self join to compare values in a column to other values in the same column and to identify duplicates e Introduced the keyword OUTER explained how an outer join treats two or more tables asymmetrically and provided examples of the four kinds of outer join e Described how to create correlated and uncorrelated
197. code columns in the stock and items tables SELECT DISTINCT stock_num manu_code FROM stock WHERE unit price lt 25 00 UNION SELECT stock _num manu_code FROM items WHERE quantity gt 3 3 38 Advanced SELECT Statements Set Operations This SELECT statement selects those items that have a unit price of less than 25 00 or that have been ordered in quantities greater than three and lists their stock_num and manu_code stock num manu_code 5 ANZ 5 NRG 5 SMT 9 ANZ 103 PRC 106 PRC 201 NKL 301 KAR 302 HRO 302 KAR If you include an ORDER BY clause it must follow the last SELECT statement and use an integer not an identifier to refer to the ordering column Ordering takes place after the set operation is complete SELECT DISTINCT stock num manu_code FROM stock WHERE unit price lt 25 00 UNION SELECT stock _num manu_code FROM items WHERE quantity gt 3 ORDER BY 2 This compound query selects the same rows as the previous SELECT state ment but displays them in order of manufacturer code stock num manu_code 5 ANZ 9 ANZ 302 HRO 301 KAR 302 KAR 201 NKL 5 NRG 103 PRC 106 PRC 5 SMT Advanced SELECT Statements 3 39 Set Operations By default the UNION keyword excludes duplicate rows Add the optional keyword ALL to retain the duplicate values SELECT stock_num manu_code FROM stock WHERE unit price lt 25 00 UNION ALL SELECT stock _num manu_code FROM items
198. column prefixes Compare the length of the preceding SELECT statement to the following one which does not use aliases SELECT stock stock_ num stock manu_code stock description stock unit_ price stock unit catalog catalog num catalog cat_descr catalog cat_advert manufact lead_time FROM stock catalog manufact WHERE stock stock num catalog stock num AND stock manu_code catalog manu_code AND stock manu_code manufact manu_code AND stock manu_code IN HRO HSK AND stock stock num BETWEEN 100 AND 301 ORDER BY catalog_num 2 70 Simple SELECT Statements Multiple Table SELECT Statements These two SELECT statements are equivalent and retrieve the following data stock_num 110 manu_code HRO description helmet unit_price 260 00 unit case catalog _num 10033 cat_descr Newest ultralight helmet uses plastic shell Largest ventilation channels of any helmet on the market 8 5 oz cat_advert Lightweight Plastic Slatted with Vents Assures Cool Comfort Without Sacrificing Protection lead_time 4 stock_num 110 manu_code HSK description helmet unit_price 308 00 unit each catalog num 10034 cat_descr Aerodynamic teardrop helmet covered with anti drag fabric Credited with shaving 2 seconds mile from winner s time in Tour de France time trial 7 5 oz cat_advert Teardrop Design Endorsed by Yellow Jerseys You Can Time the Difference lead_time 5 stock_num 205 manu_code HRO description 3 golf
199. composite of features that work it is rare for people to have identical names and identical addresses or for different books to have identical titles authors and publication dates System Assigned Keys A system assigned primary key is usually preferable to a composite key A system assigned key is a number or code that is attached to each instance of an entity when it is first entered into the database The easiest system assigned keys to implement are serial numbers because the database server can generate them automatically However the people who use the database might not like a plain numeric code Other codes can be based on actual data for example an employee identification code can be based on the person s initials combined with the digits of the date they were hired Time Dependent Keys An entity key can be naturally composite and it can include foreign keys Both types of keys are often required when the data involves time For exam ple a frequently crucial entity is billable time a span of time that can be charged to a client A law office or a marriage counselor might use entities such as advisor and client when advisor meets client an instance of billable time occurs A billable time entity needs at least three things to make it unique e The identity of the advisor a foreign key referring to the advisor entity e The date e The start time of the service 8 10 Building a Data Model Step 1 Name the Entities
200. ctive set cannot change This is the situation in most desktop workstations and it is the easiest situation to think about But some programs must be designed for use in a multiprogramming system where two three or dozens of different programs can work on the same tables at the same time When other programs can update the tables while your cursor is open the idea of the active set becomes less useful Your program can only see one row of data at a time but all other rows in the table can be changing In the case of a simple query when the database server holds only one row of the active set any other row can change The instant after your program fetches a row another program can delete the same row or update it so that if it is examined again it is no longer part of the active set When the active set or part of it is saved in a temporary table there is the problem of stale data That is the rows in the actual tables from which the active set rows are derived can change If they do some of the active set rows no longer reflect the current table contents These ideas may seem unsettling at first but as long as your program only reads the data there is no such thing as stale data or rather all data is equally stale No matter when it is taken the active set is a snapshot of the data as it is at one moment in time A row is different the next day it does not matter if it is also different in the next millisecond To put it ano
201. currency is reduced The fewer the locks and the smaller the objects the greater concurrency and perfor mance can be This section discusses how a program can achieve two goals e To place all of the locks that are needed to ensure data integrity e To lock the fewest smallest pieces of data possible consistent with the preceding goal Concurrency Issues To understand the hazards of concurrency you must think in terms of multi ple programs each executing at its own speed Here is an example Suppose that your program is fetching rows through the following cursor DECLARE sto _curse CURSOR FOR SELECT FROM stock WHERE manu_code ANZ 7 18 Programs That Modify Data Concurrency and Locking The transfer of each row from the database server to the program takes time During and between transfers other programs can perform other database operations Suppose that at about the same time your program fetches the rows produced by that query another user s program executes this update UPDATE stock SET unit price 1 15 unit price WHERE manu_code ANZ In other words both programs are reading through the same table one fetch ing certain rows and the other changing the same rows There are four possi bilities concerning what happens next 1 The other program finishes its update before your program fetches its first row Your program shows you only updated rows 2 Your program fetches every row
202. cy symbol The advantages of DECIMAL p s over INTEGER and FLOAT are that much greater precision is available up to 32 digits as compared to 10 for INTEGER and 16 for FLOAT while both the precision and the amount of storage required can be adjusted to suit the application Implementing the Model 9 11 Defining the Domains The disadvantages are that arithmetic is less efficient and that many pro gramming languages do not support numbers in this form Therefore when a program extracts a number it usually must convert it to another numeric form for processing However IBM Informix 4GL programs can use DECIMAL p s and MONEY values directly Whose Money Choosing a Currency Format Each nation has its own way of punctuating amounts of money When an Informix database server displays a MONEY value it refers to a currency format defined to the operating system usually in a variable named DBMONEY A currency symbol can precede or follow the amount and the decimal delimiter can be set to a period a comma or another character For details see Chapter 4 of IBM Informix Guide to SQL Reference Chronological Types Informix database servers support three data types for recording time The DATE data type stores a calendar date DATETIME records a point in time to any degree of precision from a year to a fraction of a second The INTERVAL data type stores a span of time that is a duration Calendar Dates DATE The DATE data typ
203. d and resolved 0 represents Sunday 1 is Monday and so on and the expression columns are labeled customer num called resolved 127 2 119 0 1 106 2 2 121 2 2 116 2 2 116 4 3 110 6 6 SELECT COUNT FROM cust_calls WHERE WEEKDAY call_dtime IN 0 7 This SELECT statement uses the COUNT and WEEKDAY functions to count how many calls were received on a weekend This kind of SELECT would give you an idea of customer call patterns or indicate whether overtime pay might be required count Simple SELECT Statements 2 53 Single Table SELECT Statements SELECT customer num call code YEAR call_dtime call_year YEAR res _dtime res year FROM cust_calls WHERE YEAR call _dtime lt YEAR TODAY This SELECT statement retrieves rows where the call_dtime is earlier than the beginning of the current year customer _ num call code call_year res year LEGS E 1990 1990 Tt I 1990 1990 Formatting DATETIME Values In the following query the EXTEND function restricts the two DATETIME val ues by displaying only the specified subfields SELECT customer_num EXTEND call_dtime month to minute call_time EXTEND res_dtime month to minute res_time FROM cust_calls ORDER BY res_time The result returns the month to minute range for the columns labeled call_time and res_time and gives an indication of the workload customer_num call_time res_time 127 07 31 14 30 106 06 12 08 20 06 12 08
204. d in a mirrored dbspace As indicated in the following paragraphs it is possible to locate individual tables in particular dbspaces Hence you can place some tables in mirrored spaces and other tables in normal spaces Tuning the Model 10 5 IBM Informix OnLine Disk Storage Databases A database resides initially in one dbspace It is placed there by a parameter of the CREATE DATABASE statement The following example creates a data base in the dbspace named dev0x2d CREATE DATABASE reliable IN dev0x2d WITH BUFFERED LOG When no dbspace is specified a database is placed in the root dbspace When a database is in a dbspace it means only that e Its system catalog tables are stored in that dbspace e That dbspace is the default location for tables that are not explicitly created in other dbspaces Tables and Spaces A table resides completely in one dbspace Its blob values can reside in sep arate blobspaces If no dbspace is specified a table resides in the dbspace where its database resides The following partial example creates a table in the dbspace named misctabs CREATE TABLE taxrates column specifications IN misctabs You can achieve many different aims by placing a table in a specific dbspace Some of these aims are explored in the following paragraphs Exploiting Mirroring Place all the tables used by a critically important application in a mirrored dbspace Alternatively create the database in
205. d script that calls IBM Informix products to build the database You can copy this com mand script and use it as the basis for automating your own data model 9 28 Implementing the Model Creating the Database Populating the Tables For your initial tests it is easiest to populate the tables interactively by typing INSERT statements to DB Access or IBM Informix SQL Or if you are preparing an application program in IBM Informix 4GL or another language you can use the program to enter rows Often the initial rows of a large table can be derived from data held in tables in another database or in operating system files You can move the data into your new database in a bulk operation If the data is in another IBM Informix database you can retrieve it in several ways If you are using IBM Informix OnLine you can simply select the data you want from the other database as part of an INSERT statement in your data base With other database servers you must export the data to a file You can use the UNLOAD command of DB Access IBM Informix SQL or IBM Informix 4GL or you can write a report in ACE or IBM Informix 4GL and direct the out put toa file When the source is another kind of file or database you must find a way to convert it into a flat ASCII file that is a file of printable data in which each line represents the contents of one table row Once you have the data in a file you can load it into a table using the dbload ut
206. database server At its simplest the applica tion sends SQL commands to the database server and the database server sends rows of data back to the application Then the application displays the rows to you its user Alternatively you command the application to add new data to the database It incorporates the new data as part of an SQL command to insert a row and passes this command to the database server for execution There are several types of applications Some allow you to access the data base interactively using SQL others present the stored data in different forms related to its use Interactive SOL To carry out the examples in this book and to experiment with SQL and data base design for yourself you need a program that lets you execute SQL state ments interactively DB Access and IBM Informix SQL are two such programs They assist you in composing SQL statements then they pass your SQL to the database server for execution and display the results to you Reports and Forms After you perfect a query to return precisely the data in which you are inter ested you need to format the data for display as a report or form on the ter minal screen ACE is the report generator for IBM Informix SQL You provide to it a SELECT statement that returns the rows of data and a report specifica tion stating how the pages of the report are to be laid out ACE compiles this information into a program that you can run whenever you want to p
207. de aggregates in the search condition of a WHERE clause Each HAVING condition compares one column or aggregate expression of the group with another aggregate expression of the group or with a constant You can use HAVING to place conditions on both column values and aggregate values in the group list SELECT order_num COUNT number AVG total _price average FROM items GROUP BY order _num HAVING COUNT gt 2 3 8 Advanced SELECT Statements Using the GROUP BY and HAVING Clauses This SELECT statement returns the average total price per item on all orders that have more than two items The HAVING clause tests each group as it is formed and selects those composed of two or more rows order_num number average 1003 3 319 67 1004 4 354 00 1005 4 140 50 1006 5 89 60 1007 5 339 20 1013 4 35 95 1016 4 163 50 1017 3 194 67 1018 5 226 20 1021 4 403 50 1022 3 77 33 1023 6 137 33 If you use a HAVING clause without a GROUP BY clause the HAVING condi tion applies to all rows that satisfy the search condition In other words all rows that satisfy the search condition make up a single group SELECT AVG total_price average FROM items HAVING count gt 2 This statement a modified version of the previous example returns just one row the average of all total_price values in the table average 270 97 If this query like the previous one had included the non aggregate column order_
208. decision is made that the same programs forms and reports are to be made available to users of a different computer on the network database server nantes Those users have a database that contains a table named orders containing the orders at their location but they need access to the table customer at avignon or else the table has to be duplicated which cre ates problems of maintenance Networks and Distribution 12 13 Distributed Data To those users the customer table is external Does this mean you must pre pare special versions of the programs and reports versions in which the customer table is qualified with a database server name A better solution is to create a synonym in the users database DATABASE stores5 nantes CREATE SYNONYM customer FOR stores5 avignon customer When the stored queries are executed in your database the name customer refers to the actual table When they are executed in the other database the name is translated through the synonym into a reference to the external table Synonym Chains To continue the preceding example suppose that a new computer is added to your network Its name is db_crunch The customer table and other tables are moved to it to reduce the load on avignon You can reproduce the table on the new database server easily enough but how can you redirect all accesses to it One way is to install a synonym to replace the old table DATABASE stores5 avignon EXCLUS
209. default condition return locktype If the database server does not support the SET LOCK MODE statement your program is effectively always in NOT WAIT mode that is whenever it tries to lock a row locked by another program it receives an error code immediately Isolation While Reading IBM Informix database servers other than IBM Informix OnLine do not nor mally place locks when fetching rows There is nothing comparable to the shared locks used by IBM Informix OnLine to implement the Cursor Stability isolation level 7 30 Programs That Modify Data Concurrency and Locking If your program fetches a row with a singleton SELECT statement or through a cursor that is not declared FOR UPDATE the row is fetched immediately regardless of whether it is locked or modified by an unfinished transaction This design produces the best performance especially when locks are imple mented by writing notes in disk files but you must be aware that the pro gram can read rows modified by uncommitted transactions You can obtain the effect of Cursor Stability isolation by declaring a cursor FOR UPDATE and then using it for input Whenever the database server fetches a row through an update cursor it places a lock on the fetched row If the row is locked already the program waits or receives an error depending on the lock mode When the program fetches another row without updating the current one the lock on the current row is rele
210. dex In this example public has Select Insert and Index privileges Only the user mutator has Update privileges and only the user procrustes has Delete privileges Before the database server performs any action for you for example execute a DELETE statement it performs a query similar to the preceding one If you are not the owner of the table and if it cannot find the necessary privilege on the table for your user name or for public it refuses to perform the operation Data Integrity The INSERT UPDATE and DELETE statements modify data in an existing database Whenever you modify existing data the integrity of the data can be affected For example an order for a nonexistent product could be entered into the orders table Or a customer with outstanding orders could be deleted from the customer table Or the order number could be updated in the orders table and not in the items table In each of these cases the integrity of the stored data is lost Data integrity is actually made up of three parts e Entity Integrity Each row of a table has a unique identifier e Semantic Integrity The data in the columns properly reflects the types of information the col umn was designed to hold Referential Integrity The relationships between tables are enforced Well designed databases incorporate these principles so that when you mod ify data the database itself prevents you from doing anything that could harm the data integrity
211. dex on the column whose only values are M and S into a composite index on that column and a birthdate column You can use any second column to disperse the key values as long as its value does not change or changes at the same time as the real key The shorter the second column the better since its values are copied into the index and expand its size Dropping Indexes In some applications the majority of table updates can be confined to a single time period Perhaps all updates are applied overnight or on specified dates When this is the case consider dropping all non unique indexes while updates are being performed then creating new indexes afterward This can have two good effects 10 24 Tuning the Model Managing Indexes First since there are fewer indexes to update the updating program can run faster Often the total time to drop the indexes update without them and re create them afterward is less than the time to update with the indexes in place The time cost of updating indexes is discussed under Time Costs of Indexes on page 10 21 Second newly made indexes are the most efficient ones Frequent updates tend to dilute the index structure causing it to contain many partly full leaf pages This reduces the effectiveness of an index and wastes disk space As another timesaving measure make sure that a batch updating program calls for rows in the sequence defined by the primary key index That sequence causes
212. e SELECT order_num order_date ship date cust_calls FROM orders cust_calls WHERE call _dtime gt ship date AND cust_calls customer_num orders customer_num ORDER BY customer_num 2 64 Simple SELECT Statements Multiple Table SELECT Statements This SELECT statement joins on the customer_num column and then selects only those rows where the call_dtime in the cust_calls table is greater than or equal to the ship_date in the orders table It returns these rows Natural Join order_num order_date ship_date customer_num call_dtime user_id call code call descr res_dtime res descr order_num order_date ship_date customer_num call_dtime user_id call code call descr res dtime res descr order_num order_date ship date customer_num call_dtime user_id call code call descr res dtime res descr 1004 05 22 1991 05 30 1991 106 1991 06 12 08 20 maryj D Order received okay but two of the cans of ANZ tennis balls within the case were empty 1991 06 12 08 25 Authorized credit for two cans to customer issued apology Called ANZ buyer to report the ga problem 1008 06 07 1991 07 06 1991 110 1991 07 07 10 24 riche L Order placed one month ago 6 7 not received 1991 07 07 10 30 Checked with shipping Ed Smith Order out yesterday was waiting for goods from ANZ Next time will call with delay if necessary 1023 07 24 1991 07 30 1991 127 1991 07 31 14 30 maryj I
213. e company phone call dtime call_descr 06 Watson Watson amp Son 415 389 8789 991 06 12 08 20 Order was received but two of the cans of ANZ tennis balls within the case were empty 10 Jaeger AA Athletics 415 743 3611 991 07 07 10 24 Order placed one month ago 6 7 not received 19 Shorter The Triathletes Club 609 663 6079 991 07 01 15 00 Bill does not reflect credit from previous order 21 Wallack City Sports 302 366 7511 991 07 10 14 05 Customer likes our merchandise Requests that we stock more types of infant joggers Will call back to place order 27 Satifer Big Blue Bike Shop 312 944 5691 991 07 31 14 30 Received Hero watches ANZ watches item 304 instead of 16 Parmelee Olympic City 415 534 8822 990 11 28 13 34 Received plain white swim caps 313 ANZ instead of navy with team logo 313 SHM 16 Parmelee Olympic City 415 534 8822 990 12 21 11 24 Second complaint from this customer Received two cases right handed outfielder gloves 1 HRO instead of one case lefties Advanced SELECT Statements 3 21 Creating Advanced Joins Simple Outer Join on Two Tables The following example uses the same select list tables and comparison con dition as the preceding example but this time creates a simple outer join SELECT c customer_num c lname c company c phone u call _dtime u call descr FROM customer c OUTER cust_calls u WHERE c cu
214. e phone 2 6 Simple SELECT Statements 119 Bob Shorter The Triathletes Club 2405 Kings Highway Cherry Hill NJ 08002 609 663 6079 122 Cathy O Brian The Sporting Life 543 Nassau Street Princeton NJ 08540 609 342 0054 Introducing the SELECT Statement In relational terminology projection is defined as taking a vertical subset from the columns of a single table that retains the unique rows This kind of SELECT statement returns some of the columns and all of the rows in a table Projection is implemented through the select list in the SELECT clause of a SELECT statement SELECT UNIQUE city state zipcode FROM customer The result of this query contains the same number of rows as the customer table but it projects only a subset of its columns city state zipcode Bartlesville OK 74006 Blue Island NY 60406 Brighton MA 02135 Cherry Hill NJ 08002 Denver Co 80219 Jacksonville FL 32256 Los Altos CA 94022 Menlo Park CA 94025 Mountain View CA 94040 Mountain View CA 94063 Oakland CA 94609 Palo Alto CA 94303 Palo Alto CA 94304 Phoenix AZ 85008 Phoenix AZ 85016 Princeton NJ 08540 Redwood City CA 94026 Redwood City CA 94062 Redwood City CA 94063 San Francisco CA 94117 Sunnyvale CA 94085 Sunnyvale CA 94086 Wilmington DE 19898 Simple SELECT Statements 2 7 Introducing the SELECT Statement 2 8 The most common kind of SELECT statement uses both selection and projec tion A query of t
215. e Relationships The model now records the entities but not the relationships between them Relationships are not always obvious but all of the ones worth recording must be found The only way to ensure that all the relationships are found is to exhaustively list all possible relationships You must consider every pair of entities A and B and ask What is the relationship between an A and a B Discover the Relationships The most compact way to discover the relationships is to prepare a matrix that names all the entities on the rows and again on the columns Figure 8 5 is a matrix that reflects the entities for the personal address book name address number number number voice fax modem name address number voice number fax number modem Figure 8 5 A matrix that reflects the entities for a personal address book 8 14 Building a Data Model Figure 8 6 Step 2 Define the Relationships You can ignore the lower triangle of the matrix as indicated by the shaded area You must consider the diagonal cells that is you must ask the question What is the relationship between an A and another A In this model the answer is always none There is no relationship between a name and a name or an address and another address at least none worth recording in this model For all cells for which the answer is clearly none write none in the matrix Now the matrix look
216. e basic method for connecting an application to its data is constant there are special cases for every combina tion of operating system network and database server Only the basic ideas are covered here Consult the document for the IBM Informix NET product you are using for details The Role of IBM Informix NET When an application begins execution it uses an environment variable to find the database server to use Before IBM Informix NET is installed the application finds a database server Afterward it finds IBM Informix NET instead IBM Informix NET monitors the requests of the application and passes them to the actual database server The application is not aware of this extra layer of software Opening a Database Before it can do anything else an application must open a database This is most often done by executing the DATABASE statement More rarely it is done with the CREATE DATABASE statement which creates a database and then opens it Only a few other SQL statements such as DROP DATABASE can be executed until a database is opened 12 8 Networks and Distribution Connecting to Data At the moment of opening a database IBM Informix NET determines the loca tion of the database and finds the database server that controls it From infor mation in the DATABASE or CREATE DATABASE statement and from the contents of the DBPATH environment variable IBM Informix NET deduces whether the database is located in the same mach
217. e database server where the current data base resides Simple SELECT Statements 2 55 Single Table SELECT Statements You can use these functions and keywords to select an expression that con sists entirely of constant values or one that includes column data In the first instance the result is the same for all rows of output In addition you can use the HEX function to return the hexadecimal encoding of an expression the ROUND function to return the rounded value of an expression and the TRUNC function to return the truncated value of an expression SELECT customer_num LENGTH fname LENGTH lname namelength FROM customer WHERE LENGTH company gt 15 In this SELECT statement the LENGTH function calculates the number of bytes in the combined fname and Iname columns for each row where the length of company is greater than 15 customer_num namelength 101 11 105 13 107 11 112 14 TL5 11 118 10 119 10 120 10 122 12 124 11 125 10 126 12 127 10 128 11 While perhaps not too useful when you work with the DB Access or IBM Informix SQL Interactive Editor the LENGTH function can be important to determine the string length for programs and reports LENGTH returns the clipped length of a CHARACTER or VARCHAR string and the full number of bytes in a TEXT or BYTE string The USER function can be handy when you want to define a restricted view of a table that contains only your rows For information on creating
218. e dbaccessdemo5 script To give some one else the permissions to access the command files in your directory use the UNIX chmod command Introduction 7 The Demonstration Database Creating the Demonstration Database on IBM Informix SE 8 Introduction Use the following steps to create and populate the demonstration database in the IBM Informix SE environment 1 Set the INFORMIXDIR environment so that it contains the name of the directory in which your IBM Informix products are installed Set SQLEXEC to INFORMIXDIR lib sqlexec For a full description of environment variables see the IBM Informix Guide to SQL Reference 2 Create a new directory for the demonstration database This directory will contain the example command files included with the demonstration database Create the directory by entering mkdir dirname 3 Make the new directory the current directory by entering cd dirname 4 Create the demonstration database and copy over the sample command files by entering dbaccessdemo5 dbname When you run the dbaccessdemo5 script it creates a subdirectory called dbname dbs in your current directory and places the database files associated with stores5 there You will see both data and index files in the dbname dbs directory To use the database and the command files that have been copied to your directory you must have UNIX read and execute permissions for each direc tory in the pathname of the directory from wh
219. e following row catalog _num 10025 stock_num 106 manu_code PRC cat_descr Hard anodized alloy with pearl finish 6mm hex bolt hardware Available in lengths of 90 140mm in 10mm increments cat_picture lt BYTE value gt cat_advert ProCycle Stem with Pearl Finish stock_num 106 manu_code PRC description bicycle stem unit_price 23 00 unit each unit_descr each manu_code PRC manu_name ProCycle lead_time 9 Note that the manu_code is repeated three times once for each table and stock_num is repeated twice Because of the considerable duplication in the previous example of a multiple table query it is wise to more closely define the SELECT statement by including specific columns in the select list 2 68 Simple SELECT Statements Multiple Table SELECT Statements SELECT catalog description unit price unit unit_descr manu_name lead_time FROM catalog stock manufact WHERE catalog stock_num stock stock_num AND stock manu_code manufact manu_code AND catalog_num 10025 This SELECT statement uses a wildcard to select all columns from the table having the most columns and then specifies columns from the other two tables This SELECT statement produces the following natural join that displays the same information as the previous example but without duplication catalog num 10025 stock_num 106 manu_code PRC cat_descr Hard anodized alloy with pearl finish 6mm hex bolt hardware Available in l
220. e key is a copy of the indexed column or columns from one row of data The pointer is a 4 byte value used to locate the row containing that key value A unique index contains one such entry for every row in the table It also con tains some additional pages of pointers that create the B tree structure Index structure is described in The Structure of an Index on page 4 28 When an index allows duplicates it contains fewer keys than pointers that is one key can be followed by a list of pointers If this were the whole story on indexes it would be simple to estimate their space requirements However the index leaf pages use a technique called key compression which allows the database server to put more keys on a page than would otherwise fit The space saved by key compression varies with the content of the keys from page to page and index to index 10 16 Tuning the Model Calculating Table Sizes To estimate the size of a compact index disregarding space saved by key compression let the values be as follows keysize the total width of the indexed column or columns petuniq the number of unique entries you expect in this index divided by estrows For a unique index or one with only occasional duplicate val ues use 1 0 When duplicates are present in significant num bers let pctuniq be a fraction less than 1 0 entsize keysize x pctuniq 4 pagents floor pageuse entsize There are approximately pagents
221. e of hire Finally the managers need access to all columns and need the ability to update the performance review data for their own employees only These requirements can be met in the following way The table hr_data contains a department number and a computer user id for each employee Let it be a rule that the managers are members of the depart ments that they manage Then the following view restricts managers to rows that reflect only their employees CREATE VIEW hr mgr data AS SELECT FROM hr data WHERE dept_num SELECT dept _num FROM hr data WHERE user_id USER AND NOT user_id USER Security Stored Procedures and Views 11 31 Summary The final condition is required so that the managers do not have update access to their own row of the table It is therefore safe to grant Update priv ilege to managers for this view but only on selected columns as in this statement GRANT SELECT UPDATE performance level performance_notes ON hr mgr data TO peter m Summary In a database that contains public material or one that is used only by you and trusted associates security is not an important consideration and few of the ideas in this chapter are needed But as more and more people are allowed to use and modify the data and as the data becomes more and more confidential you must spend more time and be ever more ingenious at con trolling the way people can approach the data The techniques discussed
222. e optimizer comes from the system catalog tables See the IBM Informix Guide to SQL Reference for information on system catalog tables In all IBM Informix database servers this information includes e The number of rows in a table as of the most recent UPDATE STATISTICS command e Whether a column is constrained to be unique e The indexes that exist on a table including which columns they encom pass whether they are ascending or descending and whether they are clustered The system catalog tables maintained by IBM Informix OnLine supply the following additional input e The number of disk pages occupied by row data e The depth of the index B tree structure a measure of the amount of work needed to perform an index lookup e The number of disk pages occupied by index entries e The number of unique entries in an index divided by the number of rows this suggests how many rows might match to a given key e Second largest and second smallest key values in an indexed column Only the second largest and second smallest key values are noted because the extreme values might be special out of range signals The database server assumes that key values are distributed smoothly between the second largest and second smallest Only the initial four bytes of these keys are stored Assessing Filters The optimizer first examines the expressions in the WHERE clause by looking for filters The optimizer estimates the selectivity of each
223. e precision of FLOAT The magnitude of a DECIMAL p number ranges from 10 18 to 10 It is easy to be confused about decimal data types The one under discussion is DECIMAL p that is DECIMAL with only a precision specified The size of DECIMAL p numbers depends on their precision they occupy 1 p 2 bytes rounded up to a whole number if necessary DECIMAL p has the following advantages over FLOAT e Precision can be set to suit the application from highly approximate to highly precise e Numbers with as many as 32 digits can be represented exactly e Storage is used in proportion to the precision of the number e Every Informix database server supports the same precision and range of magnitudes regardless of the host operating system The DECIMAL p data type has the following disadvantages e Arithmetic and sorting are somewhat slower than on FLOAT numbers e Many programming languages do not support the DECIMAL p data for mat the way they support FLOAT and INTEGER When a program extracts a DECIMAL p value from the database it may have to convert the value to another format for processing However IBM Informix 4GL programs can use DECIMAL p values directly 9 10 Implementing the Model Figure 9 2 Defining the Domains Fixed Point Numbers DECIMAL and MONEY Most commercial applications need to store numbers that have fixed num bers of digits on the right and left of the decimal point Amounts of mo
224. e query only occasionally but if the query is done even daily you save time by creating a permanent index Using Composite Indexes The optimizer can use a composite index one that covers more than one column in several ways In addition to its usual function of ensuring that the values in columns abc are unique an index on the columns a b and c in that order can be used in the following ways e To evaluate filter expressions on column a e To join column a to another table e Toimplement ORDER BY or GROUP BY on columns a ab or abc but not on b c ac or bc Optimizing Your Queries 4 33 Making Queries Faster If your application is performing several long queries each of which involves a sort on the same columns you might save time by creating a composite index on those columns In effect you perform the sort once and save its output for use in every query Using tbcheck on Suspect Indexes With some database servers it is possible for an index to become ineffective because it has been internally corrupted If a query that uses an index has slowed down inexplicably use the bcheck utility to check the integrity of the index and to repair it if necessary The bcheck utility does the same job for IBM Informix SE Dropping and Rebuilding Indexes After Updates After extensive amounts of updating after the replacement of a fourth or more of the rows of a table the structure of an index can become inefficient If an
225. e section on Database Privileges on page 5 15 Modifying Data 5 11 Statements That Modify Data Selecting Rows to Update Either form of the UPDATE statement can end with a WHERE clause that determines which rows are modified If you omit it all rows are modified The WHERE clause can be quite complicated so as to select the precise set of rows that need changing The only restriction on it is that the table that you are updating cannot be named in the FROM clause of a subquery The first form of an UPDATE statement uses a series of assignment clauses to specify new column values Here is an example UPDATE customer SET fname Barnaby lname Dorfler WHERE customer _num 103 The WHERE clause selects the row to be updated In the stores5 database the customer customer_num column is the primary key for that table so this statement can update one row at most You can also use subqueries in the WHERE clause Suppose that the Anza cor poration issues a safety recall of their tennis balls As a result any unshipped orders that include stock number 6 from manufacturer ANZ must be put on back order UPDATE orders SET backlog y WHERE ship date IS NULL AND order _num IN SELECT DISTINCT items order_ num FROM items WHERE items stock num 6 AND items manu_code ANZ This subquery returns a column of order numbers zero or more of them The UPDATE operation then tests each row of orders against the
226. e stores a calendar date A DATE value is actually a signed integer whose contents are interpreted as a count of full days since midnight on December 31 1899 Most often it holds a positive count of days into the current century The DATE format has ample precision to carry dates into the far future 58 000 centuries Negative DATE values are interpreted as counts of days prior to the epoch date that is a DATE of 1 represents the day December 30 1899 Since DATE values are integers Informix database servers permit them to be used in arithmetic expressions For example you can take the average of a DATE column or you can add 7 or 365 to a DATE column In addition there is a rich set of functions specifically for manipulating DATE values See Chapter 7 of IBM Informix Guide to SQL Reference 9 12 Implementing the Model Figure 9 3 Defining the Domains The DATE data type is compact at 4 bytes per item Arithmetic functions and comparisons execute quickly on a DATE column M D Y D M Y Choosing a Date Format There are many ways to punctuate and order the components of a date When an Informix database server displays a DATE value it refers to a for mat defined to the operating system usually in a variable named DBDATE The numbers for day month and year can be shown in any order separated by a chosen delimiter For more information see Chapter 4 of IBM Informix Guide to SQL Reference Exact Points in Time DATETIME
227. e tables of course but also the views indexes and syn onyms You must create a database before you can create anything else Besides creating the database the CREATE DATABASE command establishes the kind of transaction logging to be used Transaction logging is discussed in Chapter 7 The IBM Informix OnLine database server differs from other database servers in the way that it creates databases and tables IBM Informix OnLine is cov ered first Using CREATE DATABASE with IBM Informix OnLine When the IBM Informix OnLine database server creates a database it sets up records that show the existence of the database and its mode of logging It manages disk space directly so these records are not visible to operating system commands Avoiding Name Conflicts Normally only one copy of IBM Informix OnLine is running on a machine and it manages the databases that belong to all users of that machine It keeps only one list of database names The name of your database must be different from that of any other database managed by that database server It is possi ble to run more than one copy of the database server This is sometimes done for example to create a safe environment for testing apart from the opera tional data In that case you must be sure you are using the correct database server when you create the database and again when you later access it Implementing the Model 9 23 Creating the Database Selecting a Dbspace
228. e tools that IBM Informix OnLine offers you It permits you to arrange your tables on the hardware for maximum benefit Then one step at a time and always measur ing you can begin complicating the structure of the data model and the pro grams that use it 10 36 Tuning the Model Chapter Security Stored 11 Procedures and Views Chapter Overview 3 Controlling Access to Databases 3 Securing Database Files 4 Multiuser Systems 4 Single User Systems 4 Securing Confidential Data 5 Granting Privileges 5 Database Level Privileges 6 Connect Privilege 6 Resource Privilege 7 Database Administrator Privilege 7 Ownership Rights 7 Table Level Privileges 8 Access Privileges 9 Index Alter and References Privileges 10 Column Level Privileges 10 Procedure Level Privileges 13 Automating Privileges 13 Automating with IBM Informix 4GL 14 Automating with a Command Script 15 Using Stored Procedures 16 Creating and Executing Stored Procedures 16 Restricting Reads of Data 18 Restricting Changes to Data 19 Monitoring Changes to Data 19 Restricting Object Creation 20 Using Views 21 Creating Views 22 Duplicate Rows from Views 23 Restrictions on Views 24 When the Basis Changes 24 Modifying Through a View 25 Deleting Through a View 26 Updating a View 26 Inserting into a View 27 Using WITH CHECK OPTION 27 Privileges and Views 29 Privileges When Creating a View 29 Privileges When Using a View 30 Summary 32 11 2 Securit
229. ect Insert Update and Delete privileges is granted automatically to public when a table is created You can grant Index privilege to anyone but to exercise the ability the user must also hold the Resource database privilege So although the Index priv ilege is granted automatically except in ANSI compliant databases users who only have Connect privilege to the database are not able to exercise their Index privilege This is reasonable since an index can fill a large amount of disk space Alter privilege permits its holder to use the ALTER TABLE statement on the table including the power to add and drop columns reset the starting point for SERIAL columns and so on You should grant Alter privilege only to users who understand the data model very well and whom you trust to exercise their power very carefully The References privilege allows you to impose referential constraints on a table As with Alter you should only grant the References privilege to users who understand the data model very well Column Level Privileges You can qualify the Select Update and References privileges with the names of specific columns This allows you to grant very specific access to a table you can permit a user to see only certain columns you can allow a user to update only certain columns or you can allow a user to impose referential constraints on certain columns 11 10 Security Stored Procedures and Views Figure 11 1 Granting Privi
230. ed Procedures and Views Privileges and Views view and you are not already using integrity constraints to constrain data it is impossible to insert a backdated order an invalid customer number or an excessive shipping weight and shipping charge Privileges and Views When you create a view the database server tests your privileges on the underlying tables and views When you use a view only your privileges with regard to the view itself are tested Privileges When Creating a View When you create a view the database server tests to make sure that you have all the privileges needed to execute the SELECT statement in the view defini tion If you do not the view is not created This test ensures that users cannot gain unauthorized access to a table by cre ating a view on the table and querying the view After you create the view the database server grants you the creator and owner of the view at least Select privilege on it No automatic grant is made to public as is the case with a newly created table The database server tests the view definition to see if the view is modifiable If it is the database server grants you Insert Delete and Update privileges on the view provided that you also have those privileges on the underlying table or view In other words if the new view is modifiable the database server copies your Insert Delete and Update privileges from the underlying table or view and grants them on the new
231. ed in Figure 6 4 and Figure 6 5 The syntax you use to describe a data structure like the SQLCA as well as the syn tax you use to refer to a field in it depends on the programming language you are using SQL in Programs 6 7 Calling the Database Server integer 10 K 0 D i 0 Success 100 No more data not found negative Error code array of 6 integers SQLERRD first Following successful prepare of a SELECT UPDATE INSERT or DELETE statement or after a select cursor is opened this field contains the estimated number of rows affected second When SQLCODE contains an error code this field contains either zero or an additional error code called the ISAM error code that explains the cause of the main error Following a successful insert operation of a single row this field contains the value of a generated serial number for that row third Following a successful multirow insert update or delete operation this field contains the count of rows processed Following a multirow insert update or delete operation that ends with an error this field contains the count of rows successfully processed before the error was detected fourth Following successful prepare of a SELECT UPDATE INSERT or DELETE statement or after a select cursor has been opened this field contains the estimated weighted sum of disk accesses and total rows processed Following an error in a PREPARE statement this field conta
232. een defined for nested UNION clauses ORDER BY The user s query might contain ORDER BY If the view con tains it also the choice of columns or sort directions could be in conflict When the Basis Changes The tables and views on which a view is based can change in several ways The view automatically reflects most of the changes When a table or view is dropped any views in the same database that depend on it are automatically dropped The only way to alter the definition of a view is to drop and re create it There fore if you change the definition of a view on which other views depend you must also re create the other views since they all have been dropped When a table is renamed any views in the same database that depend on it are modified to use the new name When a column is renamed views in the same database that depend on that table are updated to select the proper col umn However the names of columns in the views themselves are not changed For an example of this recall the following view on the customer table CREATE VIEW name_only AS SELECT customer _num fname lname FROM customer 11 24 Security Stored Procedures and Views Using Views Now suppose that the customer table is changed in the following way RENAME COLUMN customer lname TO surname To select last names of customers directly you must now select the new col umn name However the name of the column as seen through the view
233. efragmenting 10 11 diagram format 8 11 extent sizes of 10 9 fixed length rows 10 13 fragmentation 10 11 in mirrored storage 10 6 in relational model 1 12 8 6 lock 7 21 multiple access arms for 10 7 ownership 11 7 primary key in 8 7 recording relationships in 8 19 relation to dbspace 10 6 represents an entity 8 9 variable length rows 10 15 Table name qualified by site name 12 12 use of synonyms 12 13 Table size calculating 10 13 10 20 cost of access 4 26 4 32 with fixed length rows 10 13 with variable length rows 10 15 Table level privilege turning off not possible 9 26 Truncation signalled in SQLAWARN 6 11 Typographical conventions Intro 11 column specific privileges 11 10 definition and use 11 8 tbcheck utility 4 34 10 8 10 13 tbload utility 5 25 10 12 tblspace description of 10 8 used for BLOB data 10 19 tbstat utility 10 13 tbunload utility 5 25 10 12 Temporary table and active set of cursor 6 22 assigning column names 3 12 example 5 11 shared disk space for 10 6 using to speed query 4 36 TEXT data type choosing location for 10 19 description of 9 18 disk storage for 10 5 estimating disk space for 10 18 restrictions with GROUP BY 3 6 with LIKE or MATCHES 2 34 with relational expression 2 27 used for performance 10 28 with LENGTH function 2 56 U UNION operator Gi eG CG description of 3 37 display labels with 3 42 restrictions in view 11 24 NIQUE keyword constraint
234. egrity of the data in the model that is to ensure that it reflects reality in a sensible way If aname can be entered where a telephone number was planned or a fractional number where an integer should be the integrity of the data model is at risk You define a domain by first defining the constraints that a data value must satisfy before it can be part of the domain Column domains are specified using the following constraints e Data types e Default values e Check constraints In addition referential constraints can be placed on columns by identifying the primary and foreign keys in each table How to identify these keys was discussed in Chapter 8 of this manual Implementing the Model 9 3 Defining the Domains Data Types The first constraint on any column is the one that is implicit in the data type for the column When you choose a data type you constrain the column so that it contains only values that can be represented by that type Each data type represents certain kinds of information and not others The correct data type for a column is the one that represents all the data values that are proper for that column but as few as possible of the values that are not proper for it Choosing a Data Type Every column ina table must have a data type chosen from the types that the database server supports The choice of data type is important for several reasons e Itestablishes the basic domain of the column that is
235. el in any of the following cases e All tables are static that is concurrent programs only read and never modify data e The database is held in an exclusive lock e Itis certain that only one program is using the database 7 24 Programs That Modify Data Concurrency and Locking Committed Read Isolation When a program requests the Committed Read isolation level IBM Informix OnLine guarantees that it never returns a row that is not committed to the database This prevents the situation in case 4 in the list of concurrency issues on page 7 18 reading data that is not committed and which is subsequently rolled back Committed Read is implemented very simply Before fetching a row the database server tests to determine whether an updating process placed a lock on the row If not it returns the row Since rows that are updated but not com mitted have locks on them this test ensures that the program does not read uncommitted data Committed Read does not actually place a lock on the fetched row hence it is almost as efficient as Dirty Read It is appropriate for use when each row of data is processed as an independent unit without reference to other rows in the same or other tables Cursor Stability Isolation The next level is called Cursor Stability When it is in effect the database server places a lock on the latest row fetched It places a shared lock for an ordinary cursor or a promotable lock for an update curso
236. ement 5 7 restrictions in primary key 8 7 testing for 2 33 with logical operator 2 33 O Online files Intro 21 help Intro 21 OPEN statement activating a cursor 6 18 opening select or update cursors 6 18 Opening a cursor 6 18 6 21 Optimizer and GROUP BY 4 13 4 16 4 18 and ORDER BY 4 13 4 16 4 18 and SET OPTIMIZATION statement 4 14 autoindex path 4 33 composite index use 4 33 description of 4 8 disk access 4 22 display query plan 4 19 filter selectivity 4 17 index not used by 4 32 4 35 index used by 4 15 methods of 4 14 query plan 4 8 sort merge join 4 13 sorting 4 18 specifying high or low level of optimization 4 14 system catalog use 4 9 4 15 when index not used 4 35 Optimizing techniques 4 3 10 Index OR logical operator 2 33 OR relational operator 2 31 ORDER BY keywords ascending order 2 14 DESC keyword 2 15 2 25 display label with 2 46 indexes for 4 16 4 31 multiple columns 2 15 relation to GROUP BY 3 6 restrictions in INSERT 5 10 restrictions in view 11 24 restrictions with FOR UPDATE 7 8 select columns by number 2 23 sorting rows 2 14 4 18 Outer join description of 3 19 nested 3 25 Ownership 11 7 P Page 10 4 Page buffer cost of nonsequential access 4 25 description of 4 23 effect on performance 4 23 restrictions with BLOB data 10 19 Page lock 7 22 Parts explosion 6 24 Performance adding indexes 4 32 assigning table to dedicated disk 10 7 bottleneck tables 10
237. ement entered by the user and an error is found the value in the fifth field enables you to display the exact point of error to the user DB Access and IBM Informix SQL use this feature to position the cursor when you ask to modify a statement after an error The SQLAWARN Array The eight character fields in the SQLAWARN array are set to either a blank or a W to indicate a variety of special conditions Only the first six are used Their meanings depend on the statement just executed There is one set of warning flags that appears when a database is just opened that is following a DATABASE or CREATE DATABASE statement These flags tell you some characteristics of the database as a whole A second set of flags appears following any other statement These flags reflect unusual events during the statement events that might not be reflect ed by SQLCODE Both sets of SQLAWARN values are summarized in Figure 6 5 Retrieving Single Rows You can use embedded SELECT statements to retrieve single rows from the database into host variables When a SELECT statement returns more than one row of data however a program must use a more complicated method to fetch the rows one at a time Multiple row select operations are discussed later in this chapter SQL in Programs 6 11 Retrieving Single Rows 6 12 SQL in Programs To retrieve a single row of data simply embed a SELECT statement in your program Here is an example as it can be writ
238. ements 3 23 Creating Advanced Joins Outer Join for a Simple Join to a Third Table The following example shows an outer join that is the result of a simple join to a third table This second type of outer join is known as a nested simple join SELECT c customer_num c lname o order_ num i stock num i manu_code i quantity FROM customer c OUTER orders o items i WHERE c customer_num o customer_num AND o order_num i order_num AND manu_code IN KAR SHM ORDER BY lname This SELECT statement first performs a simple join on the orders and items tables retrieving information on all orders for items with a manu_code of KAR or SHM It then performs an outer join to combine this information with data from the dominant customer table An optional ORDER BY clause reor ganizes the data into this form customer_num lname order_num stock num manu_code quantity 14 Albertson 18 Baxter 13 Beatty 03 Currie 15 Grant 23 Hanlon 1020 301 KAR 4 23 Hanlon 1020 204 KAR 2 25 Henry 04 Higgins 10 Jaeger 20 Jewell 1017 202 KAR 20 Jewell 1017 301 SHM 2 11 Keyes 12 Lawson 28 Lessor 09 Miller 26 Neelie 22 O Brian 1019 111 SHM 3 16 Parmelee 01 Pauli 24 Putnum 1021 202 KAR 3 08 Quinn 07 Ream 02 Sadler 27 Satifer 1023 306 SHM 27 Satifer 1023 105 SHM 27 Satifer 1023 110 SHM 19 Shorter 1016 101 SHM 17 Sipes 05 Vector 21 Wallack 1018 302 KAR 3 06 Watson H NPHRR 3 24 Advanced SELECT
239. engths of 90 140mm in 10mm increments cat_picture lt BYTE value gt cat_advert ProCycle Stem with Pearl Finish description bicycle stem unit_price 23 00 unit each unit_descr each manu_name ProCycle lead_time 9 Simple SELECT Statements 2 69 Multiple Table SELECT Statements Some Query Shortcuts You can use aliases the INTO TEMP clause and display labels to speed your way through joins and multiple table queries and produce output for other uses Using Aliases You can make multiple table queries shorter and more readable by assigning aliases to the tables in a SELECT statement An alias is a word that immedi ately follows the name of a table in the FROM clause You can use it wherever the table name would be used for instance as a prefix to the column names in the other clauses SELECT s stock_ num s manu_code s description s unit price s unit c catalog num c cat_descr c cat_advert m lead_time FROM stock s catalog c manufact m WHERE s stock num c stock_num AND s manu_code c manu_code AND s manu_code m manu_code AND s manu_code IN HRO HSK AND s stock num BETWEEN 100 AND 301 ORDER BY catalog num The associative nature of the SELECT statement allows you to use an alias before you define it In this example the aliases s for the stock table c for the catalog table and m for the manufact table are specified in the FROM clause and used throughout the SELECT and WHERE clauses as
240. ential fetch that retrieves the next row of data EXEC SQL FETCH p_curs INTO Scnum S clname Sccity Each sequential fetch returns a new row A scroll cursor can be used with a variety of fetch options The ABSOLUTE option specifies the rank number of the row to fetch EXEC SQL FETCH ABSOLUTE numrow s_curs INTO nordr nodat This statement fetches the row whose position is given in the host variable numrow It is also possible to fetch the current row again or to fetch the first row and then scan through the entire list again However these features are obtained at a price as described in the next section The Active Set of a Cursor Once a cursor is opened it stands for some selection of rows The set of all rows that the query produces is called the active set of the cursor It is easy to think of the active set as a well defined collection of rows and to think of the cursor as pointing to one row of the collection This is a true picture of the sit uation as long as no other programs are modifying the same data concurrently Creating the Active Set When a cursor is opened the database server does whatever is necessary to locate the first row of selected data Depending on how the query is phrased this can be very easy to do or it can require a great deal of work and time DECLARE easy CURSOR FOR SELECT fname lname FROM customer WHERE state NJ SQL in Programs 6 21 Retrieving Multiple Rows
241. entially by ROWID and nonsequentially through an index e Reading rows over a network e Sorting e Performing some difficult matches of regular expressions The general method to speed a query is first to study the query plan of the optimizer as documented by the SET EXPLAIN ON feature and second to change the query so that the database server e Reads fewer pages of data from disk e Reads pages sequentially rather than nonsequentially e Avoids sorting or sorts fewer rows or sorts on narrower columns Optimizing Your Queries 4 41 Summary You can achieve remarkable time savings in this way Even if no time is saved the necessary study of the application and the query at least make it clear where the time is being spent 4 42 Optimizing Your Queries Statements That Modify Data Chapter Overview 3 Statements That Modify Data 3 Deleting Rows 4 Deleting All Rows of a Table 4 Deleting a Known Number of Rows 4 Deleting an Unknown Number of Rows 5 Complicated Delete Conditions 6 Inserting Rows 6 Single Rows 7 Multiple Rows and Expressions 9 Updating Rows 11 Selecting Rows to Update 12 Updating with Uniform Values 12 Impossible Updates 13 Updating with Selected Values 14 Database Privileges 15 Displaying Table Privileges 16 Data Integrity 17 Entity Integrity 18 Semantic Integrity 19 Referential Integrity 19 Interrupted Modifications 21 The Transaction 22 The Transaction Log 22 Specifying Transactions 22 Arc
242. entical to ISO 9075 1992 In addition many features of Informix database servers comply with the SQL 92 Intermediate and Full Level and X Open SQL CAE common applications environment standards Introduction 21 IBM Welcomes Your Comments IBM Welcomes Your Comments 22 Introduction To help us with future versions of our manuals let us know about any cor rections or clarifications that you would find useful Include the following information e The name and version of your manual e Any comments that you have about the manual e Your name address and phone number Send electronic mail to us at the following address docinf us ibm com This address is reserved for reporting errors and omissions in our documen tation For immediate help with a technical problem contact Customer Ser vices Chapter Database Fundamentals Chapter Overview 3 Databases What and Why 3 The Data Model 3 Storing Data 6 Querying Data 6 Modifying Data 8 Concurrent Use 9 Centralized Management 11 Group and Private Databases 11 Essential Databases 12 Important Database Terms 12 The Relational Model 12 Tables 12 Columns 13 Rows 13 Tables Rows and Columns 14 Operations on Tables 14 Structured Query Language 15 Standard SQL 16 Informix SQL and ANSI SQL 16 ANSI Compliant Databases 17 The Database Software 17 The Database Server 17 The Applications 18 Interactive SOL 18 Reports and Forms 18 General Programming 19 Applicat
243. entries on each index page leaves ceiling estrows pagents There are approximately leaves leaf pages in the index branches ceiling leaves pagents There are approximately branches nonleaf pages The index contains approximately leaves branches pages when it is compact Estimates for two indexes in the customer table are carried out in Figure 10 8 on page 10 18 As rows are deleted and new ones inserted the index can become sparse that is the leaf pages might no longer be full of entries On the other hand if key compression is effective the index might be smaller The method given here should yield a conservative estimate for most indexes If index space is important build a large test index using real data and check its size with the tbcheck utility Tuning the Model 10 17 Calculating Table Sizes Variable Estimate Basis for Estimate estrows 1 500 company business plan pagesize 2 048 output of tbstat pageuse 2 016 pagesize keysize 4 customer_num is 4 bytes petuniq 1 0 unique index entsize 12 4x1 0 8 pagents 168 floor 2 016 12 leaves 9 ceiling 1 500 168 branches 1 ceiling 9 168 keysize 2 state is CHAR 2 pctuniq 0 033 50 states among 1 500 rows entsize 8 066 2 x 0 033 8 pagents 249 floor 2 016 8 066 leaves 7 ceiling 1 500 249 branches 1 ceiling 7 168 Figure 10 8 Estimating the size of two indexes from the customer table Estimating Blobpages BYTE and TEXT data items that are st
244. eping any attribute only in the table for the entity it describes If the attribute data is needed in a different context you make the connection by joining tables But joining takes time If a frequently used join hurts performance you can eliminate it by duplicating the joined data in another table In the demonstration database the manufact table contains the names of manufacturers and their delivery times In a real database it would contain many other attributes of a supplier such as address sale representative name and so on The contents of manufact are primarily a supplement to the stock table Sup pose that a time critical application frequently refers to the delivery lead time of a particular product but to no other column of manufact For each such reference the database server must read two or three pages of data to per form the lookup You can add a new column lead_time to the stock table and fill it with cop ies of the lead_time column from the corresponding rows of manufact That eliminates the lookup speeding the application Like derived data redundant data takes space and poses an integrity risk In the example there is not one extra copy of each manufacturer s lead time there are many Each manufacturer can appear in stock many times The programs that insert or update a row of manufact must be changed to update multiple rows of stock as well The integrity risk is simply that the redundant copies of t
245. er Number lt 99999 You can express constraints on character based domains this way using the MATCHES predicate and the regular expression syntax it supports For exam ple the following constraint restricts the Telephone domain to the form of a U S local telephone number VceNumber MATCHES 2 9 2 9 0 9 0 9 0 9 0 9 0 9 9 20 Implementing the Model Defining the Domains However constraints in this form can be tedious to write and hard to read Writing the rule in plain language is easier Specifying Domains One domain can apply to many columns In the address book model there are several columns whose domain is telephone numbers You only need to specify the Telephone domain once The final step of creating a data model is to specify the domains needed in the model The result is a list of domains with the following columns e Aname for ease of reference e The data type for instance INTEGER or CHAR n e The additional rules that constrain data of this kind written in either WHERE clause form or English One possible list of domains for the address book data model is shown in Figure 9 5 Domain Data Type Other Constraints Address code SERIAL 1000 lt code AND code lt 10000 Attendant hours DATETIME HOUR TO MINUTE Birthday DATE birthday lt TODAY City VARCHAR 40 10 Name VARCHAR 50 20 Postal code CHAR 10 only valid postal codes State province CHAR 5 Street address VARCH
246. erator to make a final commitment e Execute BEGIN WORK e Insert rows in the orders and items tables checking the error code returned by the database server e If there were no errors execute COMMIT WORK otherwise execute ROLLBACK WORK If any external failure prevents the transaction from being completed the partial transaction is rolled back when the system is restarted In all cases the database is in a predictable state either the new order is completely entered or it is not entered at all Archives and Logs By using transactions you can ensure that the database is always in a consis tent state and that your modifications are properly recorded on disk But the disk itself is not perfectly safe It is vulnerable to mechanical failures and to flood fire and earthquake The only safeguard is to keep multiple copies of the data These redundant copies are called archive copies The transaction log complements the archive copy of a database Its contents are a history of all modifications that occurred since the last time the database was archived If it should ever be necessary to restore the database from the archive copy the transaction log can be used to roll the database forward to its most recent state Modifying Data 5 23 Archives and Logs Archiving Simple Databases IBM Informix SE 5 24 Modifying Data If a database is stored in operating system files IBM Informix SE archive copies are made using the no
247. erforms a union on three tables The maximum num ber of unions depends on the practicality of the application and any memory limitations SELECT stock _num manu_code FROM stock WHERE unit_price gt 600 00 UNION ALL SELECT stock num manu_code FROM catalog WHERE catalog num 10025 UNION ALL SELECT stock _num manu_code FROM items WHERE quantity 10 ORDER BY 2 This compound query selects items where the unit_price in the stock table is greater than 600 or the catalog_num in the catalog table is 10025 or the quantity in the items table is 10 and orders it by manu_code stock_num manu_code 5 ANZ 9 ANZ 8 ANZ 4 HSK 1 HSK 3 NKL 5 NRG 106 PRC 113 SHM See Chapter 7 of IBM Informix Guide to SQL Reference for the complete syntax of the SELECT statement and the UNION operator See also Chapters 6 and 7 in this manual as well as the product manuals for information specific to the IBM Informix 4GL and IBM Informix ESQL C products and any limitations involving the INTO clause and compound queries 3 42 Advanced SELECT Statements Set Operations The following example uses a combined query to select data into a temporary table and then adds a simple query to order and display it You must separate the combined and simple queries with a semicolon The combined query uses a literal in the select list to tag the output of part of a union so it can be distinguished later The tag is given the label sortk
248. errupted modifications 5 21 INTERVAL data type description of 9 14 display format 9 15 in relational expressions 2 27 precision and size 9 14 INTO keyword choice of location 6 20 in FETCH statement 6 20 mismatch signalled in SQLAWARN 6 11 restrictions in INSERT 5 10 restrictions in prepared statement 6 27 retrieving multiple rows 6 18 retrieving single rows 6 12 INTO TEMP keywords description of 2 73 restrictions in view 11 24 ISAM error code 6 11 Isolation level Committed Read 7 25 Cursor Stability 7 25 Dirty Read 7 24 Repeatable Read 7 26 setting 7 24 J Join associative 2 67 creating 2 62 definition of 2 9 effect of large join on optimization 4 14 equi join 2 62 multiple table join 2 68 natural 2 65 outer join 3 19 restrictions in modifiable view 11 25 self join 3 11 sort merge 4 13 Join column See Foreign key Journal updates 10 34 K Key lock 7 22 L Label 2 44 3 42 LAN See Local Area Network Latency 4 24 LENGTH function on TEXT 2 56 on VARCHAR 2 56 use in expression 2 55 LIKE relational operator 2 34 LIKE test 4 35 Local Area Network LAN 12 4 LOCK MODE keywords specifying page or row locking 7 22 LOCK TABLE statement locking a table explicitly 7 21 Locking affects performance 7 18 and concurrency 5 25 and integrity 7 18 deadlock 7 29 description of 7 20 lock duration 7 23 lock mode not wait 7 28 lock mode wait 7 28 lock modes 7 27 locks released at end of transaction 7 32 scope of lo
249. es for duplicate values in the customer_num column and for their rowids finding this pair rowid customer _num 515 116 769 116 You can write the last condition in the previous SELECT statement either as AND x rowid y rowid or AND NOT x rowid y rowid Another way to locate duplicate values is with a correlated subquery as follows SELECT x customer_num x call_dtime FROM cust_calls x WHERE 1 lt SELECT COUNT FROM cust_calls y WHERE x customer_num y customer_num This SELECT statement locates the same two duplicate customer_num values as the previous query and returns these rows customer _num call dtime 116 1990 11 28 13 34 116 1990 12 21 11 24 Advanced SELECT Statements 3 15 Creating Advanced Joins You can use the rowid shown earlier in a self join to locate the internal record number associated with a row in a database table Rowid is in effect a hidden column in every table The sequential values of rowid have no spe cial significance and may vary depending on the location of the physical data in the chunk See Chapter 4 in this manual for a discussion of performance issues and the rowid value SELECT rowid FROM manufact This SELECT statement uses rowid and the wildcard in the SELECT clause to retrieve every row in the manufact table and their corresponding rowids rowid manu_code manu_name lead_time 257 SMT Smith 3 258 ANZ Anza 5 259 NRG Norge 7
250. eves only these rows stock_num manu_code description unit_price unit unit descr 102 SHM bicycle brakes 220 00 case 4 sets case 101 SHM bicycle tires 68 00 box 4 box 105 SHM bicycle wheels 80 00 pair pair 2 38 Simple SELECT Statements Single Table SELECT Statements Note that when you select from a large table and use an initial wildcard in the comparison string the query often takes longer to execute This is because indexes cannot be used so every row must be searched Comparing for Special Characters The keyword ESCAPE used with LIKE or MATCHES lets you protect a special character from misinterpretation as a wildcard symbol SELECT FROM cust_calls WHERE res descr LIKE ESCAPE The ESCAPE keyword designates an escape character it is in this example which protects one following character so it is interpreted as data and not as a wildcard In the example the escape character causes the middle percent sign to be treated as data By using the ESCAPE keyword you can search for occurrences of a percent sign in the res_descr column with the LIKE wild card The query retrieves the following row customer_num 116 call_dtime 1990 12 21 11 24 user_id mannyn call code I call descr Second complaint from this customer Received two cases right handed outfielder gloves 1 HRO instead of one case lefties res dtime 1990 12 27 08 19 res descr Memo to shipping Ava Brown to send case of lef
251. ey The simple query uses that tag as a sort key for ordering the retrieved rows SELECT 1 sortkey lname fname city state phone FROM customer x WHERE state CA UNION SELECT 2 sortkey lname fname city state phone FROM customer y WHERE state lt gt CA INTO TEMP calcust SELECT FROM calcust ORDER BY 1 company company This query pair creates a list where the California customers the ones called most frequently appear first Advanced SELECT Statements 3 43 Set Operations sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone sortkey iname fname company city state phone 3 44 Advanced SELECT Statements 1 Albertson Frank Sporting Place Redwood City CA 415 886 6677 4 Baxter Dick Blue Ribbon Sports Oakland CA 415 655 0011 al Beatty Lana Sportstown Menlo Park CA 415 356 9982 Currie Philip Phil s Sports Palo Alto CA 415 328 4543 al Grant Alfred Gold Medal Sports Menlo Park CA 415 356 1123 2 Satifer Kim Big Blue Bike Shop Blue Island NY 312 944 5691 2 Shorter Bob The Triathletes Club Cherr
252. f disk accesses in a real application Optimizing Your Queries 4 11 The Query Optimizer 4 12 Using Indexes Figure 4 4 The preceding examples do not use indexes or constraints That was unrealistic almost all tables have one or more indexes or constraints and their presence makes a difference in the query plan Figure 4 4 shows the outline of a query plan for the previous query as it might be constructed using indexes See also The Structure of an Index on page 4 28 for each row in the customer table do read the row into C look up C customer_num in index on orders customer_num for each matching row in the orders table do read the row into O if O paid_date is null then let Sum 0 look up O order_num in index on items order_num for each matching row in the items table do read the row into I let Sum Sum I total_price end for prepare an output row from C I and Sum end if end for end for A query plan using indexes in pseudocode The keys in an index are sorted so that when the first matching key is found any other rows with identical keys can be read without further searching This query plan reads only the following rows e All rows of the customer table once e All rows of the orders table once e Those rows of the items table that match to pdnull rows from orders This is a huge reduction in effort compared to the plans without indexes An inverse plan reading orders first and looking up rows i
253. following self join SELECT emp employee num emp gross pay emp level emp dept_num mgr employee num mgr gross pay mgr level FROM payroll emp payroll mgr WHERE emp gross pay gt mgr gross pay AND emp level lt mgr level ORDER BY 4 The following example of a self join uses a correlated subquery to retrieve and list the 10 highest priced items ordered SELECT order_num total_price FROM items a WHERE 10 gt SELECT COUNT FROM items b WHERE b total_ price lt a total_price ORDER BY total_price It returns the following 10 rows order_num total_price 1018 15 00 1013 19 80 1003 20 00 1005 36 00 1006 36 00 1013 36 00 1010 36 00 1013 40 00 1022 40 00 1023 40 00 You can create a similar query to find and list the 10 employees in the com pany who have the most seniority Correlated and uncorrelated subqueries are described later in this chapter 3 14 Advanced SELECT Statements Creating Advanced Joins Using Rowid Values You can use the hidden rowid column in a self join to locate duplicate values in a table In the following example the condition x rowid y rowidis equivalent to saying row x is not the same row as row y SELECT x rowid x customer_num FROM cust_calls x cust_calls y WHERE x customer_num y customer_num AND x rowid y rowid This SELECT statement selects data twice from the cust_calls table assigning it the table aliases x and y It search
254. from a relational database It discusses how to tailor your statements to select columns or rows of information from one or more tables how to include expressions and functions in SELECT state ments and how to create various join conditions between relational database tables Introducing the SELECT Statement The SELECT statement is constructed of clauses that let you look at data ina relational database These clauses let you select columns and rows from one or more database tables or views specify one or more conditions order and summarize the data and put the selected data in a temporary table This chapter shows how to use five SELECT statement clauses You must include these clauses in a SELECT statement in the following order 1 SELECT clause 2 FROM clause 3 WHERE clause Simple SELECT Statements 2 3 Introducing the SELECT Statement 4 ORDER BY clause 5 INTO TEMP clause Only the SELECT and FROM clauses are required These two clauses form the basis for every database query because they specify the tables and columns to be retrieved e Adda WHERE clause to select specific rows or create a join condition e Add an ORDER BY clause to change the order in which data is produced e Add an INTO TEMP clause to save the results as a table for further queries Two additional SELECT statement clauses GROUP BY and HAVING enable you to perform more complex data retrieval They are introduced in Chapter 3 Another clause IN
255. g Blob Data When you create a column of type BYTE or TEXT on magnetic disk you have the option of locating the data of the column in the tblspace or in a blobspace In the following example a TEXT value is located in the tblspace and a BYTE value is located in a blobspace named rasters CREATE TABLE examptab pic_id SERIAL pic_desc TEXT IN TABLE pic_raster BYTE IN rasters A TEXT or BYTE value is always stored apart from the rows of the table Only a56 byte descriptor is stored with the row However the value itself occupies at least one disk page When blob values are stored in the tblspace the pages of their data are inter spersed among the pages containing rows The result is to inflate the size of the table The blobpages separate the pages containing rows and spread them out on the disk When the database server reads only the rows and not the blob data the disk arm must move farther than it would if the blobpages were stored apart The database server scans only the row pages on any SELECT operation that retrieves no blob column and whenever it tests rows using a filter expression Another consideration is that disk I O to and from a dbspace is buffered Pages are held in storage in case they are needed again soon and when pages are written the requesting program is allowed to continue before the actual disk write takes place However disk I O to and from blobspaces is not buffered Blobspace pages are not re
256. g the Next SERIAL Number The starting value for a SERIAL column is set when the column is created see Using CREATE TABLE on page 9 26 You can use the ALTER TABLE command later to reset the next value the value that is used for the next inserted row You cannot set the next value below the current maximum value in the col umn because that could lead the database server to generate duplicate numbers However you can set the next value to any value higher than the current maximum thus creating gaps in the sequence Approximate Numbers FLOAT and SMALLFLOAT In scientific engineering and statistical applications numbers are often known to only a few digits of accuracy and the magnitude of a number is as important as its exact digits The floating point data types are designed for these applications They can represent any numerical quantity fractional or whole over a wide range of magnitudes from the cosmic to the microscopic For example they can easily represent both the average distance from the Earth to the Sun 1 5 x 10 meters or Planck s constant 6 625 x 10 Their only restriction is their lim ited precision Floating point numbers retain only the most significant digits of their value If a value has no more digits than a floating point number can store the value is stored exactly If it has more digits it is stored in approxi mate form with its least significant digits treated as zeros This lack of exact
257. ges on page 11 5 However you can sometimes use the facilities of the operating system as an additional way to control access to a database Security Stored Procedures and Views 11 3 Controlling Access to Databases Securing Database Files Database servers other than IBM Informix OnLine store databases in operat ing system files Typically a database is represented as a number of files one for each table one for the indexes on each table and possibly others The files are collected in a directory The directory represents the database as a whole Multiuser Systems You can deny access to the database by denying access to the database direc tory The means by which you can do this depend on your operating system and your computer hardware Multiuser operating systems have software facilities such as the Access Control List of VMS or the file permissions of UNIX Note In UNIX the database directory is created with group identity informix and the database server always runs under group identity informix Thus you cannot use group permissions to restrict access to a particular group of users You can only remove all group permissions file mode 700 and deny access to anyone except the owner of the directory You also can deny access to individual tables in this way for example by making the files that represent those tables unavailable to certain users while leaving the rest of the files accessible However the database
258. ght find that the query joins a table to a view that is itself a join If you rewrite the query to join directly to fewer tables you might be able to produce a simpler query plan Avoiding or Simplifying Sorts A sort is not necessarily negative The sort algorithm of the database server is highly tuned and extremely efficient It is certainly as fast as any external sort program you might apply to the same data As long as the sort is per formed only occasionally or to a relatively small number of output rows there is no need to avoid it However you should avoid or simplify repeated sorts of large tables The optimizer avoids a sort step whenever it can produce the output in its proper order automatically by using an index Here are some factors that prevent the optimizer from using an index e One or more of the ordered columns is not included in the index e The columns are named in a different sequence in the index and the ORDER BY or GROUP BY clause e The ordered columns are taken from different tables Another way to avoid sorts is discussed in Using a Temporary Table to Speed Queries on page 4 36 If a sort is necessary look for ways to simplify it As discussed in Time Cost of a Sort on page 4 22 the sort is quicker if you can sort on fewer or nar rower columns Optimizing Your Queries 4 31 Making Queries Faster 4 32 Eliminating Sequential Access to Large Tables Sequential access to a table ot
259. gram does not know if the cursor can produce any rows Fetching Rows The program uses the FETCH statement to retrieve each row of output This statement names a cursor and also can name the host variables to receive the data Here is the IBM Informix 4GL example completed DECLARE the item CURSOR FOR SELECT order_num item_num stock _num INTO o num i num s num FROM items OPEN the_item WHILE sqlcode 0 FETCH the_item IF sqlcode 0 THEN DISPLAY o num i num s num END IF END WHILE Detecting End of Data In this example the WHILE condition prevents execution of the loop in case the OPEN statement returns an error The same condition terminates the loop when SQLCODE is set to 100 to signal the end of data However there is also a test of SQLCODE under its 4GL name of status within the loop This test is necessary because if the SELECT statement is valid yet finds no matching rows the OPEN statement returns a zero but the first fetch returns 100 end of data and no data Here is another way to write the same loop DECLARE the item CURSOR FOR SELECT order_num item_num stock _num FROM items OPEN the_item IF sqlcode 0 THEN FETCH the_item fetch first row END IF WHILE sqlcode 0 DISPLAY o num i num s num FETCH the_item END WHILE SQL in Programs 6 19 Retrieving Multiple Rows In this version the case of zero returned rows is handled early so there is no second test of sqlcode within
260. h ing primary key You can identify primary and foreign keys and the relationship between them using the CREATE TABLE and ALTER TABLE statements For more information on these statements refer to Chapter 7 of IBM Informix Guide to SQL Reference For information on building data models using foreign and primary keys refer to Chapter 8 of this manual Interrupted Modifications Interrupted Modifications Even if all the software is error free and all the hardware is utterly reliable the world outside the computer can still interfere It is possible for lightning to strike the building interrupting the electrical supply and stopping the computer in the middle of your UPDATE statement It is more likely however that a disk fills up or a human operator supplies incorrect data causing your multirow insert to stop early with an error In any case as you are modifying data you must assume that some unforeseen event can interrupt the modifi cation When a modification is interrupted by an external cause you cannot be sure how much of the operation was completed Even in a single row operation you cannot know whether the data reached the disk or the indexes were properly updated If multirow modifications are a problem multistatement ones are worse It does not help that they are usually embedded in programs so that you do not see the individual SQL statements being executed For example the job of entering a new order in the store
261. h row in the selection set and closes the cursor This is the heart of the parts explosion problem but it is by no means a com plete solution For example the program in Figure 6 6 does not allow for components that appear at more than one level in the tree Furthermore a practical contains table would also have a column count giving the count of child parts used in each parent A program that returns a total count of each component part is quite a bit more complicated The iterative approach described earlier is not the only way to approach the parts explosion problem If the number of generations has a fixed limit you can solve the problem with a single SELECT statement using nested outer self joins SQL in Programs 6 25 Dynamic SQL If there can be up to four generations of parts contained within one top level part the following SELECT statement returns all of them SELECT a parent a child b child c child d child FROM contains a OUTER contains b OUTER contains c outer contains qd WHERE a parent top part number AND a child b parent AND b child c parent AND c child d parent This SELECT statement returns one row for each line of descent rooted in the part given as top_part_number Null values are returned for levels that do not exist Use indicator variables to detect them You can extend this solu tion to more levels by selecting additional nested outer joins of the contains table You also can
262. h table contributes to the final result Optimizer design is not a science and the optimizer is one part of a database server that is under continuous development and improvement This discus sion reflects the optimizer used in Version 5 0 of IBM Informix database serv ers IBM Informix database servers with earlier version numbers have an older simpler optimizer The Importance of Table Order The order in which tables are examined has an enormous effect on the speed of a join operation This concept can be clarified with some examples that show how the database server works A Join Without Filters Here is a SELECT statement that calls for a three way join SELECT C customer_num O order_num SUM items total_ price FROM customer C orders O items I WHERE C customer_num O customer_num AND O order_ num I order_ num GROUP BY C customer_ num O order num For the moment imagine that indexes were never invented Without indexes the database server has no choice but to perform this operation using a sim ple nested loop One of two practical query plans is displayed in Figure 4 1 expressed in a programming pseudocode A query plan states the order in which the database server examines tables and the methods by which it accesses the tables 4 8 Optimizing Your Queries Figure 4 1 The Query Optimizer for each row in the customer table do read the row into C for each row in the orders table do read the ro
263. hat is retrieved for each SELECT statement See the IBM Informix Guide to SQL Reference for information on the structure and contents of the stores5 database For emphasis keywords are shown in uppercase letters in the examples although SQL is not case sensitive The Forms of SELECT Although the syntax remains the same across all IBM Informix products the form of a SELECT statement and the location and formatting of the resulting output depends on the application The examples in this chapter and in Chapter 3 display the SELECT statements and their output as they appear when you use the interactive Query Language option of DB Access or IBM Informix SQL You also can use SELECT statements to query on data non interactively through IBM Informix SQL reports you can embed them in a language such as IBM Informix ESQL C where they are treated as executable code or you can incorporate them in IBM Informix 4GL as part of its fourth generation language Special Data Types The examples use the IBM Informix OnLine database server which enables database applications to include the data types VARCHAR TEXT and BYTE These data types are not available to applications that run on IBM Informix SE In the DB Access or IBM Informix SQL Interactive Editor when you issue a SELECT statement that includes one of these three data types the results of the query are displayed differently e Ifyou execute a query ona VARCHAR column the entire VARCHA
264. he data At first glance the fundamental data entities recorded in an address book include e Names of persons and organizations e Addresses e Telephone numbers Do these data entities meet the criteria given earlier They are clearly signif icant to the model and generic Are they fundamental A good test is to ask if an entity can vary in number independently of any other entity After thinking about it you realize that an address book sometimes lists people who have no number or current address 8 12 Building a Data Model Figure 8 4 Step 1 Name the Entities people who move or change jobs An address book also can list both addresses and numbers that are used by more than one person All three of these entities can vary in number independently that strongly suggests they are fundamental not dependent Are they unitary Names can be split into personal names and corporate names After thinking about it you decide that all names should have the same features in this model that is you do not plan to record different infor mation about a company than you would about a person Likewise you decide there is only one kind of address there is no need to treat home addresses differently from business ones However you also realize that there is not one kind of telephone number but three There are voice numbers that are answered by a person fax numbers that connect to a fax machine and modem numbers that connect to a c
265. he data base server cannot distribute modified data into them Security Stored Procedures and Views 11 25 Using Views e The DISTINCT keyword or its synonym UNIQUE The rows of the view represent a selection from among possibly many duplicate rows the database server cannot tell which of the original rows should receive the modification When a view avoids all these things each row of the view corresponds to exactly one row of one table Such a view is modifiable Of course particular users can only modify a view if they have suitable privileges Privileges on views are discussed beginning on page 11 29 Deleting Through a View A modifiable view can be used with a DELETE statement as if it were a table The database server deletes the proper row of the underlying table Updating a View You can use a modifiable view with an UPDATE statement as if it were a table However a modifiable view can still contain derived columns that is col umns that are produced by expressions in the select list of the CREATE VIEW statement You cannot update derived columns sometimes called virtual columns When a column is derived from a simple arithmetic combination of a column with a constant value for example order_date 30 the database server can in principle figure out how to invert the expression in this case by sub tracting 30 from the update value and perform the update However much more complicated expressions are poss
266. he data might not be accurate If a lead time is changed in manufact the stock column will be out of date until it too is updated As with derived data you should take pains to define the conditions under which the redundant data might be wrong 10 32 Tuning the Model Maximizing Concurrency Maximizing Concurrency Some databases are used by only one program at a time others are used con currently by multiple programs Two factors make concurrent programs inherently slower than doing the same amount of work serially e Multiple programs interfere with each other s use of buffers and disk drives The pages read for one program might be driven from the buffers by the next program s query and might have to be read again Disk I O for one query displaces the disk access arm slowing another program s sequential access e Programs that modify data lock pages delaying all other programs that use the same data Easing Contention Contention is inevitable between programs using the same resources You can deal with it in three general ways 1 Make programs use fewer resources either by making them do less work or by making them work more efficiently 2 Arrange the resources better for instance by allocating tables to dbspaces to minimize contention 3 Supply more resources more memory more and faster disk drives more and faster computers The first point is the subject of Chapter 4 which deals with making que
267. he domain or allowable set of values for that column For example the quantity column of the items table only permits numbers If a value outside the domain can be entered into a column the semantic integrity of the data is violated Semantic integrity is enforced using the following constraints e Data Type The data type defines the types of values that you can store in a column For example the data type SMALLINT allows you to enter values from 32 767 to 32 767 into a column e Default Value The default value is the value inserted into the column when an explicit value is not specified For example the user_id column of the cust_calls table defaults to the login name of the user if no name is entered e Check Constraint The check constraint specifies conditions on data inserted into a column Each row inserted into a table must meet these conditions For example the quantity column of the items table may check for quantities greater than or equal to 1 For more information on using semantic integrity constraints in database design refer to Defining the Domains on page 9 3 Referential Integrity Referential integrity refers to the relationship between tables Since each table in a database must have a primary key it is possible that this primary key appears in other tables because of its relationship to data within those tables When a primary key from one table appears in another table it is called a for eign key
268. he other entity With a 1 1 relationship you can put the foreign key in either table To minimize the space used by the tables put it in the table you expect to have fewer rows You cannot record an m n relationship by adding columns to entity tables This relationship requires a table of its own For example you decided that a name can have multiple fax numbers and a fax number can serve multiple names You must add sucha relationship to the model as a two column table Each column is a foreign key to one of the entities involved Name Fax NameString FaxNumber PK UA PK UA Gaius C Caesar 926 6741 SPOR S A 61 62 435 143 NameFax NameString FaxNumber PK FK NN PK FK NN Gaius C Caesar 926 6741 SPOR S A 61 62 435 143 The primary key comprises both columns Since the columns are part of the primary key nulls are not allowed The NN flag is specified anyway to emphasize the point The entire model so far is shown in Figure 8 1 Look for all the relationships from the matrix 8 20 Building a Data Model Step 2 Define the Relationships Name NameString AddressCode PK FK Gaius C Caesar 1001 SPOR S A 1020 Address AddressCode PK SA 1001 1020 NY Voice VceNumber PK UA 1 800 274 8184 011 49 89 922 030 Fax FaxNumber AddressCode VceNumber PK UA FK FK J 926 6741 1001 926 6300 P 61 62 435 143 10
269. he responder which responds with a block of data from a table Whenever data is exchanged over a network delays are inevitable in the following situations e If the network is busy the sender must wait its turn to transmit Such delays are typically brief less than a millisecond But in a heavily loaded network they can increase exponentially to tenths of seconds and more e The responder may be handling requests from more than one sender so when the request arrives it may be queued for a time that can range from milliseconds to seconds Optimizing Your Queries 4 27 Time Costs of a Query The Structure of an Index An index is arranged as a hierarchy of pages technically a B tree as depicted in the figure below At the bottom level a sequence of leaf pages contains the index key values of the table rows each with a pointer to the location of the row containing that value The keys in the leaf pages are in key sequence At each higher level a page lists the highest key value to be found in each page at the lower next level The topmost level is a single root page from which any other page of the index can be found root page lt lt leaf page vs leaf page The size of one entry is the width of the indexed columns in bytes plus 4 If you
270. her than the very first one in the plan is omi nous it threatens to read every row of the table once for every row selected from the preceding tables You should be able to judge how many times that is perhaps only a few but perhaps hundreds or even thousands If the table is a small one it can do no harm to read it over and over the table resides completely in memory Sequential search of an in memory table can be faster than searching the same table through an index especially if also having its index pages in memory pushes other useful pages out of the buffers When the table is larger than a few pages however repeated sequential access is deadly to performance One way to prevent it is to provide an index to the column being used to join the table The subject of indexing is discussed in the context of database design in Managing Indexes on page 10 20 However any user with Resource priv ileges can build additional indexes Use the CREATE INDEX command to make an index An index consumes disk space proportional to the width of the key values and the number of rows See The Structure of an Index on page 4 28 Also the database server must update the index whenever rows are inserted deleted or updated this slows these operations If necessary you can use DROP INDEX to release the index after a series of queries thus freeing space and making table updates easier Using Unions to Avoid Sequential Access Certain
271. her users e Grant database privileges including DBA privilege to another user Ownership Rights The database and every table view index procedure and synonym in it has an owner The owner of an object is usually the person who created it although a user with DBA privilege can create objects to be owned by others The owner of an object has all rights to that object and can alter or drop it without needing additional privileges Security Stored Procedures and Views 11 7 Granting Privileges Table Level Privileges You can apply seven privileges table by table to allow non owners the priv ileges of owners Four of them the Select Insert Delete and Update privi leges control access to the contents of the table The Index privilege controls index creation The Alter privilege controls the authorization to change the table definition The References privilege controls the authorization to spec ify referential constraints on a table In an ANSI compliant database only the table owner has any privileges In other databases the database server as part of creating a table automatically grants all table privileges except Alter and References to public This means that a newly created table is accessible to any user with Connect priv ilege If this is not what you want if there are users with Connect privilege who should not be able to access this table you must revoke all privileges on the table from public
272. her views Security Stored Procedures and Views 11 21 Using Views Since you write a SELECT statement that determines the contents of the view you can use views for any of these purposes e To restrict users to particular columns of tables You name only permitted columns in the select list in the view e To restrict users to particular rows of tables You specify a WHERE clause that returns only permitted rows e To constrain inserted and updated values to certain ranges You can use the WITH CHECK OPTION discussed on page 11 27 to enforce constraints e To provide access to derived data without having to store redundant data in the database You write the expressions that derive the data into the select list in the view Each time the view is queried the data is derived anew The derived data is always up to date yet no redundancies are introduced into the data model e To hide the details of a complicated SELECT statement You hide complexities of a multitable join in the view so that neither users nor application programmers need to repeat them Creating Views The following example creates a view based on a table in the demonstration database CREATE VIEW name_only AS SELECT customer num fname lname FROM customer The view exposes only three columns of the table Because it contains no WHERE clause the view does not restrict the rows that can appear The following example is based on the join of two tables
273. here can be divided into the following two groups e Keeping data confidential When the database resides in operating system files you can use features of the operating system to deny access to the database In any case you control the granting of Connect privilege to keep people out of the database When different classes of users have different degrees of authorization you must allow them all Connect privilege You can use table level priv ileges to deny access to confidential tables or columns Or you can use a stored procedure to provide limited access to confidential tables or col umns In addition you can deny all access to tables and allow it only through views that do not expose confidential rows or columns e Controlling changes to data and database structure You safeguard the integrity of the data model by restricting grants of Resource Alter References and DBA privileges You ensure that only authorized persons modify the data by controlling the grants of Delete and Update privileges and by granting Update privilege on as few col umns as possible You ensure that only consistent reasonable data is entered by granting Insert privilege only on views that express logical constraints on the data Alternatively you can control the insertion and modification of data or the modification of the database itself by limiting access to constrictive stored procedures 11 32 Security Stored Procedures and Views Networks and
274. hers Stored Procedures and SPL are described fully in the IBM Informix Guide to SQL Reference 11 16 Security Stored Procedures and Views Figure 11 3 Using Stored Procedures For example if you want a user to be able to read the name and address of a customer your stored procedure looks something like the one shown in Figure 11 3 CREATE PROCEDURE read_address lastname CHAR 15 RETURNING CHAR 15 CHAR 15 CHAR 20 CHAR 15 CHAR 2 CHAR 5 DEFINE p_lname p fname p_city CHAR 15 DEFINE p_add CHAR 20 DEFINE p_state CHAR 2 DEFINE p zip CHAR 5 SELECT fname lname address city state zipcode INTO p_ fname p _lname p_ city p_ state p zip FROM customer WHERE lname lastname RETURN p fname p_lname p_city p_state p zip END PROCEDURE Procedure to read from the customer table Stored procedures can simplify things for database users they do not have to learn some of the complicated parts of SQL Instead the complicated activi ties can be simplified by someone who knows SQL someone who writes a stored procedure to take care of an activity and lets others know that the pro cedure is stored in the database and that they can execute it You can use pro cedures to your advantage by hiding the SQL functionality inside them and in addition controlling what happens to the database and the data in the database To execute orrun a procedure you use the EXECUTE PROCEDURE s
275. hetical example of using an update cursor presents a problem that should never arise with an established database but could arise in the initial design phases of an application A large table named target is created and populated A character column datcol inadvertently acquires some null values These rows should be deleted Furthermore a new column serials is added to the table using the 7 16 Programs That Modify Data Concurrency and Locking ALTER TABLE command This column is to have unique integer values installed Figure 7 6 sketches the IBM Informix ESQL C code to accomplish these things char 80 dcol short int dcolint int sequence declare target _row cursor for select datcol into dcol dcolint from target for update of serials begin work open target _row if sqlca sqlcode 0 fetch next target row for sequence 1 sqlca sqlcode 0 sequence N Ur Ut Ut if dcolint lt 0 null datcol delete where current of target _row else update target set serials sequence where current of target _row if sqlca sqlcode gt 0 commit work else rollback work Figure 7 6 Cleaning up a handmade table using an update cursor Concurrency and Locking If your database is contained in a single user workstation with no network connecting it to other machines your programs can modify data freely But in all other cases you must allow for the possibility that while you
276. his kind returns some of the rows and some of the columns in a table SELECT UNIQUE city state zipcode FROM customer WHERE state NJ The result of this query contains a subset of the rows and a subset of the col umns in the customer table city state zipcode Cherry Hill NJ 08002 Princeton NJ 08540 Simple SELECT Statements Introducing the SELECT Statement Joining A join occurs when two or more tables are connected by one or more columns in common creating a new table of results Figure 2 1 uses a subset of the items and stock tables to illustrate the concept of a join SELECT unique item_num order num stock num description FROM items stock WHERE items stock num stock stock num items Table example stock Table example item_num order_num stock_num stock_num manu_code _ description 1 1001 HRO baseball gloves 1 1002 4 HSK baseball gloves 2 1002 3 HRO baseball 3 1003 5 HSK football 1 1005 5 NRG tennis racquet item_num order_num stock nu description 1 1001 E a baseball gloves 1 1002 4 football 3 1003 5 tennis racquet 1 1005 5 tennis racquet Figure 2 1 Example of a join between two tables Simple SELECT Statements 2 9 Introducing the SELECT Statement The following SELECT statement joins the customer and state tables SELECT UNIQUE city state zipcode sname FROM customer state W
277. history table before you delete it from the original table The union function uses the UNION keyword or operator to combine two queries into a single compound query You can use the UNION keyword between two or more SELECT statements to unite them and produce a tempo rary table containing rows that exist in any or all of the original tables Note that you cannot use a UNION operator inside a subquery or in the definition of a view Figure 3 1 illustrates the union set operation Advanced SELECT Statements 3 37 Set Operations SELECT DISTINCT stock _num manu_code FROM stock WHERE unit _price lt 25 00 UNION quantity SELECT stock_num manu_code greater less than FROM items WHERE quantity gt 3 than 3 one unit_price lt 25 00 less than oe M 25 00 qualifies qualifies unit_price greater than o or equalto qualifies 25 00 Figure 3 1 The union set operation The UNION keyword selects all rows from the two queries removes dupli cates and returns what is left Because the results of the queries are combined into a single result the select list in each query must have the same number of columns Also the corresponding columns selected from each table must be of the same data type CHARACTER type columns must be the same length and these corresponding columns must either all allow or all disallow nulls This compound SELECT statement performs a union on the stock_num and manu_
278. hives and Logs 23 Archiving Simple Databases IBM Informix SE 24 Archiving IBM Informix OnLine 25 Concurrency and Locks 25 Summary 26 5 2 Statements That Modify Data Chapter Overview Modifying data is fundamentally different from querying data Querying data involves examining the contents of tables Modifying data involves changing the contents of tables Think a moment about what happens if the system hardware or software fails during a query In this case the effect on the application can be severe but the database itself is unharmed However if the system fails while a modification is under way the state of the database itself is in doubt Obviously this can have far reaching implications Before you delete insert or update rows in a database ask yourself the following questions e Is user access to the database and its tables secure that is are specific users given limited database and table level privileges e Does the modified data preserve the existing integrity of the database e Are systems in place that make the database relatively immune to exter nal events that might cause system or hardware failures If you are unable to answer yes to each of these questions do not panic Solu tions to all these problems are built into the database servers After an intro duction to the statements that modify data this chapter discusses these solutions Chapters 8 through 11 of this manual talk about these topics i
279. hould put an index on any column that is used in a join expression more than occa sionally that is not identified as a primary or foreign key Selective Filter Columns in Large Tables If a column is often used to filter the rows of a large table consider placing an index on it The optimizer can use the index to pick out the desired columns avoiding a sequential scan of the entire table One example might be a table 10 22 Tuning the Model Managing Indexes that contains a large mailing list If you find that a postal code column is often used to filter a subset of rows you should consider putting an index on it even though it is not used in joins This strategy yields a net savings of time only when the selectivity of the col umn is high that is when only a small fraction of rows holds any one indexed value Nonsequential access through an index takes several more disk I O operations than sequential access so if a filter expression on the col umn passes more than a fourth of the rows the database server might as well read the table sequentially As a rule indexing a filter column saves time in the following cases e The column is used in filter expressions in many queries or in slow queries e The column contains at least 100 unique values e Most column values appear in fewer than 10 of the rows Order By and Group By Columns When a large quantity of rows must be ordered or grouped the database server must put the
280. hout the manual Document Conventions Typographical Conventions IBM Informix product manuals use a standard set of conventions to introduce new terms illustrate screen displays describe command syntax and so forth The following typographical conventions are used throughout this manual Convention KEYWORD All primary elements in a programming language statement keywords appear in uppercase letters in a serif font italics italics italics Within text new terms and emphasized words appear in italics Within syntax and code examples variable values that you are to specify appear in italics boldface boldface Names of program entities such as classes events and tables environment variables file and pathnames and interface elements such as icons menu items and buttons appear in boldface monospace monospace Information that the product displays and information that you enter appear ina monospace typeface KEYSTROKE Keys that you are to press appear in uppercase letters in a sans serif font This symbol indicates the end of product or platform specific information g Indicates a unique identifier primary key for each table When you are instructed to enter characters or to execute a command immediately press RETURN after the entry When you are instructed to type the text or to press other keys no RETURN is required Syntax Conventions
281. ible most of which cannot easily be inverted Therefore the database server does not support updating any derived column Figure 11 9 shows a modifiable view that contains a derived column and an UPDATE statement that can be accepted against it CREATE VIEW call _ response user_id received resolved duration AS SELECT user_id call_dtime res dtime res _dtime call_dtime FROM cust_calls WHERE user_id USER UPDATE call response SET resolved TODAY WHERE resolved IS NULL Figure 11 9 A modifiable view and an UPDATE statement 11 26 Security Stored Procedures and Views Using Views The duration column of the view cannot be updated because it represents an expression the database server cannot even in principle decide how to dis tribute an update value between the two columns named in the expression But as long as no derived columns are named in the SET clause the update can be performed as if the view were a table A view can return duplicate rows even though the rows of the underlying table are unique You cannot distinguish one duplicate row from another If you update one of a set of duplicate rows for example by using a cursor to update WHERE CURRENT you cannot be sure which row in the underlying table receives the update Inserting into a View You can insert rows into a view provided that the view is modifiable and con tains no derived columns The reason for the second restriction is that an inse
282. ich you ran the dbaccessdemo5 script To give someone else the permissions to access the command files in your directory use the UNIX chmod command Check with your system administrator for more information about operating system file and directory permissions UNIX permissions are discussed in the IBM Informix SE Adminis trator s Guide To give someone else access to the database that you created grant them the appropriate privileges using the GRANT statement in DB Access To remove privileges use the REVOKE statement The GRANT and REVOKE statements are described in the IBM Informix Guide to SQL Reference New Features in IBM Informix Server Products Version 5 x New Features in IBM Informix Server Products Version 5 x This section highlights the major new features implemented in Version 5 x of IBM Informix server products Enhanced Connectivity IBM Informix OnLine only The version 5 2 IBM Informix OnLine database server enables you to con nect to Version 7 x client application tools when both server and client are installed in the same machine Enhanced support for chunk offsets IBM Informix OnLine only The version 5 2 IBM Informix OnLine database server supports chunk off set values up to 2 Terabytes Referential and Entity Integrity New data integrity constraints allow you to specify a column or columns as representing a primary or foreign key of a table upon creation and to establish dependencies between t
283. ier because the subquery is true only if the outer SELECT finds at least one row SELECT UNIQUE manu_name lead_time FROM manufact WHERE EXISTS SELECT FROM stock WHERE description MATCHES shoe AND manufact manu_code stock manu_code You often can construct a query with EXISTS that is equivalent to one that uses IN You also can substitute ANY for IN SELECT UNIQUE manu_name lead_time FROM stock manufact WHERE manufact manu_code IN SELECT manu_code FROM stock WHERE description MATCHES shoe AND stock manu_code manufact manu_code Both of the preceding queries return two rows manufacturers that produce a kind of shoe and the lead time for ordering the product manu_name lead_time Anza 5 Hero 4 Karsten 21 Nikolus 8 ProCycle 9 Shimara 30 Note that you cannot use the predicate IN for a subquery that contains a col umn with a TEXT or BYTE data type Add the keyword NOT to IN or to EXISTS to create a search condition that is the opposite of the one in the preceding queries You also can substitute ALL for NOT IN Here are two different ways to do the same thing One way might allow the database server to do less work than the other depending on the design of the database and the size of the tables To find out which query might be 3 34 Advanced SELECT Statements Subqueries in SELECT Statements better you can use the SET EXPLAIN command to get a listing of the query plan SET EXPLAIN i
284. ific columns 7 16 Foreign key 5 19 Fragmentation 10 11 FREE statement freeing prepared statements 6 31 FROM keyword alias names 2 70 Function aggregate 2 47 date oriented 2 49 in SELECT statements 2 47 G GRANT statement automated 11 13 database level privileges 11 5 in 4GL 11 14 in embedded SQL 6 32 to 6 35 table level privileges 11 7 GROUP BY keywords column number with 3 7 composite index used for 4 33 description of 3 4 indexes for 4 16 4 31 restrictions in modifiable view 11 25 sorting rows 4 18 H HAVING keyword description of 3 8 Hold cursor definition of 7 32 Host variable delimiter for 6 6 description of 6 6 dynamic allocation of 6 31 fetching data into 6 19 in DELETE statement 7 4 in INSERT 7 8 in UPDATE 7 14 in WHERE clause 6 12 INTO keyword sets 6 12 null indicator 6 14 restrictions in prepared statement 6 27 truncation signalled 6 11 type conversion of 6 13 with EXECUTE 6 29 I IBM Informix 4GL detecting null value 6 14 example of dynamic SQL 11 14 indicator variable not used 6 14 program variable 6 5 STATUS variable 6 10 terminates on errors 6 34 7 14 timing operations in 4 6 using SQLCODE with 6 10 WHENEVER ERROR statement 6 34 IBM Informix NET 4 26 12 5 12 8 IBM Informix OnLine allows views on external tables 11 25 archiving 5 25 controls own disk space 11 4 disk access by 4 24 disk page size 4 23 disk storage methods 10 4 to 10 12 in network 12 5 optimizer input
285. ility Read about dbload in the documentation for your database server The LOAD command of DB Access IBM Informix SQL or IBM Informix 4GL can also load rows from a flat ASCII file Inserting hundreds or thousands of rows goes much faster if you turn off transaction logging There is no point in logging these insertions anyway because in the event of a failure you can easily re create the lost work Here are the steps of a large bulk load operation e If there is any chance that other users are using the database exclude them with the DATABASE EXCLUSIVE statement e If you are using IBM Informix OnLine ask the administrator to turn off logging for the database The existing logs can be used to recover the database to its present state while the bulk insertion can be run again to recover those rows if they are lost soon after e Perform the statements or run the utilities that load the tables with data Implementing the Model 9 29 Summary Archive the newly loaded database If you are using IBM Informix OnLine either ask the administrator to per form a full or incremental archive or else use the tbunload utility to make a binary copy of your database only If you are using other database servers use operating system commands to back up the files that represent the database Restore transaction logging and release the exclusive lock on the database You can enclose the steps of populating a database in a script of ope
286. imating Variable Length Rows 15 Estimating Index Pages 16 Estimating Blobpages 18 Locating Blob Data 19 Managing Indexes 20 Space Costs of Indexes 20 Time Costs of Indexes 21 Choosing Indexes 22 Join Columns 22 Selective Filter Columns in Large Tables 22 Order By and Group By Columns 23 Duplicate Keys Slow Index Modifications 23 Dropping Indexes 24 Clustered Indexes 25 Denormalizing 27 Shorter Rows for Faster Queries 27 Expelling Long Strings 27 Using VARCHAR Strings 27 Changing Long Strings to TEXT 28 Building a Symbol Table of Repeated Strings 28 Moving Strings to a Companion Table 29 Splitting Wide Tables 29 Division by Bulk 29 Division by Frequency of Use 29 Division by Frequency of Update 29 Costs of Companion Tables 30 Splitting Tall Tables 30 Redundant and Derived Data 31 Adding Derived Data 31 Adding Redundant Data 32 Maximizing Concurrency 33 Easing Contention 33 Rescheduling Modifications 33 Using an Update Journal 34 Isolating and Dispersing Updates 35 Splitting Tables to Isolate Volatile Columns 35 Dispersing Bottleneck Tables 35 Summary 36 10 2 Tuning the Model Chapter Overview The preceding chapters summarized the steps of creating and implementing a data model that is theoretically sound Normally the resulting database also yields adequate performance If it does the job is done However some applications have more stringent performance requirements Some databases contain extremely large
287. in CREATE TABLE 9 26 restrictions in modifiable view 11 26 NLOAD statement exporting data to a file 9 29 pdate cursor definition of 7 15 pdate journal 10 34 pdate privilege column level 11 10 definition of 11 9 with a view 11 29 UPDATE statement and end of data 7 14 applied to view 11 26 description of 5 11 embedded 7 14 to 7 17 missing WHERE signalled 6 9 multiple assignment 5 14 number of rows 6 11 preparing 6 27 privilege for 11 6 11 9 TODAY function leg use restrictions on subqueries 5 13 in constant expression 2 55 5 8 time to update indexes 10 21 Transaction Ea function cursors closed at end 7 32 description of 5 21 example with DELETE 7 5 locks held to end of 7 23 locks released at end 7 23 7 32 transaction log 5 22 5 24 transaction log required 9 24 use signalled in SQLAWARN 6 11 Transaction logging buffered 9 24 establishing with CREATE DATABASE 9 23 IBM Informix OnLine methods of 9 24 turning off for faster loading 9 29 in expression 2 55 2 56 3 17 USING keyword use in EXECUTE 6 29 Utility program dbload 9 29 10 12 dbschema 9 28 tbcheck 10 8 10 13 tbload 5 25 10 12 tbstat 10 13 tbunload 5 25 10 12 Index 15 16 Index V VALUES keyword use in INSERT 5 7 VARCHAR data type description of 9 16 effect on table size 10 15 used for performance 10 27 with LENGTH function 2 56 View deleting rows in 11 26 description of 11 21 dropped when basis is dro
288. in Chapter 5 When this part of the COBOL program is executed a row or rows of the items table is deleted The statement contains one new feature It compares the order_num column to an item written as o num This is the name of a host variable Each ESQL product has a means of delimiting the names of host variables when they appear in the context of an SQL statement In COBOL host variable names are designated with an initial colon The example statement asks the database server to delete rows in which the order number equals the current contents of the host variable named o num This is presumably a numeric variable that is declared and assigned a value earlier in the program In IBM Informix ESQL C an SQL statement can be introduced with either a leading currency symbol or the words EXEC SQL Calling the Database Server But these differences of syntax are trivial the essential points in all languages an embedded language IBM Informix 4GL or SPL are as follows e You can embed SQL statements in a source program as if they were exe cutable statements of the host language e You can use program variables in SQL expressions the way literal values are used If you have programming experience you can immediately see the possibil ities In the example the order number to be deleted is passed in the variable onum That value comes from any source that a program can use it can be read from a file the program can prompt a use
289. in SQLCODE In that event the active transaction is also rolled back This program relies on that behavior it assumes that if it reaches the end there were no errors and the transaction can be committed This kind of error han dling is acceptable when errors are unlikely and the program is used by peo ple who do not need to know why the program terminates Using UPDATE You can embed the UPDATE statement in a program in any of the forms described in Chapter 5 with the additional feature that you can name host variables in expressions both in the SET and WHERE clauses Moreover a program can update the row addressed by a cursor How Many Rows Were Affected SQLCODE and SQLERRD When your program uses a cursor to select rows it can test SQLCODE for 100 the end of data return code This is set to indicate that no rows or no more rows satisfy the query conditions The end of data code is set in SQLCODE only following SELECT statements it is not used following DELETE INSERT or UPDATE statements A query that finds no data is not a success However an UPDATE or DELETE statement that happens to update or delete no rows is still con sidered a success it updated or deleted the set of rows that its WHERE clause said it should however the set was empty In the same way the INSERT statement does not set the end of data code even when the source of the inserted rows is a SELECT statement and it selected no rows The INSERT statement is a
290. in a complicated program consider extracting the SELECT statement and executing it interactively or embedding it in a simpler program Optimizing Your Queries 4 29 Making Queries Faster If the real query takes many minutes or hours to complete it may be a good idea to prepare a scaled down database in which you can run tests more quickly This can be helpful but you must be aware of two potential problems e The optimizer can make different choices in a small database than in a large one even when the relative sizes of tables are the same Verify that the query plan is the same in the real and model databases e Execution time is rarely a linear function of table size Sorting time for example increases faster than table size as does the cost of indexed access when an index goes from two to three levels What appears to be a big improvement in the scaled down environment can be insignificant when applied to the full database Therefore any conclusion you reach as a result of tests in the model database must be tentative until verified in the large one Studying the Data Model Study the definitions of all the tables views and indexes used in the data base You can examine these details interactively using the Table option of DB Access or IBM Informix SQL Pay particular attention to the indexes that exist to the data types of columns used in join conditions and for ordering and to the presence of views This chapter is w
291. in the second CONTAINS PARENT CHILD FK NN FK NN 123400 432100 432100 765899 Figure 6 6 Retrieving Multiple Rows The parts explosion problem is this given a part number produce a list of all parts that are components of that part A sketch of one solution as imple mented in IBM Informix 4GL is shown in Figure 6 6 DEFINE part list ARRAY 200 OF INTEGER FUNCTION boom top_part DEFINE this part child_part INTEGER DEFINE next _to_do next free SMALLINT DECLARE part _scan CURSOR FOR SELECT child INTO child part FROM contains WHERE parent this part LET next _to_do 1 LET part_list next_to_do top_part LET next _free 2 WHILE next_to_do lt next_free this part part_list next_to_do FOREACH part _scan LET part_list next_free child part LET next free next free 1 END FOREACH LET next to do next _to do 1 END WHILE RETURN next free 1 END FUNCTION A breadth first algorithm to generate a parts explosion Technically speaking each row of the contains table is the head node of a directed acyclic graph or tree The function in Figure 6 6 performs a breadth first search of the tree whose root is the part number passed as its parameter The function uses a cursor named part_scan to return all the rows with a particular value in the parent column That is very easy to implement using the IBM Informix 4GL statement FOREACH which opens a cursor iter ates once for eac
292. include ORDER BY within a subquery SELECT po_num ship date FROM orders main WHERE 10 gt SELECT COUNT DISTINCT ship date FROM orders sub WHERE sub ship date gt main ship date AND ship date IS NOT NULL ORDER BY ship date po_num The subquery is correlated because the number it produces depends on main ship_date a value produced by the outer SELECT Thus the subquery must be executed anew for every row that the outer query considers The subquery uses the COUNT function to return a value to the main query The ORDER BY clause then orders the data The query locates and returns the 13 rows that have the 10 latest shipping dates po_num ship date 4745 06 21 1991 278701 06 29 1991 4290 06 29 1991 8052 07 03 1991 B77897 07 03 1991 LZ230 07 06 1991 B77930 07 10 1991 PC6782 07 12 1991 DM354331 07 13 1991 S22942 07 13 1991 MAO003 07 16 1991 W2286 07 16 1991 Z55709 07 16 1991 C3288 07 25 1991 KF2961 07 30 1991 W9925 07 30 1991 If you use a correlated subquery like the preceding one on a very large table you should index the ship_date column to improve performance Otherwise this SELECT statement might be considered somewhat inefficient because it executes the subquery once for every row of the table Indexing and perfor mance issues are discussed in Chapter 10 of this manual Advanced SELECT Statements 3 33 Subqueries in SELECT Statements Using EXISTS The keyword EXISTS is known as an existential qualif
293. ine as the application or in a different machine If it is in a different machine IBM Informix NET estab lishes communication with a database server in that machine and then acts as a conduit to pass requests and data between the application and the data base server Explicit Locations Using File Specifications You can write the location of a database as part of the database name The fol lowing example might be written in an application running on a DOS machine DATABASE D DBS TESTDB Here is a similar example from a UNIX based application You can tell because the slashes lean the other way DATABASE usr maxtel testdb The database is probably local IBM Informix NET starts a copy of the IBM Informix SE database server in this machine and the application uses that database server On some UNIX systems a DATABASE statement with the identical form can point to a different machine as follows DATABASE subtle dbdir testdb In this example you must suppose that the UNIX file system named subtle is physically attached to a different machine It is mounted to the application machine using the Network File System NFS feature or the Remote File Sharing RFS feature Nothing in the file specification reflects that fact How ever IBM Informix NET recognizes that the file system is not local to the appli cation machine It starts a copy of IBM Informix SE in the machine that owns subtle and passes the
294. ing a Temporary Table to Speed Queries 4 36 Summary 4 41 Statements That Modify Data Chapter Overview 5 3 Statements That Modify Data 5 3 Deleting Rows 5 4 Deleting a Known Number of Rows 5 4 Inserting Rows 5 6 Updating Rows 5 11 Database Privileges 5 15 Displaying Table Privileges 5 16 Data Integrity 5 17 Entity Integrity 5 18 Semantic Integrity 5 19 Referential Integrity 5 19 Interrupted Modifications 5 21 The Transaction 5 22 The Transaction Log 5 22 Specifying Transactions 5 22 Archives and Logs 5 23 Archiving Simple Databases IBM Informix SE 5 24 Archiving IBM Informix OnLine 5 25 Concurrency and Locks 5 25 Summary 5 26 SQL in Programs Chapter Overview 6 3 SQL in Programs 6 4 Static Embedding 6 5 Dynamic Statements 6 5 Program Variables and Host Variables 6 5 Calling the Database Server 6 7 The SQL Communications Area 6 7 The SQLCODE Field 6 10 The SQLERRD Array 6 11 The SQLAWARN Array 6 11 Chapter 7 Retrieving Single Rows 6 11 Data Type Conversion 6 13 Dealing with Null Data 6 14 Dealing with Errors 6 15 Retrieving Multiple Rows 6 17 Declaring a Cursor 6 18 Opening a Cursor 6 18 Fetching Rows 6 19 Cursor Input Modes 6 20 The Active Set of a Cursor 6 21 Using a Cursor A Parts Explosion 6 24 Dynamic SQL 6 26 Preparing a Statement 6 27 Executing Prepared SQL 6 29 Dynamic Host Variables 6 31 Freeing Prepared Statements 6 31 Quick Execution 6 32 Embedding Data Definition 6 32 Embedding Grant and Revoke Privi
295. ing and Executing Stored Procedures 11 16 Restricting Reads of Data 11 18 Restricting Changes to Data 11 19 Monitoring Changes to Data 11 19 Restricting Object Creation 11 20 Using Views 11 21 Creating Views 11 22 Modifying Through a View 11 25 Privileges and Views 11 29 Privileges When Creating a View 11 29 Privileges When Using a View 11 30 Summary 11 32 Networks and Distribution Chapter Overview 12 3 Network Configurations 12 3 The Local Area Network 12 4 Networking the Database Server 12 5 Network Transparency 12 7 Connecting to Data 12 7 Connecting inthe LAN 12 7 Connecting Through IBM Informix NET 12 8 Distributed Data 12 11 Naming External Tables 12 12 Using Synonyms with External Tables 12 13 Synonym Chains 12 14 Modifying External Tables 12 15 Summary 12 15 Notices Index Introduction Introduction In This Introduction 3 About this Manual 3 Organization of this Manual 4 IBM Informix Products That Use SOL 5 Products Covered in This Manual 5 The Demonstration Database 6 Creating the Demonstration Database on IBM Informix OnLine 7 Creating the Demonstration Database on IBM Informix SE 8 New Features in IBM Informix Server Products Version 5 x 9 Document Conventions 10 Typographical Conventions 11 Syntax Conventions 11 Example Code Conventions 16 Additional Documentation 17 Online Manuals 17 Error Message Files 18 The finderr Script 19 The rofferr Script 19 Documentation Notes Release Notes M
296. ing the sizes of tables and indexes in pages The resulting number of disk accesses can be estimated as follows e 400 pages read sequentially from part e 10 000 nonsequential accesses to the parven table 2 pages each one index leaf page one data page or 20 000 disk pages e 15 000 nonsequential accesses to the vendor table or 30 000 disk pages Even a simple join on well indexed tables can cost 50 400 disk reads How ever this can be improved by breaking the query into three steps using tem porary tables as shown in Figure 4 8 The following solution comes from W H Inmon it is adapted from an example in his book Optimizing Perfor mance in DB2 Software Prentice Hall 1988 DISK PAGES 5 000 10 000 15 000 20 000 25 000 30 000 35 000 40 000 45 000 50 000 Sequential and Nonsequential Disk Access part parven vendor 400 pages 20 000 pages 30 000 pages Disk Access Using Temporary Tables pv_by_vn 300 pages pvvn_by_pn 892 pages final query 580 pages Figure 4 8 Breaking a query into three steps using temporary tables Optimizing Your Queries 4 39 Making Queries Faster The first step is to get the data of the parven table in vendor_num order SELECT part _num vendor_num price FROM parven ORDER BY vendor num INTO TEMP pv_by vn This statement reads parven sequentially 50 pages writes a temporary table 50 pages and sorts it The cost of the sort assuming one merge level is about 200
297. ingle Valued Subqueries You do not need to include the keyword ALL or ANY if you know the sub query will return exactly one value to the outer level query A subquery that returns exactly one value can be treated like a function This kind of subquery often uses an aggregate function since aggregate functions always return single values SELECT order _num FROM items WHERE stock num 9 AND quantity SELECT MAX quantity FROM items WHERE stock num 9 This SELECT statement uses the aggregate function MAX ina subquery to find the order_num for orders that include the maximum number of volleyball nets It returns this row order _num 1012 The following example uses the aggregate function MIN in the subquery to select items for which the total price is higher than 10 times the minimum price SELECT order _num stock _num manu_code total_price FROM items x WHERE total price gt SELECT 10 MIN total_price FROM items WHERE order num x order_num The query retrieves these rows order _num stock _num manu_code total price 1003 8 ANZ 840 00 1018 307 PRC 500 00 1018 110 PRC 236 00 1018 304 HRO 280 00 3 32 Advanced SELECT Statements Subqueries in SELECT Statements Correlated Subqueries The following example of a correlated subquery returns a list of the 10 earliest shipping dates in the orders table It includes an ORDER BY clause after the subquery to order the results because you cannot
298. ins the offset in the statement fifth text where the error was detected The PREPARE statement is discussed under Preparing a Statement on page 6 27 ixth Following a successful fetch of a selected row or a successful insert update or delete sixt operation this field contains the rowid physical address of the last row processed character 8 SQLERRP Internal use only Figure 6 4 The uses of SQLCODE and SQLERRD 6 8 SQL in Programs Calling the Database Server array of 8 characters first second third fourth fifth sixth seventh eighth l first second third fourth fifth sixth seventh eighth character SQLAWARN When Opening a Database Set to W when any field is set to W If this field is blank the others need not be checked Set to W when the database now open uses a transaction log Set to W when the database now open is ANSI compliant Set to W when the database server is IBM Informix OnLine Set to W when the database server stores the FLOAT data type in DECIMAL form done when the host system lacks support for FLOAT types Not used Not used Not used All Other Operations Set to W when any other field is set to W Set to W when a column value is truncated when it is fetched into a host variable Set to W when an aggregate function encounters a null value On a select or on opening a cursor set to W when the number of items in the select list is not the same a
299. ion however when the database is available to multiple users concurrently Between the time you execute the SELECT statement and the subsequent DELETE statement other users could have modified the table and changed the result In this example another user might e Insert a new row for another customer named Druid Cyclery e Delete one or more of the Druid Cyclery rows before you do so e Update a Druid Cyclery row to have a new company name or update some other customer to have the name Druid Cyclery Although it is not likely that other users would do these things in that brief interval the possibility does exist This same problem affects the UPDATE statement Ways of addressing this problem are discussed under Concur rency and Locks on page 5 25 and in greater detail in Chapter 7 of this manual Another problem you may encounter is a hardware or software failure before the statement finishes In this case the database may have deleted no rows some rows or all specified rows The state of the database is unknown which is undesirable You can prevent this situation by using transaction logging as discussed in Interrupted Modifications on page 5 21 Modifying Data 5 5 Statements That Modify Data Complicated Delete Conditions The WHERE clause in a DELETE statement can be almost as complicated as the one in a SELECT statement It can contain multiple conditions connected by AND and OR and it may contain subqueries
300. ion Time Too on page 9 17 The advantages of the VARCHAR m r data type over the CHAR n type are as follows e It conserves disk space when the lengths of data items vary widely or when only a few items are longer than average e Queries on the more compact tables can be faster 9 16 Implementing the Model Defining the Domains Its disadvantages are as follows e It does not allow lengths that exceed 255 characters e Updates of a table can be slower in some circumstances e Jtis not available with all Informix database servers Variable Length Execution Time Too When the VARCHAR m r data type is used the rows of a table have vary ing lengths instead of fixed lengths This has mixed effects on the speed of database operations Since more rows fit in a disk page the database server can search the table using fewer disk operations than if the rows were of fixed length As a result queries can execute more quickly Insert and delete operations can be a little quicker for the same reason When you update a row the amount of work the database server must do depends on the length of the new row as compared to the old one If the new row is the same size or shorter execution time is not significantly dif ferent than it is with fixed length rows But if the new row is longer than the old one the database server might have to perform several times as many disk operations Thus updates of a table that uses VARCHAR m r
301. ions and Database Servers 19 Summary 20 1 2 Database Fundamentals Chapter Overview This chapter covers the fundamental concepts of databases and defines some terms that are used throughout the book with emphasis on the following topics e What makes a database different from any collection of files e What terms are used to describe the main components of a database e What language is used to create query and modify a database e What are the main parts of the software that manages a database and how do these parts work with each other Databases What and Why A database is a collection of information but so is a simple computer file What makes a database so special There must be reasons otherwise people would not spend so much money effort and computer time on databases There are two fundamental differences First a database comprises not only data but a plan or model of the data Second a database can be a common resource used concurrently by many people The Data Model The principal difference between information collected in a database and information in a file is in the way the data is organized A file is organized physically certain items precede or follow other items But the contents of a database are organized according to a data model A data model is a plan or map that defines the units of data and specifies how each unit is related to the others For example a number can appear in either
302. is linked with a library of ESQL procedures When the program runs the ESQL library procedures are called they set up communications with the database server to carry out the SQL operations Whereas ESQL products allow you to embed SQL in the host language some languages have SQL as a natural part of their statement set 4GL incorporates the SQL language as a natural part of the fourth generation language it sup ports Informix Stored Procedure Language SPL also uses SQL as a natural part of its statement set You use 4GL or an ESQL product to write application programs You use SPL to write procedures that are stored with a database and called from an application program SQL in Programs Static Embedding There are two ways in which you can introduce SQL statements into a pro gram The simpler and more common way is by static embedding which means that the SQL statements are written as part of the source program text The statements are static because they are a fixed part of the source text Dynamic Statements Some applications require the ability to compose SQL statements in response to user input For example a program might have to select different columns or apply different criteria to rows depending on what the user wants This can be done with dynamic SQL in which the program composes an SQL statement as a string of characters in memory and passes it to the database server to be executed Dynamic statements are not par
303. is manual as well as the product manuals Advanced SELECT Statements 3 3 Using the GROUP BY and HAVING Clauses Using the GROUP BY and HAVING Clauses The optional GROUP BY and HAVING clauses add functionality to your SELECT statement You can include one or both in a basic SELECT statement to increase your ability to manipulate aggregates The GROUP BY clause combines similar rows producing a single result row for each group of rows that have the same values for each column listed in the select list The HAVING clause sets conditions on those groups after they are formed You can use a GROUP BY clause without a HAVING clause or a HAVING clause without a GROUP BY clause Using the GROUP BY Clause The GROUP BY clause divides a table into sets It is most often combined with aggregate functions that produce summary values for each of those sets Some of the examples in Chapter 2 showed the use of aggregate functions applied to a whole table This chapter illustrates aggregate functions applied to groups of rows Using the GROUP BY clause without aggregates is much like using the DISTINCT or UNIQUE keyword in the SELECT clause Chapter 2 included this example SELECT DISTINCT customer _num FROM orders You also could write it this way SELECT customer_num FROM orders GROUP BY customer_num 3 4 Advanced SELECT Statements Using the GROUP BY and HAVING Clauses Either statement returns these rows cust
304. isplay data from two or more tables The section Multiple Table SELECT Statements told how to Create a Cartesian product Constrain a Cartesian product by including a WHERE clause with a valid join condition in your query Define and create a natural join and an equi join Join two or more tables on one or more columns Use aliases as a shortcut in multiple table queries Retrieve selected data into a separate temporary table with the INTO TEMP clause to perform computations outside the database The next chapter explains more complex queries and subqueries self joins and outer joins the GROUP BY and HAVING clauses and the UNION INTERSECTION and DIFFERENCE set operations Simple SELECT Statements 2 75 Advanced SELECT Statements Chapter Overview 3 Using the GROUP BY and HAVING Clauses 4 Using the GROUP BY Clause 4 Using the HAVING Clause 8 Creating Advanced Joins 10 Self Joins 11 Outer Joins 19 Simple Join 20 Simple Outer Join on Two Tables 22 Outer Join for a Simple Join to a Third Table 24 Outer Join for an Outer Join to a Third Table 25 Outer Join of Two Tables to a Third Table 27 Subqueries in SELECT Statements 29 Using ALL 30 Using ANY 31 Single Valued Subqueries 32 Correlated Subqueries 33 Using EXISTS 34 Set Operations 37 Union 37 Intersection 45 Difference 47 Summary 48 3 2 Advanced SELECT Statements Chapter Overview The preceding chapter demonstrated some of the basic ways to
305. itude is fine for many uses but you should never use a floating point data type to record money or any other quantity for which it is an error to change the least significant digits to zero There are two sizes of floating point data types The FLOAT type is a double precision binary floating point number as implemented in the C language on your computer One usually takes up 8 bytes The SMALLFLOAT also known as REAL type is a single precision binary floating point number that usually takes up 4 bytes The main difference between the two data types is their pre cision A FLOAT column retains about 16 digits of its values while a SMALL FLOAT column retains only about 8 digits Implementing the Model 9 9 Defining the Domains Floating point numbers have the following advantages e They store very large and very small numbers including fractional ones e They represent numbers compactly in 4 or 8 bytes e Arithmetic functions such as AVG and MIN and sort comparisons are efficient on these data types The main disadvantage of floating point numbers is that digits outside their range of precision are treated as zeros Adjustable Precision Floating Point DECIMAL p The DECIMAL p data type is a floating point type similar to FLOAT and SMALLFLOAT The important difference is that you specify how many signif icant digits it retains The precision you write as p may range from 1 to 32 from fewer than SMALLFLOAT up to twice th
306. ix UNIX products work with either an IBM Informix OnLine data base server or an IBM Informix SE database server If you are running appli cations on a network you can use an IBM Informix client server product such as IBM Informix NET or IBM Informix STAR IBM Informix NET is the communications facility for multiple IBM Informix SE database servers IBM Informix STAR allows distributed database access to multiple IBM Informix OnLine database servers Products Covered in This Manual The information presented in this manual is valid for the following products and versions and indicates differences in their use of SQL where appropriate e 4GL C Compiler Version and Rapid Development System Version Version 4 1 e IBM Informix SQL Version 4 1 e IBM Informix ESQL C Version 5 0 e IBM Informix ESQL COBOL Version 5 0 e IBM Informix SE Version 5 0 e IBM Informix NET Version 5 0 e IBM Informix OnLine Version 5 2 e IBM Informix STAR Version 5 0 The IBM Informix TP XA User Manual discusses the special considerations you should be aware of when using SQL statements with IBM Informix TP XA Introduction 5 The Demonstration Database The Demonstration Database 6 Introduction The DB Access utility which is provided with your IBM Informix database server products includes a demonstration database called stores5 that con tains information abouta fictitious wholesale sporting goods distributor The sample command files that make
307. ker than the original clustering because reading out the rows of a nearly clustered table is almost a sequential scan Clustering and reclustering take a lot of space and time You can avoid some clustering by building the table in the desired order in the first place The physical order of rows is their insertion order so if the table is initially loaded with ordered data no clustering is needed 10 26 Tuning the Model Denormalizing Denormalizing Extended Relational Analysis the method of data modeling described in Chapter 8 produces tables that contain no redundant or derived data tables that are well structured by the tenets of relational theory Sometimes to meet extraordinary demands for high performance you might have to modify the data model in ways that are undesirable from a theoretical standpoint This section describes some modifications and their associated costs Shorter Rows for Faster Queries As a general principle tables with shorter rows yield better performance than ones with longer rows This is because disk I O is performed in pages not in rows The shorter the rows of a table the more rows there are ona page The more rows per page the fewer I O operations it takes to read the table sequentially and the more likely it is that a nonsequential access can be satisfied from a buffer Extended Relational Analysis had you put all the attributes of one entity into a single table for that entity For some e
308. l ascending and the column listed first in the ORDER BY clause takes precedence In the following two examples of a nested sort the order in which selected data is displayed is modified by changing the order of the two columns named in the ORDER BY clause SELECT FROM stock ORDER BY manu_code unit price Simple SELECT Statements 2 15 Single Table SELECT Statements Here the manu_code column data is shown in alphabetical order and within each set of rows with the same manu_code for example ANZ HRO the unit_price is listed in ascending order of price stock _num manu_code description unit_price unit unit descr 5 ANZ tennis racquet 19 80 each each 9 ANZ volleyball net 20 00 each each 6 ANZ tennis ball 48 00 case 24 cans case 313 ANZ swim cap 60 00 box 12 box 201 ANZ golf shoes 75 00 each each 310 ANZ kick board 84 00 case 12 case 301 ANZ running shoes 95 00 each each 304 ANZ watch 170 00 box 10 box 110 ANZ helmet 244 00 case 4 case 205 ANZ 3 golf balls 312 00 case 24 case 8 ANZ volleyball 840 00 case 24 case 302 HRO ice pack 4 50 each each 309 HRO ear drops 40 00 case 20 case 113 SHM 18 spd assmbld 685 90 each each 5 SMT tennis racquet 25 00 each each 6 SMT tennis ball 36 00 case 24 cans case 1 SMT baseball gloves 450 00 case 10 gloves case In the following example the order of the columns in the ORDER BY clause is reversed SELECT FROM stock ORDER BY unit_price manu_code 2 1
309. lay one or more error messages on the terminal screen e Use the rofferr script to print one error message or a series of error messages The scripts are in the INFORMIXDIR bin directory The ASCII file has the following path INFORMIXDIR msg errmsg txt The error message numbers range from 1 through 33000 When you specify these numbers for the finderr or rofferr scripts you can omit the minus sign A few messages have positive numbers these messages are used solely within the application development tools In the unlikely event that you want to display them you must precede the message number with a sign The messages numbered 1 to 100 can be platform dependent If the message text for a message in this range does not apply to your platform check the operating system documentation for the precise meaning of the message number Additional Documentation The finderr Script Use the finderr script to display one or more error messages and their cor rective actions on the terminal screen The finderr script has the following syntax finderr i msg i msg_num is the number of the error message to display You can specify any number of error messages per finderr command The finderr command copies all the specified messages and their corrective actions to standard output For example to display the 359 error message you can enter the following command finderr 359 The following example de
310. leges Using IBM Informix OnLine so that table data only can be inspected through a call to the database server this feature solves the problem posed earlier that only certain users should know the salary performance review or other sensitive attributes of an employee To make the example specific suppose there is a table of employee data defined as shown in Figure 11 1 CREATE TABLE hr data emp key INTEGER emp name CHAR 40 hire date DATE dept_num SMALLINT user id CHAR 18 salary DECIMAL 8 2 performance _ level CHAR 1 performance notes TEXT A table of confidential employee information Since this table contains sensitive data you execute the following statement immediately after creating it REVOKE ALL ON hr data FROM PUBLIC For selected persons in the Human Resources department and for all manag ers you execute a statement such as this one GRANT SELECT ON hr data TO harold _r In this way you permit certain users to view all columns The final section of this chapter discusses a way to limit the view of managers to only their own employees For the first line managers who carry out performance reviews you could execute a statement like the following one GRANT UPDATE performance level performance_notes ON hr_ data TO wallace_s margot_t Security Stored Procedures and Views 11 11 Granting Privileges This statement permits the managers to enter their evalua
311. leges 6 32 Summary 6 35 Programs That Modify Data Chapter Overview 7 3 Using DELETE 7 3 Direct Deletions 7 4 Deleting witha Cursor 7 7 Using INSERT 7 8 Using an Insert Cursor 7 8 Rows of Constants 7 11 An Insert Example 7 12 Using UPDATE 7 14 Using an Update Cursor 7 15 Cleaning up a Table 7 16 Concurrency and Locking 7 17 Concurrency and Performance 7 17 Locking and Integrity 7 18 Locking and Performance 7 18 Concurrency Issues 7 18 How Locks Work 7 20 Setting the Isolation Level 7 24 Setting the Lock Mode 7 27 Simple Concurrency 7 29 Locking with Other Database Servers 7 30 Table of Contents vii Table of Contents Hold Cursors 7 32 Summary 7 33 Building a Data Model Chapter Overview 8 3 Why Build a Data Model 8 3 Extended Relational Analysis 8 3 Basic Ideas 8 6 Tables Rows and Columns 8 6 Primary Keys 8 7 Candidate Keys 8 7 Foreign Keys Join Columns 8 8 Step 1 Name the Entities 8 8 Entity Keys 8 9 Entity Tables 8 11 The Address Book Example 8 11 Step 2 Define the Relationships 8 14 Discover the Relationships 8 14 Add Relationships to Tables 8 19 Step 3 List the Attributes 8 22 Select Attributes 8 22 Select Attribute Tables 8 22 Summary 8 24 Implementing the Model Chapter Overview 9 3 Defining the Domains 9 3 Data Types 9 4 Default Values 9 20 Check Constraints 9 20 Specifying Domains 9 21 Creating the Database 9 23 Using CREATE DATABASE 9 23 Using CREATE TABLE 9 26 Using Command Scripts 9 28 Pop
312. letes the current row of the table reducing the count of duplicates by one Clean up functions of this sort are sometimes needed but they generally need more sophisticated design This one deletes all duplicate rows except the last one delivered by the database server That ordering has nothing to do with the contents of the rows or their meanings You might think of improv ing the function in Figure 7 2 by adding perhaps an ORDER BY clause to the cursor declaration However you cannot use ORDER BY and FOR UPDATE together A better approach is sketched later in the chapter Using INSERT You can embed the INSERT statement in programs Its form and use in a pro gram are the same as described in Chapter 5 of this manual with the addi tional feature that you can use host variables in expressions both in the VALUES and WHERE clauses Moreover a program has the additional ability to insert rows using a cursor Using an Insert Cursor The DECLARE CURSOR statement has many variations Most of them are used to create cursors for different kinds of scans over data but one variation creates a special kind of cursor an insert cursor You use an insert cursor with the PUT and FLUSH statements to efficiently insert rows into a table in bulk 7 8 Programs That Modify Data Using INSERT Declaring an Insert Cursor Figure 7 3 You create an insert cursor by declaring a cursor to be FOR an INSERT state ment instead of a SELECT statemen
313. llow specified users to add new data but not modify old data e Allow specified users to modify all or specified items of existing data e Ensure that added or modified data conforms to the data model The facilities that make these and other things possible are discussed in Chapter 11 of this manual Database Fundamentals 1 9 Databases What and Why _ J Q Query TABLE A and Q D Update TABLE C Only A TABLE B only gt jee m gt W m gt Ww i m IIIT MII MIAMI UII ise m w O ILI IT IMAI ATE Modify and Update TABLES A and B only View Column 3 TABLE B and Columns 1 and 2 TABLE C only Figure 1 4 Sharing the database 1 10 Database Fundamentals Databases What and Why Centralized Management Databases that are used by many people are highly valuable and must be pro tected as important business assets This creates two important problems archiving and maintenance The IBM Informix OnLine database server allows these tasks to be centralized Databases must be guarded against loss or damage The hazards are many failures in software and hardware and the risks of fire flood and other nat ural disasters Losing an important database creates a huge potential for damage The damage could include not only the expense and difficulty of re creating the lost data but the loss of productive time by the database users and the loss of business and go
314. logging e No logging at all This choice is not recommended if the database is lost to a hardware failure all data alterations since the last archive are lost CREATE DATABASE not_logged_db When you do not choose logging BEGIN WORK and other SQL statements related to transaction processing are not permitted in the database This affects the logic of programs that use the database e Regular logging This is the best choice for most databases If the database is lost only the alteration in progress at the time of failure is lost CREATE DATABASE a_logged_db WITH LOG IN a log file You must specify a file to contain the transaction log The form of the file name depends on the rules of your operating system This file grows whenever the database is altered Whenever the database files are Implementing the Model 9 25 Creating the Database archived you should set the log file back to an empty condition so it reflects only transactions following the latest archive ANSI compliant logging This is the same as regular logging but the ANSI rules for transaction processing are also enabled See the discussion of ANSI compliant databases in Chapter 1 CREATE DATABASE std_rules_ db WITH LOG IN a log file MODE ANSI You can add a transaction log to a nonlogged database later using the START DATABASE statement Once you apply logging you cannot remove it Only IBM Informix OnLine allows logging to be tur
315. lowing query returns SELECT COUNT FROM orders WHERE paid date IS NULL 4 10 Optimizing Your Queries Figure 4 3 The Query Optimizer Assume that there is just one customer for every order as there should be Then we can say that the plan in Figure 4 2 reads these rows e All rows of the orders table once e All rows of the customer table pdnull times e All rows of the items table pdnull times for each row in the customer table do read the row into C for each row in the orders table do read the row into O if O paid_date is null and O customer_num C customer_num then let Sum 0 for each row in the items table do read the row into I if I order_num O order_num then let Sum Sum I total_price end if end for prepare an output row from C I and Sum end if end for The alternative query plan in pseudocode An alternative plan is shown in Figure 4 3 it reads from customer first Because the filter is not applied in the first step this plan reads these rows e All rows of the customer table once e All rows of the orders table once for every row of customer e All rows of the items table pdnull times The query plans in Figure 4 2 and Figure 4 3 produce the same output although in different sequences They differ in that one reads a table pdnull times while the other reads a table SELECT COUNT x FROM customer times The choice the optimizer makes between them could make a difference of thousands o
316. lter pubs i order_num pubs o order_num Typical output produced by the optimizer with SET EXPLAIN ON The optimizer also reveals its estimate of the number of rows the query pro duces In Figure 4 5 the optimizer incorrectly estimates 2 The estimate is incorrect because the optimizer has no good way to tell how many groups the GROUP BY clause produces You know that there is a group for every row in the orders table the optimizer cannot know that Optimizing Your Queries 4 19 Time Costs of a Query In the body of the explanation the optimizer lists the order in which tables are accessed and the method or access path by which it reads each table The following breakdown clarifies the plan 1 The orders table is read first The index on order_num is used hence the rows are read in order_num sequence Since all rows are read it actually is less effort to read the table sequen tially However retrieving the rows in order_num sequence lets the GROUP BY clause be performed without a final sort 2 For each row of orders a search is made for matching rows in the customer table The search uses the index on customer_num The notation Key Only means that since only the customer_num column is used in the output only the index is read no row is read from the table 3 For each row of orders that has a matching customer_num a search is made in the items table using the index on order_num It is not always obvious why the
317. lues 11 22 11 27 database level privileges 11 5 making database inaccessible 11 5 restricting access to columns 11 22 restricting access to rows 11 22 11 23 restricting access to view 11 29 table level privileges 11 10 using host file system 11 4 using operating system facilities 11 3 with stored procedures 11 3 Seek time 4 24 Select cursor use of 6 18 Select list asterisk in 2 12 display label 2 44 expressions in 2 41 functions in 2 47 to 2 58 labels in 3 42 literal in 3 43 order of columns 2 13 selecting all columns 2 12 selecting specific columns 2 19 specifying a substring in 2 25 Select privilege column level 11 10 definition of 11 9 with a view 11 29 SELECT statement active set 2 27 aggregate functions in 2 47 alias names 2 70 asterisk in 2 12 compound query 3 37 cursor for 6 17 6 18 date oriented functions in 2 49 description of advanced 3 3 to 3 49 description of simple 2 3 to 2 73 display label 2 44 DISTINCT keyword 2 20 embedded 6 12 to 6 14 external tables 12 12 for joined tables 2 60 to 2 73 for single tables 2 12 to 2 58 functions 2 47 to 2 58 in modifiable view 11 25 INTO TEMP clause 2 73 join 2 62 to 2 69 natural join 2 65 ORDER BY clause 2 14 outer join 3 19 to 3 28 privilege for 11 6 11 9 rowid 3 15 3 18 SELECT clause 2 12 to 2 26 selecting a substring 2 25 selecting expressions 2 41 selection list 2 12 self join 3 11 singleton 2 27 subquery 3 29 to 3 37 UNION operator 3 37 usi
318. lues column by column you use the other form when the new values are generated as a set from a SELECT statement or a record variable You use transactions to prevent unforeseen interruptions in a modification from leaving the database in an indeterminate state When modifications are performed within a transaction they are rolled back following an error The transaction log also extends the periodically made archive copy of the data base so that if the database must be restored it can be brought right up to its most recent state SQL in Programs Chapter Overview 3 SQL in Programs 4 Static Embedding 5 Dynamic Statements 5 Program Variables and Host Variables 5 Calling the Database Server 7 The SQL Communications Area 7 The SQLCODE Field 10 End of Data 10 Negative Codes 10 The SQLERRD Array 11 The SOQLAWARN Array 11 Retrieving Single Rows 11 Data Type Conversion 13 Dealing with Null Data 14 Dealing with Errors 15 End of Data 15 Serious Errors 16 Using Default Values 16 Retrieving Multiple Rows 17 Declaring a Cursor 18 Opening a Cursor 18 Fetching Rows 19 Detecting End of Data 19 Locating the INTO Clause 20 Cursor Input Modes 20 The Active Set of a Cursor 21 Creating the Active Set 21 The Active Set for a Sequential Cursor 22 The Active Set for a Scroll Cursor 22 The Active Set and Concurrency 23 Using a Cursor A Parts Explosion 24 Dynamic SQL 26 Preparing a Statement 27 Executing Prepared SQL 29 Using
319. m 4 6 from command script 4 6 from watch 4 6 using query plan 4 30 verifying problem 4 4 Populating tables 9 29 PREPARE statement description of 6 27 error return in SQLERRD 6 11 missing WHERE signalled 6 9 multiple SQL statements 6 28 preparing GRANT 11 14 Primary key constraint attribute depends on 8 22 composite 8 10 definition of 5 20 8 7 restrictions with 8 7 Privilege Alter 11 10 and views 11 29 to 11 32 automating grants of 11 13 column level 11 10 Connect 11 6 DBA 11 7 Delete 11 9 11 29 displaying 5 16 encoded in system catalog 11 9 granting 11 5 to 11 15 Index 11 10 Insert 11 9 11 29 needed to create a view 11 29 to modify data 5 15 on a view 11 30 overview 1 9 Resource 4 32 11 7 Select 11 9 11 10 11 29 Update 11 9 11 10 11 29 Projection 2 7 Promotable lock 7 20 7 23 PUBLIC keyword privilege granted to all users 11 6 PUT statement constant data with 7 11 count of rows inserted 7 11 sends returned data to buffer 7 10 Q Query improving performance of 4 29 to 4 40 performance of 4 3 to 4 42 stated in terms of data model 1 7 time costs of 4 20 Query optimizer See Optimizer Query plan autoindex path 4 33 chosen by optimizer 4 17 description of 4 8 display with SET EXPLAIN 4 19 indexes in 4 12 use in analyzing performance 4 30 Index 11 12 Index Question mark as placeholder in PREPARE 6 27 R Redundant data introduced for performance 10 32 Referential constraint defi
320. made You can monitor all the changes made to the database by a single user Simply channel all changes through stored procedures that keep track of changes made by each user If you want to record each time the user acctclrk modifies the database set up the database with the following privileges e You are the DBA of the database e All of the other users have Connect privilege to the database They may or may not have Resource privilege They do not have Delete for this example privilege on the table being protected e Your stored procedure is created using the DBA keyword Security Stored Procedures and Views 11 19 Using Stored Procedures e Your stored procedure performs the deletion and records that a change has been made by a certain user Write a stored procedure similar to the one in Figure 11 6 which updates a table using a customer number provided by the user If the user happens to be acctelrk a record of the deletion is put in the file updates CREATE DBA PROCEDURE delete _customer cnum INT DEFINE username CHAR 8 DELETE FROM customer WHERE customer_num cnum IF username acctclrk THEN SYSTEM echo Delete from customer by acctclrk gt gt mis records updates ENF IF END PROCEDURE Figure 11 6 Stored procedure to delete rows and record changes made by a certain user You can monitor all the deletions made through the procedure by removing the IF statement and making the SYSTEM s
321. ment This code indicates an error or a normal event depending entirely on your application If you are sure that there ought to be a row or rows for example if you are reading a row using a key value that you just read from a row of another table then the end of data code repre sents a serious failure in the logic of the program On the other hand if you are selecting a row based on a key supplied by a user or some other source that is less reliable than a program a lack of data can be a normal event End of Data with Aggregate Functions If your database is not ANSI compliant the end of data return code 100 is set in SQLCODE only following SELECT statements Other statements such as INSERT UPDATE and DELETE set the third element of SQLERRD to show how many rows they affected this topic is covered in Chapter 7 of this manual A SELECT statement that selects an aggregate function such as SUM MIN or AVG always succeeds in returning at least one row of data This is true even when no rows satisfy the WHERE clause an aggregate value based on an empty set of rows is null but it exists nonetheless However an aggregate value is also null if it is based on one or more rows that all contain null values If you must be able to detect the difference between an aggregate value based on no rows and one based on some rows that are all null you must include a COUNT function in the statement and an indicator variable on the aggregate val
322. ment produces a list of the order numbers of unshipped orders It is an uncorrelated subquery and is executed once Impossible Updates There are restrictions on the use of subqueries when you modify data In par ticular you cannot query the table that is being modified You can refer to the present value of a column in an expression as in the example in which the unit_price column was incremented by 5 You can refer to a value of a col umn in a WHERE clause in a subquery as in the example that updated the stock table in which the items table is updated and items stock_num is used in a join expression The need to update and query a table at the same time does not arise often in a well designed database database design is covered in Chapters 8 through 11 of this manual However you may want to do this when a database is first being developed before its design has been carefully thought through A typ Modifying Data 5 13 Statements That Modify Data ical problem arises when a table inadvertently and incorrectly contains a few rows with duplicate values in a column that should be unique You might want to delete the duplicate rows or update only the duplicate rows Either way a test for duplicate rows inevitably requires a subquery which is not allowed in an UPDATE statement or DELETE statement Chapter 7 discusses how to use an update cursor to perform this kind of modification Updating with Selected Values 5 14 Modifying
323. ments 2 60 Creating a Cartesian Product 2 60 Creating aJoin 2 62 Some Query Shortcuts 2 70 Summary 2 74 Chapter 3 Chapter 4 Advanced SELECT Statements Chapter Overview 3 3 Using the GROUP BY and HAVING Clauses 3 4 Using the GROUP BY Clause 3 4 Using the HAVING Clause 3 8 Creating Advanced Joins 3 10 Self Joins 3 11 Outer Joins 3 19 Subqueries in SELECT Statements 3 29 Using ALL 3 30 Using ANY 3 31 Single Valued Subqueries 3 32 Correlated Subqueries 3 33 Using EXISTS 3 34 Set Operations 3 37 Union 3 37 Intersection 3 45 Difference 3 47 Summary 3 48 Optimizing Your Queries Chapter Overview 4 3 Optimizing Techniques 4 4 Verifying the Problem 4 4 Considering the Total System 4 5 Understanding the Application 4 5 Measuring the Application 4 6 Finding the Guilty Functions 4 7 Keeping an Open Mind 4 7 The Query Optimizer 4 8 The Importance of Table Order 4 8 How the Optimizer Works 4 14 Reading the Plan 4 19 Time Costs of aQuery 4 20 Activities in Memory 4 20 Disk Access Management 4 22 The Cost of Reading a Row 4 23 The Cost of Sequential Access 4 24 The Cost of Nonsequential Access 4 25 The Cost of Rowid Access 4 25 The Cost of Indexed Access 4 25 The Cost of Small Tables 4 26 The Cost of Network Access 4 26 Table of Contents v Table of Contents Making Queries Faster 4 29 Preparing a Test Environment 4 29 Studying the Data Model 4 30 Studying the Query Plan 4 30 Rethinking the Query 4 31 Us
324. monstrates how to specify a list of error messages This example also pipes the output to the UNIX more command to control the display You can also redirect the output to another file so that you can save or print the error messages finderr 233 107 113 134 143 144 154 more The rofferr Script Use the rofferr script to format one error message or a range of error mes sages for printing By default rofferr displays output on the screen You need to send the output to nroff to interpret the formatting commands and then to a printer or to a file where the nroff output is stored until you are ready to print You can then print the file For information on using nroff and on printing files see your UNIX documentation Introduction 19 20 Introduction Additional Documentation The rofferr script has the following syntax rofferr start_msg start_msg is the number of the first error message to format This error message number is required end_msg is the number of the last error message to format This error message number is optional If you omit end_msg only start_msg is formatted The following example formats error message 359 It pipes the formatted error message into nroff and sends the output of nroff to the default printer rofferr 359 nroff man lpr The following example formats and then prints all the error messages between 1300 and 4999 rofferr 1300 4999 nroff man lpr
325. moved to separate computers two questions immediately arise How can they be connected again How does the application find its data that is now somewhere else Connecting in the LAN The LAN is designed to make the disks attached to file servers appear to be attached to the user s machine As a result databases and tables are found just as they normally are by specifying the disk and directory where they are kept The database server uses an environment variable named DBPATH to find a database If the path to a database specifies a disk that is elsewhere on the net work the database server uses it just the same and never knows the difference Networks and Distribution 12 7 Connecting to Data Informix DOS engines allow you to create tables in specific locations as in the following example CREATE TABLE net_tab col_1 integer col 2 float IN F tables This feature gives you the ability to place a table on a specific disk You can for instance put different tables on different file servers to balance network load Note The IBM Informix UNIX database servers allow you to create a table in a par ticular pathname IBM Informix SE or dbspace IBM Informix OnLine but all tables must be on disks attached to the computer in which the database server is running Connecting Through IBM Informix NET IBM Informix NET products support a variety of network types operating systems and database servers While th
326. mple indicate that more code would be added in a full application but it is not necessary to show it to describe the concept being discussed Additional Documentation For additional information refer to the following types of documentation e Online manuals e Error message files e Documentation notes release notes and machine notes Online Manuals ACD that contains your manuals in electronic format is provided with your IBM Informix products You can install the documentation or access it directly from the CD For information about how to install read and print online manuals see the installation insert that accompanies your CD You can also obtain the same online manuals at the IBM Informix Online Documentation site at http www 3 ibm com software data informix pubs library You may want to refer to a number of related documents that complement the IBM Informix Guide to SQL Tutorial e A companion volume to the Tutorial IBM Informix Guide to SQL Reference provides full information on the structure and contents of the demonstra tion database that is provided with all IBM Informix application development tools It includes details of the system catalog describes UNIX environment variables that should be set and defines column data types supported by IBM Informix products Further it provides a detailed description of all the SQL statements supported by IBM Informix products It also contains a glossary of useful terms
327. n tained in the IBM Informix OnLine Administrator s Guide Important Database Terms 1 12 You should know two sets of terms before you begin the next chapter One set of terms describes the database and the data model the other set describes the computer programs that manage the database The Relational Model Tables IBM Informix databases are relational databases In technical terms that means that the data model by which an IBM Informix database is organized is based on the relational calculus devised by E F Codd In practical terms it means that all data is presented in the form of tables comprising rows and col umns A database is a collection of information grouped into one or more tables A table is an array of data items organized into rows and columns A demon stration database is distributed with every IBM Informix product A table from the demonstration database is shown in Figure 1 5 Database Fundamentals Figure 1 5 Columns Rows Important Database Terms stock Table stock_num manu_code description unit_price unit unit_descr 1 HRO baseball gloves 250 00 case 10 gloves case 1 HSK baseball gloves 800 00 case 10 gloves case 1 SMT baseball gloves 450 00 case 10 gloves case 2 HRO baseball 126 00 case 24 case 3 HSK baseball bat 240 00 case 12 case 4 HSK football 960 00 case 24 case 4 HRO football 480 00 case 24 case 5 NRG tennis racquet 28 00 each each 313 ANZ swimcap 60 00 box 12 box The st
328. n greater detail Statements That Modify Data The following three statements modify data DELETE INSERT e UPDATE Although these SQL statements are relatively simple when compared with the more advanced SELECT statements use them carefully since they do change the contents of the database Modifying Data 5 3 Statements That Modify Data Deleting Rows The DELETE statement removes any row or combination of rows from a table There is no way you can recover a deleted row once the transaction is com mitted Transactions are discussed under Interrupted Modifications on page 5 21 For now think of a transaction and a statement as the same thing When deleting a row you must be careful also to delete any rows of other tables whose values depend on the deleted row If however your database enforces referential constraints you are not allowed to delete rows when other rows depend on their value For more information on referential con straints refer to the section Referential Integrity on page 5 19 Deleting All Rows of a Table The DELETE statement specifies a table and usually contains a WHERE clause that designates the row or rows that are to be removed from the table If the WHERE clause is left out all rows are deleted Do not execute the following statement DELETE FROM customer Since this DELETE statement contains no WHERE clause all rows from the customer table are deleted If you attem
329. n customer by its index is equally effective However any plan that uses an index must read index data from disk as well as read row data It is difficult to predict the number of index pages that are read since some number of recently used index pages are retained in mem ory and are found there when they are needed See Disk Access Manage ment on page 4 22 Optimizing Your Queries The Query Optimizer The physical order of a table also can affect the cost of index use The query plan in Figure 4 4 reads the rows of the customer table in physical order If that is also customer number order customer numbers are presented in sequence to the index on orders customer_num Since the index is sorted the result is to read the index pages sequentially Almost certainly they are read only once The physical order of the customer table is customer number order if a clus tered index is on that column It is approximately that order if customer num bers are SERIAL values generated by the database server However if the physical order is random with respect to customer numbers each search of the index on orders might lead to a different page of index keys so that an index page is read for almost every row The Sort Merge Join Technique The sort merge table join implemented in Version 5 0 provides an alterna tive to the nested loop table join It allows the optimizer to choose the best path of execution to produce the fas
330. n display TEXT values on a screen and edit them using screen forms generated with IBM Informix 4GL programs or with the PERFORM screen form processor Binary Objects BYTE The BYTE data type is designed to hold any data a program can generate graphic images program object files and documents saved by any word pro cessor or spreadsheet The database server permits any kind of data of any length in a BYTE column Like TEXT BYTE data items are stored in whole disk pages in separate disk areas from normal row data The advantage of the BYTE data type as opposed to TEXT or CHAR is that it accepts any data Its disadvantages are the same as those of the TEXT data type Changing the Data Type You can use the ALTER TABLE command to change the data type assigned to a column after the table is built While this is sometimes necessary you should avoid it for the following reasons e To change a data type the database server must copy and rebuild the table For large tables that can take a lot of time and disk space e Some changes of data type can cause a loss of information For example when you change a column from a longer to a shorter character type long values are truncated when you change to a less precise numeric type low order digits are truncated e Existing programs forms reports and stored queries also might have to be changed Implementing the Model 9 19 Defining the Domains Default Values A defaul
331. n maxrow else 4 remainder maxrow pageuse Let homemax be the reserve requirement of the database server datrows floor pageuse homemax typrow Let datrows be the number of typical rows that fits on a page before the database server decides the page is full datpages ceiling estrows datrows expages estrows x overpage The table requires approximately datpages expages disk pages for rows Additional pages for TEXT and BYTE columns are estimated in Estimating Blobpages on page 10 18 An estimate for the catalog table is shown in Figure 10 6 Tuning the Model 10 15 Calculating Table Sizes Variable Estimate Basis of Estimate estrows 5 000 company business plan pagesize 2 048 output of tbstat pageuse 2 020 pagesize 28 maxrow 381 sum of 4 column data type max size typical catalog num SERIAL 4 stock_num SMALLINT 2 2 manu_code CHAR 3 3 3 cat_descr TEXT 56 56 cat_picture BYTE 56 56 cat_adv VARCHAR 255 65 256 66 typrow 191 homerow 191 typrow lt pageuse overpage 0 typrow lt pageuse homemax 381 maxrow lt pageuse datrows 8 floor pageuse homemax typrow datpages 625 ceiling estrows datrows expages 0 estrows X overpage Figure 10 7 Estimating the size of the catalog table Estimating Index Pages The tblspace includes index pages as well as pages of data and index pages can be a significant fraction of the total An index entry consists of a key and a pointer Th
332. n the statement is performed correctly but no rows were found For example after the program fetches all the rows that a SELECT statement can produce the database server sets SOQLCODE to 100 to say end of data In an ANSI compliant database if the WHERE clause of a DELETE INSERT or UPDATE statement matches no rows 100 is set to show that no rows are found Negative Codes When something unexpected goes wrong during a statement the database server returns a negative number in SQLCODE to explain the problem The meanings of these codes are documented in the IBM Informix Error Messages manual and in the on line error message file Some error codes that can be reported in SQLCODE reflect general problems and the database server can set a more detailed code in the second field of SQLERRD This second code reveals the low level error encountered by the database server I O routines or by the underlying operating system 6 10 SQL in Programs Retrieving Single Rows The SQLERRD Array The integers in the array named SQLERRD are set to different values follow ing different statements The first and fourth elements of the array are only used in IBM Informix 4GL IBM Informix ESQL C and IBM Informix ESQL COBOL The fields are used as shown in Figure 6 4 These additional details can be very useful For example you can use the value in the third field to report how many rows were deleted or updated When your program prepares an SQL stat
333. nd of its list Neither operation is a problem when the list is short as is normal But when a list fills many pages the database server must read all the rows to find the end When it deletes an entry it typically must update and rewrite half the pages in the list Thus an index on a column that has a small number of distinct values in a table that has a large number of rows can drastically reduce the speed of updating An example is a column whose values are the names or abbrevia tions of states or provinces If there are 50 unique values in a mailing list of 100 000 rows there are an average of 2 000 duplicates per value But real data is never so well distributed in such a table the more common values likely have 10 000 or more duplicates and their lists might approach 50 pages in length When the database server inserts or deletes an entry in such a list it is busy for a long time Worse still it has to lock all the affected index pages while it does the work greatly reducing concurrent access to the table You can avoid this problem in a fairly simple way at some cost in disk space The trick is to know that the database server uses the leading column of a composite index in the same way as it uses an index on that column alone So instead of creating an index on a column with few unique values create a composite index on that column followed by one other column that has a wide distribution of values For example change the in
334. ndex and then reading the rows However if the rows are required in sorted order there may be a net savings in reading the index and through it reading the rows in sorted order The optimizer might choose a third option creating a temporary index in two cases When neither table in a join has an index on the joining column and the tables are large enough the optimizer may decide that it is quicker to build an index to one table than to read through that table sequentially for each row of the other table You can also use a temporary index to generate rows in sorted or grouped sequence The alternative is to write the output rows to a temporary table and sort that The optimizer has a fourth option performing a sort merge which does not require a temporary index This happens automatically when at least one filter of the join is an equality operator Selecting the Query Plan With all this information available the optimizer generates all possible query plans for joining tables in pairs Then if more than two tables are joined the optimizer uses the best two table plans to form all plans for joining two tables to a third three to a fourth and so on The optimizer adds any final work to the completed join plans For example if there is an ORDER BY or GROUP BY clause and a plan does not produce rows in ordered sequence the optimizer adds to the plan an estimate of the cost of sorting the output Sorting is discussed in Time Co
335. nds pairs of orders where the ship_weight differs by a factor of five or more and the ship_date is not NULL and orders the data by ship_date order _num ship weight ship date order _num ship weight ship date 004 95 80 05 30 199 011 0 40 07 03 199 004 95 80 05 30 199 020 4 00 07 16 199 004 95 80 05 30 199 022 5 00 07 30 199 007 125 90 06 05 199 015 20 60 07 16 199 007 125 90 06 05 199 020 4 00 07 16 199 007 125 90 06 05 199 022 5 00 07 30 199 007 125 90 06 05 199 0 0 40 07 03 199 007 125 90 06 05 199 00 20 40 06 01 199 007 125 90 06 05 199 009 20 40 06 21 199 005 80 80 06 09 199 0 0 40 07 03 199 005 80 80 06 09 199 020 4 00 07 16 199 005 80 80 06 09 199 022 5 00 07 30 199 012 70 80 06 29 199 0 0 40 07 03 199 012 70 80 06 29 199 020 4 00 07 16 199 013 60 80 07 10 199 0 0 40 07 03 199 017 60 00 07 13 199 0 0 40 07 03 199 018 70 50 07 13 199 0 0 40 07 03 199 Advanced SELECT Statements 3 11 Creating Advanced Joins Suppose you want to select the results of a self join into a temporary table You would of course append an INTO TEMP clause to the SELECT statement However because you are in effect creating a new table you also must rename at least one set of column names by assigning them display labels Otherwise you will see an error message that indicates duplicate column names and the temporary table is not created SELECT x order_num ordersl1 x po_num purchl x ship date shipl y order_num orde
336. ned in the order in which they were created That cannot be said of any other data type You can specify the initial value in a SERIAL column in the CREATE TABLE statement This makes it possible to generate different subsequences of system assigned keys in different tables The stores5 database uses this tech nique In stores5 the customer numbers begin at 101 while the order num bers start at 1001 As long as this small business does not register more than 899 customers all customer numbers have three digits and order numbers have four A SERIAL column is not automatically a unique column If you want to be perfectly sure there are no duplicate serial numbers you must apply a unique constraint see Using CREATE TABLE on page 9 26 However if you define the table using the interactive schema editor of DB Access or IBM Informix SQL it automatically applies a unique constraint to any SERIAL column The SERIAL data type has the following advantages e It provides a convenient way to generate system assigned keys e Itproduces unique numeric codes even when multiple users are updating the table e Different tables can use different ranges of numbers 9 8 Implementing the Model Defining the Domains It has the following disadvantages e Only one SERIAL column is permitted in a table e Itcan produce only arbitrary numbers then again arbitrary numeric codes might not be acceptable to the database users Alterin
337. ned on and off Using CREATE TABLE Use the CREATE TABLE statement to create each table you designed in the data model This statement has a complicated form but it is basically a list of the columns of the table For each column you supply the following information The name of the column The data type from the domain list you made If the column or columns is a primary key the constraint PRIMARY KEY If the column or columns is a foreign key the constraint FOREIGN KEY If the column is not a primary key and should not allow nulls the con straint NOT NULL If the column is not a primary key and should not allow duplicates the constraint UNIQUE If the column has a default value the constraint DEFAULT If the column has a check constraint the constraint CHECK 9 26 Implementing the Model Creating the Database In short the CREATE TABLE statement is an image in words of the table as you drew it in the data model diagram Figure 9 7 shows the statements for the address book model whose diagram is shown in Figure 9 6 on page 9 22 CREATE TABLE NAME NameString VARCHAR 50 20 PRIMARY KEY AddressCode INTEGER BirthDate DATE FOREIGN KEY AddressCode REFERENCES ADDRESS AddressCode CREATE TABLE ADDRESS AddressCode SERIAL 1000 PRIMARY KEY Street VARCHAR 50 20 City VARCHAR 40 10 StaProv CHAR 5 PostCode CHAR 10 i CREATE TABLE VOICE VceNumber CHAR 13 PRIMARY KEY VceType C
338. newaddr Database Privileges Notice that the values for multiple columns are produced by a single SELECT statement If you rewrite this example in the other form with an assignment for each updated column you must write five SELECT statements one for each column to be updated Not only is such a statement harder to write it also takes much longer to execute Note In IBM Informix 4GL and the embedded SQL programs you can use record or host variables to update values For more information on this refer to Chapter 6 of this manual Database Privileges There are two levels of privileges in a database database level privileges and table level privileges When you create a database you are the only one who can access it until you as the owner or DBA of the database grant database level privileges to others When you create a table in a database that is not ANSI compliant all users have access privileges to the table until you as the owner of the table revoke table level privileges from specific users The three database level privileges follow e Connect privilege which allows you to open a database issue queries and create and place indexes on temporary tables e Resource privilege which allows you to create permanent tables e DBA privilege which allows you to perform a number of additional func tions as the database administrator There are seven table level privileges However only the first four are cov e
339. ney are the most common examples Amounts in U S and other currencies are written with two digits to the right of the decimal point Normally you also know the number of digits needed on the left depending on whose transac tions are recorded perhaps 5 digits for a personal budget 7 for a small busi ness and 12 or 13 for a national budget These numbers are fixed point numbers because the decimal point is fixed at a specific place regardless of the value of the number The DECIMAL p s data type is designed to hold them When you specify a column of this type you write its precision p as the total number of digits it can store from 1 to 32 You write its scale s as the number of those digits that fall to the right of the decimal point The relation between precision and scale is diagrammed in Figure 9 2 Scale can be zero meaning it stores only whole numbers When this is done DECIMAL p s provides a way of storing integers of up to 32 digits 7 precision 8 Aa DECIMAL 8 3 31964 535 me scale 3 digits The relation between precision and scale in a fixed point number Like the DECIMAL p data type DECIMAL p s takes up space in proportion to its precision One value occupies 1 p 2 bytes rounded up to a whole number of bytes The MONEY type is identical to DECIMAL p s but with one extra feature Whenever the database server converts a MONEY value to characters for dis play it automatically includes a curren
340. ng for join 2 9 for projection 2 7 for selection 2 5 Self join assigning column names with INTO TEMP 3 12 description of 3 11 Semantic integrity 5 19 9 3 Sequential access See Disk access sequential Sequential cursor definition of 6 20 SERIAL data type description of 9 7 generated number in SQLERRD 6 11 inserting a starting value 5 8 SET clause 5 14 Set difference 3 47 SET EXPLAIN statement interpreting output 4 30 writes query plan 4 19 Set intersection 3 45 SET ISOLATION statement controlling the effect of locks 5 26 restrictions 7 24 SET keyword use in UPDATE 5 12 SET LOCK MODE statement controlling the effect of locks 5 26 description of 7 27 SET LOG statement buffered vs unbuffered 9 24 Singleton SELECT 2 27 Site name in table name 12 12 with DATABASE statement 12 10 SITENAME function use in SELECT 2 55 2 58 3 18 SMALLFLOAT data type description of 9 9 SMALLINT data type description of 9 7 SOME keyword beginning a subquery 3 29 Sort merge join 4 13 Sorting avoiding nonsequential access 4 37 avoiding with temporary table 4 36 effect on performance 4 31 nested 2 15 optimizer estimates cost 4 18 sort merge join 4 13 time costs of 4 22 with ORDER BY 2 14 Index 13 14 Index SPL program variable 6 5 SQL ANSI standard 1 16 cursor 6 17 description of 1 15 error handling 6 15 history 1 16 Informix SQL and ANSI SQL 1 16 interactive use 1 18 optimizing See Optimizer standardization 1 16 SQL
341. ng from the model The following attributes were added to the address book model to produce the tables shown in Figure 8 1 at the start of this chapter Street city state or province and postal code were added to the address entity Birth date was added to the name entity Type was added to the voice entity to distinguish car phones home phones and office phones The hours a fax machine is attended was added to the fax entity Whether a modem supports 300 1200 or 2400 baud rates was added to the modem entity Building a Data Model 8 23 Summary Summary This chapter summarized and illustrated the following three principle steps of data modeling as prescribed by Extended Relational Analysis 1 List the entities that are to be recorded making sure that they are e Significant e Generic e Fundamental e Unitary Then identify their primary keys and document each entity as a table Exhaustively list the relationship between each pair of entities classifying it as e None no relationship e One to one e One to many e Many to many Then record each relationship by adding columns to the entity tables or for many to many relationships by adding new two column tables Record important attributes of entities or relationships by adding new columns to the tables When the process is done right you are forced to examine every aspect of the data not once but several times 8 24 Building a Data Model
342. ning the address book model see The Address Book Example on page 8 11 an apparently simple entity the telephone number turns out to con sist of three categories each with different features These choices are neither simple nor automatic To discover the best choice of entities you must think deeply about the nature of the data you want to store Of course that is exactly the point of making a formal data model Entity Keys Each entity you choose is represented as a table in the model The table stands for the entity as an abstract concept while each row represents a specific individual instance of the entity For example if customer is an entity a customer table represents the idea of customer in it each row represents one specific customer An entity is a table and every table must have a primary key therefore your next task is to specify a primary key for each entity That is you must desig nate some quantifiable characteristic of the entity that distinguishes each instance from every other Building a Data Model 8 9 Step 1 Name the Entities User Assigned Keys Some entities have ready made primary keys such as catalog codes or iden tity numbers defined outside the model These are user assigned keys flagged UA in the model Composite Keys Other entities lack features that are reliably unique Different people can have identical names different books can have identical titles You can usually find a
343. nition of 5 20 Referential integrity 5 19 8 8 Regular expression effect on performance 4 35 Relational model attribute 8 22 denormalizing 10 27 description of 1 12 8 6 to 8 24 entity 8 8 join 2 9 many to many relationship 8 16 normal form 8 22 one to many relationship 8 15 one to one relationship 8 15 operations of 1 14 projection 2 7 selection 2 5 Relational operator BETWEEN 2 30 equals 2 28 EXISTS 3 29 IN 3 29 in a WHERE clause 2 27 to 2 40 LIKE 2 34 NOT 2 30 not equals 2 29 NULL 2 33 OR 2 31 Release notes Intro 21 Remote File Sharing RFS 12 9 RENAME COLUMN statement restrictions 11 24 RENAME TABLE statement restrictions 11 24 Repeatable Read isolation level description of 7 26 Report generator 1 18 Resource privilege 4 32 11 7 Restricting access using file system 11 4 REVOKE statement granting privileges 11 5 to 11 15 in embedded SQL 6 32 to 6 35 with a view 11 30 RFS See Remote File Sharing ROLLBACK WORK statement cancels a transaction 5 23 closes cursors 7 32 releases locks 7 23 7 32 sets SOLCODE 7 5 ROLLFORWARD DATABASE statement applies log to restored database 5 24 Root dbspace definition of 10 5 Row cost of reading from disk 4 23 defining 8 6 deleting 5 4 in relational model 1 13 8 6 inserting 5 6 size of fixed length 10 13 Row lock 7 22 Rowid 3 15 3 18 Rowid function 4 25 S Schema See Data Model Scroll cursor active set 6 22 definition of 6 20 Security constraining inserted va
344. not be used for SELECT statements Embedding Data Definition Data definition statements the SQL statements that create databases and modify the definitions of tables are not usually put into programs The rea son is that they are rarely performed a database is created just once but queried and updated many times The creation of a database and its tables is generally done interactively using DB Access or IBM Informix SQL These tools can also be driven from a file of statements so that the creation of a database can be done with one operating system command This is discussed in Chapter 10 of this manual Embedding Grant and Revoke Privileges 6 32 SQL in Programs One task related to data definition is done repeatedly the granting and revoking of privileges The reasons for this are discussed in Chapter 11 Since privileges must be granted and revoked frequently and since this might be done by persons who are not skilled in SQL it can be useful to package the GRANT and REVOKE statements in programs to give them a simpler more convenient user interface The GRANT and REVOKE statements are especially good candidates for dynamic SQL Each statement takes three parameters e A list of one or more privileges e A table name e The name of a user Figure 6 9 Embedding Data Definition You probably need to supply at least some of these values based on program input from the user or command line parameters or a file b
345. ns that span multiple computer systems and even multiple XA compliant database systems from different vendors Naming External Tables The database that is opened by the DATABASE or CREATE DATABASE state ment is the current database Any other database is an external database To refer to a table in an external database you include the database name as part of the table name SELECT name number FROM salesdb contacts The external database is salesdb The table in it is named contacts You can use the same notation in a join When there is more than one external table the long table names can become cumbersome unless you use aliases to shorten them SELECT C custname S phone FROM salesdb contacts C stores customer S WHERE C custname S company You can qualify a database name with a server name the name of a network machine where another IBM Informix OnLine database server is running That is how you specify an external database that is managed by a different database server SELECT O order_num C fname C lname FROM masterdb central customer C sales boston orders O WHERE C customer_num O Customer_num INTO TEMP mycopy In the example two external tables are being joined The joined rows are being stored in a temporary table in the current database The external tables are located in two different database servers One is named central the other boston 12 12 Networks and Distribution Distributed Data
346. nstruct SW corner of Biltmore Mall backlog n po num 22942 ship date 07 13 1991 ship weight 70 50 ship charge 20 00 paid_date 08 06 1991 Simple SELECT Statements 2 57 Single Table SELECT Statements You can include the keyword SITENAME in a SELECT statement on IBM Informix OnLine to find the name of the database server You can query on the SITENAME for any table that has rows including system catalog tables SELECT SITENAME server tabid FROM systables WHERE tabid lt 4 In this SELECT statement you assign the label server to the SITENAME expression and also select the tabid column from the systables system cata log table This table describes database tables and tabid is the serial interval table identifier server tabid montague 1 montague 2 montague 3 montague 4 Without the WHERE clause to restrict the values in the tabid the database server name would be repeated for each row of the systables table 2 58 Simple SELECT Statements Single Table SELECT Statements SELECT HEX customer_num HEX rowid hexrow FROM CUSTOMER hexnum HEX zipcode hexzip In this SELECT statement the HEX function returns the hexadecimal format of three specified columns in the customer table hexnum 0x00000065 0x00000066 0x00000067 0x00000068 0x00000069 Ox0000006A 0x0000006B O0x0000006C 0x0000006D Ox0000006E Ox0000006F 0x00000070 0x00000071 0x00000072 0x00000073 0x00000074 0x00000075 0x0
347. nt Sp Denver co 127 Big Blue Bike Shop Blue Island NY 128 Phoenix College Phoenix AZ Simple SELECT Statements 2 29 Single Table SELECT Statements Specifying Rows There are several ways to specify rows in a WHERE clause Here are two SELECT catalog _num FROM catalog WHERE catalog num BETWEEN 10005 AND 10008 stock_num manu_code cat_advert SELECT catalog num FROM catalog WHERE catalog num gt 10005 AND catalog num lt 10008 stock_num manu_code cat_advert Both of these statements specify a range for catalog_num from 10005 through 10008 inclusive The first statement uses keywords and the second uses relational operators to retrieve the following rows catalog num 10005 stock num 3 manu_code HSK cat_advert catalog num stock_num manu_code cat_advert catalog num stock_num manu_code cat_advert catalog num stock_num manu_code cat_advert High Technology Design Expands the Sweet Spot 10006 3 SHM Durable Aluminum for High School and Collegiate Athletes 10007 4 HSK Quality Pigskin with Joe Namath Signature 10008 4 HRO Highest Quality Football for High School and Collegiate Competitions Note that although the catalog table includes a column with the BYTE data type that column is not included in this SELECT statement because the out put would show only the words lt BYTE value gt by the column name You can display TEXT and BYTE values by using the PROGRAM attrib
348. nt views of the con tents of a database and their access to those contents can be restricted in sev eral ways 1 20 Database Fundamentals Summary A database can be crucially important to the success of an organization and can require central administration and monitoring The IBM Informix OnLine database server caters to the needs of essential applications both IBM Informix OnLine and IBM Informix SE support smaller databases for pri vate or group use You control and query a database using the Structured Query Language which was pioneered by IBM and standardized by ANSI You will probably take advantage of the Informix extensions to the ANSI defined language but your IBM Informix tools also makes it possible to maintain strict compliance with ANSI standards Two layers of software mediate all your work with databases The bottom layer is always a database server that executes SQL statements and manages the data on disk and in computer memory The top layer is one of many appli cations some from us and some written by you other vendors or your col leagues Database Fundamentals 1 21 Chapter Simple SELECT Statements Chapter Overview 3 Introducing the SELECT Statement 3 Some Basic Concepts 4 Privileges 4 Relational Operations 5 Selection and Projection 5 Joining 9 What This Chapter Contains 11 The Forms of SELECT 11 Special Data Types 11 Single Table SELECT Statements 12 Selecting All Columns and Ro
349. ntities this can produce rows of awk ward length There are some ways to shorten them As the rows get shorter query performance should improve Expelling Long Strings The most bulky attributes are often character strings If you can remove them from the entity table the rows become shorter Using VARCHAR Strings Since the VARCHAR data type is relatively new with IBM Informix OnLine an existing database might contain CHAR columns that can be converted profit ably to VARCHAR VARCHAR columns shorten the average row when the average value in the CHAR column is at least 2 bytes shorter than the existing fixed width of the column This substitution does not harm the theoretical characteristics of the model Furthermore VARCHAR data is immediately compatible with most existing programs forms and reports Forms must be recompiled Forms and reports should of course be tested on a sample database Tuning the Model 10 27 Denormalizing Changing Long Strings to TEXT When the typical string fills half a disk page or more consider converting it to a TEXT column in a separate blobspace The column within the row page is only 56 bytes long which should put many more rows on a page However the TEXT data type is not automatically compatible with existing programs The code for fetching a TEXT value is more complicated than the code for fetching a CHARACTER value into a program Building a Symbol Table of Repeated Strings If
350. nts all that the database knows about one subject or kind of thing column attribute A column represents one feature characteristic or fact that is true of the table subject row instance A row represents one individual instance of the table subject There are some rules about how you choose entities and attributes but they are important only when you are designing a new database Database design is covered in Chapters 8 through 11 of this manual The data model in an existing database already is set To use the database you only need to know the names of the tables and columns and how they correspond to the real world Operations on Tables Since a database is really a collection of tables database operations are oper ations on tables The relational model supports three fundamental opera tions two of which are illustrated in Figure 1 6 All three operations are defined in more detail with many examples in Chapters 2 and 3 of this manual To select froma table is to choose certain rows leaving others aside One selec tion that could be made on the stock table is select all rows in which the manufacturer code is HRO and the unit price is between 100 00 and 200 00 To project from a table is to choose certain columns leaving others aside One projection that can be made from the stock table is show me the stock_num unit_descr and unit_price columns only A table contains information about only one entity
351. num in the select list you would have had to include a GROUP BY clause with that column in the group list In addition if the condition in the HAVING clause had not been satisfied the output would have shown the col umn heading and a message would have indicated that no rows were found Advanced SELECT Statements 3 9 Creating Advanced Joins The following example contains all seven SELECT statement clauses that you can use in the Informix version of interactive SQL the INTO clause naming program or host variables is available only in an IBM Informix 4GL or embedded language program SELECT o order_num SUM i total_price price paid_date order date span FROM orders o items i WHERE o order date gt 01 01 90 AND o customer_num gt 110 AND o order_num i order_num GROUP BY 1 3 HAVING COUNT lt 5 ORDER BY 3 INTO TEMP temptabl This SELECT statement joins the orders and items tables employs display labels table aliases and integers used as column indicators groups and orders the data and puts the following results in a temporary table order _num price span 1017 584 00 1016 654 00 1012 1040 00 1019 1499 97 26 1005 562 00 28 1021 1614 00 30 1022 232 00 40 1010 84 00 66 1009 450 00 68 1020 438 00 A Creating Advanced Joins The previous chapter showed how to include a WHERE clause in a SELECT statement to join two or more tables on one or more columns It illustrated natural joins and e
352. o tape Its output consists of binary images of the disk pages as IBM Informix OnLine held them As a result the copy can be made very quickly and the corresponding tbload program can restore the file very quickly However the data format is not meaningful to any other programs Concurrency and Locks If your database is contained in a single user workstation with no network connecting it to other machines concurrency does not concern you But in all other cases you must allow for the possibility that while your program is modifying data another program is also reading or modifying the same data This is concurrency two or more independent uses of the same data at the same time A high level of concurrency is crucial to good performance in a multiuser database system Unless there are controls on the use of data however con currency can lead to a variety of negative effects Programs could read obso lete data modifications could be lost even though it seemed they were entered successfully Modifying Data 5 25 Summary Summary 5 26 Modifying Data The database server prevents errors of this kind by imposing a system of locks A lock is a claim or reservation that a program can place on a piece of data The database server guarantees that as long as the data is locked no other program can modify it When another program requests the data the database server either makes the program wait or turns it back with an error
353. o that the volatile columns are isolated in a companion table Depending on the mix of operations and on the priorities of the users you can then put either the static or the volatile subtable on your fastest disk drive Dispersing Bottleneck Tables Small tables are sometimes used for summaries usage records and audits For example your interactive programs can maintain a table with a row for each authorized user Each time the user starts or ends a program it updates that user s row to show time on time off number of transactions or other work monitoring data Small tables that are only read do not cause performance problems but small tables that are the subject of concurrent updates do Any small table that must be updated on every transaction can become a bottleneck in which every on line program queues up and waits Tuning the Model 10 35 Summary To eliminate the problem either use a journal with off peak updates as described earlier or disperse the bottleneck by creating many tables To mon itor users create a one row table for each user Summary When tables are moderate in size and only one user at a time accesses the database carefully applied relational theory is sufficient to produce good performance When both the number of tables and the number of users become larger and the response time begins to degrade you must turn to practical solutions The first step is to understand and take advantage of th
354. ocedure is always slower than access to a local disk Moreover the requests for disk I O from all users must pass over the network and through the file server which can lead to delays when several users are busy at once Networking the Database Server An obvious answer to the problems of the LAN is to split Figure 12 1 at the point marked B that is to move the database server away from the applica tion and into the computer to which the disks are attached That way only the processed data the selected rows that satisfy the query pass over the network The IBM Informix NET products support this configuration There are several IBM Informix NET products each one for a different type of network A typi cal configuration is depicted in Figure 12 3 Networks and Distribution 12 5 Network Configurations A network can include one or more computers that contain database servers Figure 12 3 shows one computer It contains a database server that might be IBM Informix SE or IBM Informix OnLine It is possible to have different data base servers on a network in different machines It is also possible to have more than one copy of each database server on the network in the same machine or in different machines Each database server is a network service The way a network service is defined and made available to the network depends on the type of client server software in use Application Program IBM Informix NET Product Ap
355. ock table from the demonstration database distributed with all IBM Informix products A table represents all that is known about one entity one type of thing that the database describes The example table stock represents all that is known about the merchandise that is stocked by a sporting goods store Other tables in the demonstration database represent such entities as customer and orders A database is primarily a collection of tables To create a database is to create a set of tables The right to query or modify tables can be controlled on a table by table basis so that some users can view or modify some tables and not others Each column of a table stands for one attribute that is one characteristic fea ture or fact that is true of the subject of the table The stock table has columns for the following facts about items of merchandise stock numbers manufac turer codes descriptions prices and units of measure Each row of a table stands for one instance of the subject of the table that is one particular individual example of that entity Each row of the stock table stands for one item of merchandise that is sold by the sporting goods store Database Fundamentals 1 13 Important Database Terms Tables Rows and Columns You now understand that the relational model of data is a very simple way of organizing data to reflect the world using these simple corresponding rela tionships table entity A table represe
356. od will while the users are unable to work A plan for regular archiving of critical databases can help avoid or mitigate these potential disasters A large database used by many people must be maintained and tuned Some one must monitor its use of system resources chart its growth anticipate bot tlenecks and plan for expansion Users will report problems in the applica tion programs someone must diagnose these and correct them If rapid response is important someone must study and analyze the performance of the system and find the causes of slow responses Group and Private Databases Some IBM Informix database servers are designed to manage relatively small databases that are used privately by individuals or that are shared among a small group of users These database servers for example IBM Informix SE for the UNIX operating system store databases in files managed by the host operating system These databases can be archived using the same procedures for backing up files that work with other computer files that is copying the files to another medium when they are not in use The only difference is that when a database is archived its transaction log file must be reset to empty The use of transaction logs is discussed in Chapter 7 Chapter 10 has more information on archiving Performance problems that arise in group and private databases are usually related to particular queries that take too long Chapter 4 deals in depth wi
357. oducts All statements regarding IBM s future direction or intent are subject to change or withdrawal without notice and represent goals and objectives only All IBM prices shown are IBM s suggested retail prices are current and are subject to change without notice Dealer prices may vary This information contains examples of data and reports used in daily business operations To illustrate them as completely as possible the examples include the names of individuals companies brands and products All of these names are fictitious and any similarity to the names and addresses used by an actual business enterprise is entirely coincidental COPYRIGHT LICENSE This information contains sample application programs in source language which illustrate programming techniques on various operating platforms You may copy modify and distribute these sample programs in any form without payment to IBM for the purposes of developing using marketing or distributing application programs conforming to the application programming interface for the operating platform for which the sample programs are written These examples have not been thoroughly tested under all conditions IBM therefore cannot guarantee or imply reliability serviceability or function of these programs You may copy modify and distribute these sample programs in any form without payment to IBM for the purposes of developing using marketing or distributing application
358. of Nonsequential Access 25 The Cost of Rowid Access 25 The Cost of Indexed Access 25 The Cost of Small Tables 26 The Cost of Network Access 26 Making Queries Faster 29 Preparing a Test Environment 29 Studying the Data Model 30 Studying the Query Plan 30 Rethinking the Query 31 Rewriting Joins Through Views 31 Avoiding or Simplifying Sorts 31 Eliminating Sequential Access to Large Tables 32 Using Unions to Avoid Sequential Access 32 Replacing Autoindexes with Indexes 33 Using Composite Indexes 33 Using tbcheck on Suspect Indexes 34 Dropping and Rebuilding Indexes After Updates 34 Avoiding Correlated Subqueries 34 Avoiding Difficult Regular Expressions 35 Avoiding Noninitial Substrings 35 Using a Temporary Table to Speed Queries 36 Using a Temporary Table to Avoid Multiple Sorts 36 Substituting Sorting for Nonsequential Access 37 Summary 41 4 2 Optimizing Your Queries Chapter Overview How much time should a query take How many disk operations should the computer perform while executing a query For many queries it does not matter as long as the computer finds the information faster than a human can But some queries must be performed in a limited amount of time or must use only a limited amount of machine power This chapter reviews techniques for making queries more efficient It assumes that you work with an existing database and cannot change its arrangement of tables Techniques of designing a new database for reliabili
359. om puter You decide that you want to record different information about each kind of number so these three are different entities After you choose primary keys the diagram of the tables of the model might look like Figure 8 4 Name Address NameString AddressCode PK UA PK SA Gaius C Caesar 1001 SPOR S A 1020 Voice Fax Modem VceNumber FaxNumber MdmNumber PK UA PK UA PK UA 1 800 274 8184 926 6741 416 566 7024 011 49 89 922 030 61 62 435 143 33 1 42 70 67 74 The tables of an address book model after primary keys are chosen This diagram reflects some important decisions First the name of a person or organization is being used as a primary key user assigned That would not be acceptable if two organizations or people could have identical names For this exercise we assume that duplicate names are not a problem or that we can make them unique by adding a middle initial or a title Building a Data Model 8 13 Step 2 Define the Relationships Telephone numbers are also shown as user assigned primary keys Addresses however are given system assigned primary keys because to make an address unique the primary key must include all the parts such as city street and house number That makes an exceedingly cumbersome key Addresses are composite keys as well since parts of an address need to be treated as separate attributes columns later in the design Step 2 Define th
360. omer _num 101 104 106 110 111 112 115 116 117 119 120 121 122 123 124 126 127 The GROUP BY clause collected the rows into sets so that the rows in each set all had equal customer numbers With no other columns selected the result is a list of the unique customer_num values The power of the GROUP BY clause is more apparent when it is used with aggregate functions SELECT order_num COUNT number SUM total_price price FROM items GROUP BY order_num This SELECT statement retrieves the number of items and the total price of all items for each order The GROUP BY clause causes the rows of the items table to be collected into groups each group composed of rows that have identical order_num values That is the items of each order are grouped together After the groups are formed the aggregate functions COUNT and SUM are applied within each group Advanced SELECT Statements 3 5 Using the GROUP BY and HAVING Clauses The query returns one row for each group It uses labels to give names to the results of the COUNT and SUM expressions as follows order _num number price 1001 1 250 00 1002 2 1200 00 1003 3 959 00 1004 4 1416 00 1005 4 562 00 1006 5 448 00 1007 5 1696 00 1008 2 940 00 1015 1 450 00 1016 4 654 00 1017 3 584 00 1018 5 1131 00 1019 1 1499 97 1020 2 438 00 1021 4 1614 00 1022 3 232 00 1023 6 824 00 The SELECT statement collected the rows of the items table into g
361. ommand Script Your operating system probably supports automatic execution of command scripts In most operating environments DB Access and IBM Informix SQL the interactive SQL tools accept commands and SQL statements to execute from the command line You can combine these two features to automate privilege maintenance The details depend on your operating system and the version of DB Access or IBM Informix SQL that you are using In essence you want to create a com mand script that performs the following functions e Takes as its parameter a user id whose privileges are to be changed e Prepares a file of GRANT or REVOKE statements customized to contain that user id e Invokes DB Access or IBM Informix SQL with parameters that tell it to select the database and execute the prepared file of GRANT or REVOKE statements In this way you can reduce the change of the privilege class of a user to one or two commands Security Stored Procedures and Views 11 15 Using Stored Procedures Using Stored Procedures A stored procedure is a program written using the Informix Stored Procedure Language SPL Once you create a procedure it is stored in an executable for mat in the database It is a database object like a table so anyone with appro priate privileges on the procedure can execute it Stored procedures add value to the simple SQL code that they contain Once written they are simple to execute They are also very efficient sin
362. on began Databases do not keep transaction logs automatically The database adminis trator must decide whether to make a database use transaction logging If this is not done transactions are not available Specifying Transactions 5 22 Modifying Data The boundaries of transactions are specified with SOL statements There are two styles for doing this In the most common style you specify the start of a multistatement transaction by executing the BEGIN WORK statement In data bases that are created with the MODE ANSI option there is no need to mark the beginning of a transaction One is always in effect you only indicate the end of each transaction Archives and Logs In both styles you specify the end of a successful transaction by executing the COMMIT WORK statement This statement tells the database server that you reached the end of a series of statements that must all succeed together The database server does whatever is necessary to make sure that all modifica tions are properly completed and committed to disk It is also possible for a program to cancel a transaction deliberately It does so by executing the ROLLBACK WORK statement This statement asks the data base server to cancel the current transaction and undo any changes For example an order entry application can use a transaction when creating a new order in the following way e Accept all data interactively e Validate and expand it e Wait for the op
363. ons is that all the components run in the same computer However you can divide the system at either of the points marked A and B in the diagram insert a layer of software and hard ware and thereby distribute the system to two or more computers The Local Area Network One configuration in which the division occurs at point A in Figure 12 1 is the local area network LAN In a LAN users have a computer that contains an operating system a database server and an application However the disks that contain the tables are attached to other computers called file servers as shown in Figure 12 2 The file servers dispense disk files on request to the other machines The LAN software makes it seem for all practical purposes that the disks of the file server are attached directly to each user s computer The Informix database engine for PC DOS and MS DOS supports this configuration The advantage of a LAN is that the database tables are held in a single place but are still accessible to all users on the network A LAN can be extended to serve more users easily and economically 12 4 Networks and Distribution Figure 12 2 Network Configurations Application Database Program Server File Application Database Program Server Configuration of a LAN The LAN configuration is at a disadvantage in performance Any data that the database server reads must pass over the network from a file server This pr
364. optimizer makes its choices By comparing the plans produced by several variations in the query you can usually deduce some of its logic However it may be best to read the explanation file accepting that this is what the optimizer does without trying too hard to see why it chooses to do it Time Costs of a Query To execute a query the database server spends most of its time in performing two types of operation reading data from disk and comparing column val ues Of the two reading data is by far the slower task This section examines where the database server spends time The next section explores the impli cations of making queries faster Activities in Memory The database server can only process data in memory It must read a row into memory before it can test it with a filter expression It must read rows from both tables before it can test a join condition The database server prepares an output row in memory by assembling the selected columns from other rows in memory Most of these activities go very quickly Depending on the computer the database server can perform hundreds or even thousands of comparisons a second As a result the time spent on in memory work is usually a small part of the whole execution time 4 20 Optimizing Your Queries Time Costs of a Query Two in memory activities can take a significant amount of time One is sort ing as described in Time Cost of a Sort on page 4 22 The other activi
365. option below the line or continue to follow the line across 6 Once you are back at the main diagram you come to the terminator Your CREATE DATABASE statement is complete Example Code Conventions 16 Introduction Examples of SQL code appear throughout this manual Except where noted the code is not specific to any single IBM Informix application development tool If only SOL statements are listed they are not delineated by semicolons To use this SQL code for a specific product you must apply the syntax rules for that product For example if you are using DB Access or IBM Informix SQL you must delineate the statements with semicolons If you are using an embedded language you must use EXEC SQL and a semicolon or other appropriate delimiters at the start and end of each statement respectively For example you might see the following example code DATABASE stores DELETE FROM customer WHERE customer_num 121 COMMIT WORK CLOSE DATABASE If you are using DB Access or IBM Informix SQL add semicolons at the end of each statement If you are using IBM Informix 4GL use the code as it appears If you are using IBM Informix ESQL C add EXEC SQL or a dollar sign at Additional Documentation the beginning of each line and end each line with a semicolon For detailed directions on using SQL statements for a particular application development tool see the manual for your product Also note that dots in the exa
366. ored on magnetic disk are stored in sep arate pages either interspersed among the row and index pages in the tblspace or in a separate blobspace Each blob data item occupies a whole number of pages For each blob column let the values be as follows typage the number of whole pages required to store an item of typical size nnpart the fraction of rows in which this column has a non null value totpage typage x estrows x nnpart The values for the column occupy approximately totpage pages In the catalog table see Figure 10 6 on page 10 14 there are two blobpages Their estimates can be imagined as follows For the cat_descr column the text of a description is at most a double spaced page which is 250 words or approximately 1 500 characters so typage 1 There is a description for every entry so nnpart 1 0 Thus totpage 1 x 5 000 x 1 0 5 000 pages of data 10 18 Tuning the Model Calculating Table Sizes The cat_picture column contains line art in a computer readable form Exam ination of a few of these pictures reveals that they vary widely in size but a typical file contains about 75 000 bytes of data Thus typage 38 The market ing department estimates that they want to store a picture with one entry in four nnpart 0 25 Therefore totpage 38 x 5 000 x 0 25 47 500 pages of data After a table is built and loaded you can check the usage of blobpages with the tbcheck utility ptT option Locatin
367. oreign keys are used to join tables in fact most of the join columns referred to earlier in this book are foreign key columns Foreign key columns are flagged FK in the model tables as in this portion of Figure 8 1 Fax FaxNumber AddressCode VceNumber PK UA FK FK 926 6741 1001 926 6300 61 62 435 143 1020 null Foreign keys are noted wherever they appear in the model because their pres ence restricts your ability to delete rows from tables Before you can delete a row Safely you should delete all rows that refer to it through foreign keys Otherwise the database is in an inconsistent state some rows contain foreign key values that refer to nonexistent data When such an inconsistency occurs that is when a foreign key value in one table does not have a match in any primary key referential integrity has been violated You can always preserve referential integrity by deleting all foreign key rows before you delete the primary key to which they refer If you are imposing referential constraints on your database the database itself does not permit you to delete primary keys with matching foreign keys Nor does it permit you to add a foreign key value that does not reference an existing primary key value Using referential constraints when implementing your model is covered in Chapter 9 Step 1 Name the Entities An entity is a type of person place or thing to be recorded in the database If the data model were
368. ormix OnLine allocates the largest contiguous extent that it can Upper Limit on Extents No table should be allowed to acquire a large number of extents But it can happen and there is an upper limit on the number of extents allowed Trying to add an extent after the limit is reached causes ISAM error 136 No more extents to follow an INSERT request The upper limit depends on the page size and the table definition To learn the upper limit on extents for a particular table calculate a series of values as follows pagesize the size of a page reported by tbstat c under the head BUFFSIZE colspace 4x the number of columns in the table ixspace 12 x the number of indexes on the table ixparts 4 x the number of columns named in each index extspace pagesize colspace ixspace ixparts 84 The table can have no more than extspace 8 extents When the page size is 2 048 the customer table from the demonstration database can have no more than 234 extents as calculated in Figure 10 3 To help ensure that the limit is not exceeded IBM Informix OnLine checks the number of extents each time it creates a new one If the extent being created is the 64th or a multiple of 64 the next extent size for the table is automati cally doubled 10 10 Tuning the Model IBM Informix OnLine Disk Storage Variable Value Basis pagesize 2 048 output of tbstat colspace 40 ten columns ixspace 36 three indexes ix
369. osystems Inc in the United States and other countries Windows Windows NT and Excel are either registered trademarks or trade marks of Microsoft Corporation in the United States and or other countries UNIX is a registered trademark in the United States and other countries licensed exclusively through X Open Company Limited Other company product and service names used in this publication may be trademarks or service marks of others A 4 IBM Informix Guide to SQL Tutorial Index A Access control See Privilege Active set definition of 2 27 of a cursor 6 21 Aggregate function and GROUP BY clause 3 5 description of 2 47 in ESQL 6 12 in subquery 3 32 null value signalled 6 11 restrictions in modifiable view 11 25 Alias to assign column names in temporary table 3 12 with external tables 12 12 with self join 3 11 Alias for table name 2 70 ALL keyword beginning a subquery 3 29 ALTER INDEX statement creating clustered index 10 26 locks table 7 21 Alter privilege 11 10 ALTER TABLE statement changing column data type 9 19 LOCK MODE clause 7 22 NEXT SIZE clause 10 9 privilege for 11 10 restrictions 11 24 American National Standards Institute See ANSI AND logical operator 2 33 ANSI 1 16 ANSI compliance level Intro 21 Index 2 Index ANSI compliant database buffered logging restricted in 9 25 description of 1 17 FOR UPDATE not required in 7 16 nonstandard syntax in SQLAWARN 6 9 Repeatable Read isolation
370. ot update tables during the hours of peak use Instead they write updates to an update journal During off peak hours that journal is read and all updates are applied in a batch Page Row and Key Locks One row of a table is the smallest object that can be locked A program can lock one row or a selection of rows while other programs continue to work on other rows of the same table IBM Informix OnLine stores data in units called disk pages its disk storage methods are described in detail in Chapter 10 of this manual A disk page contains one or more rows In some cases it is better to lock a disk page than to lock individual rows on it The choice between locking by rows or locking by pages is established for a table when it is created IBM Informix OnLine supports a clause LOCK MODE to specify either page or row locking You can specify lock mode in the CREATE TABLE statement and later change it with ALTER TABLE Other IBM Informix database servers do not offer the choice they lock by page or by row whichever makes the better implementation Page and row locking are used identically Whenever IBM Informix OnLine needs to lock a row it locks either the row itself or the page it is on depending on the lock mode established for the table In certain cases the database server has to lock a row that does not exist in effect it locks the place in the table where the row would be if it did exist The database server does this by
371. other concern arises when your program uses a cursor to update or delete the last fetched row Erroneous results occur for the following reasons e Your program fetches the row e Another program updates or deletes the row e Your program updates or deletes WHERE CURRENT OF names You control concurrent events like these using the locking and isolation level features of the database server How Locks Work The IBM Informix OnLine database server supports a complex flexible set of locking features that is described in this section Other IBM Informix database servers have simpler locking systems Kinds of Locks IBM Informix OnLine supports three kinds of locks that it uses in different situations shared A shared lock reserves its object for reading only It prevents the object from changing while the lock remains More than one program can place a shared lock on the same object exclusive An exclusive lock reserves its object for the use of a single program It is used when the program intends to change the object An exclusive lock cannot be placed where any other kind of lock exists Once one has been placed no other lock can be placed on the same object promotable A promotable lock establishes the intent to update It can only be placed where no other lock exists however once it has been placed other shared locks can join it Later it can be changed to an exclusive lock Lock Scope You can apply locks to entire data
372. ou might have to do it again to make a production version after a test ver sion is satisfactory Or you might have to implement the same data model on several machines To save time and reduce the chance of errors you can put all the commands to create a database in a file and execute them automatically Capturing the Schema You can write the statements to implement your model into a file yourself However you can also have a program do it for you See the manual for your database server It documents the dbschema utility a program that examines the contents of a database and generates all the SQL statements required to re create it You can build the first version of your database interactively mak ing changes until it is exactly as you want it Then you can use dbschema to generate the SQL statements necessary to duplicate it Executing the File DB Access or IBM Informix SQL the programs you use to enter SQL state ments interactively can be driven from a file of commands The use of these products from the operating system command line is covered in the DB Access or IBM Informix SQL manuals You can start DB Access or IBM Informix SQL and have them read and execute a file of commands pre pared by you or by dbschema An Example Most IBM Informix products are delivered with a demonstration database called stores5 the one used for most of the examples in this book The stores5 database is delivered as an operating system comman
373. ou must first become fluent in that lan guage Then since the details of the process are slightly different in every lan guage you must become familiar with the manual for the IBM Informix embedded SQL ESQL product specific to that language SQL in Programs 6 3 SQL in Programs SQL in Programs You can write a program in any of several languages and mix SQL statements in among the other statements of the program just as if they were ordinary statements of that programming language The SQL statements are said to be embedded in the program and the program is said to contain embedded SQL often abbreviated ESQL IBM produces IBM Informix ESQL products for these programming lan guages ec e COBOL All ESQL products work in a similar way as shown in Figure 6 1 You write a source program in which you treat SQL statements as executable code Your source program is processed by an ESQL preprocessor a program that locates the embedded SQL statements and converts them into a series of procedure calls and special data structures a AN E oS gt SS SB ka ESQL source ESQL Source program Language Executable program preprocessor with procedure calls compiler program Figure 6 1 Overview of processing a program with embedded SQL statements 6 4 SQL in Programs The converted source program then passes through the programming lan guage compiler The compiler output becomes an executable program after it
374. ow if rowsize lt pageuse then rowsize else 4 remainder rowsize pageuse If a row is larger than a page as many full pages as possible are removed from the end of the row and stored in separate expan sion pages Let homerow be the size of the leading part which is Tuning the Model 10 13 Calculating Table Sizes kept on the home page The value homerow is simply rowsize if a row fits a page overpage if rowsize lt pageuse then 0 else floor rowsize pageuse Let overpage be the number of expansion pages needed for each row it is zero when a row fits on a page datrows min 255 floor pageuse homerow Let datrows be the number of rows or leading parts of rows that fits on one page There is an upper limit of 255 rows per page even when rows are very short datpages ceiling estrows datrows expages estrows x overpage The table requires approximately datpages expages disk pages for rows Additional pages for TEXT and BYTE columns are estimated in Estimating Blobpages on page 10 18 An estimate for the customer table is shown in Figure 10 6 Variable Estimate Basis of Estimate estrows 1 500 company business plan pagesize 2 048 output of tbstat pageuse 2 020 pagesize 28 rowsize 138 sum of 4 column data type size customer_num SERIAL 4 fname CHAR 15 15 Iname CHAR 15 15 company CHAR 20 20 address1 CHAR 20 20 address2 CHAR 20 20 city CHAR 15 15 state CHAR 2 2 zipcode CHAR 5 5
375. pages for a total of 300 Join this temporary table to vendor and put the result in another temporary table ordered by part_num SELECT pv_by_vn vendor vendor_name FROM pv _ by _ vn vendor WHERE pv_by vn vendor num vendor vendor_ num ORDER BY pv by vn part_num INTO TEMP pvvn_by pn DROP TABLE pv by vn This query reads pv_by_vn sequentially 50 pages It accesses vendor by way of its index 15 000 times but as the keys are presented in vendor_num sequence the effect is to read vendor sequentially through its index 42 pages If the vendor_name field is 32 bytes long the output table has about 95 rows per page and occupies about 160 pages These pages are written and then sorted causing 5x160 800 page reads and writes Thus this query reads or writes 892 pages in all Now join its output to part for the final result SELECT pvvn_by _pn x part part_desc FROM pvvn by pn part WHERE pvvn_by pn part_num part part_num DROP TABLE pvvn_by pn This query reads pvvn_by_pn sequentially 160 pages It accesses part by way of its index 15 000 times but again the keys are presented in part_num sequence so the result is to read part sequentially 400 pages through its index 20 pages The output is produced in sorted order By splitting the query into three steps and by substituting sorts for indexed access a query that read 50 400 pages is converted into one that reads and writes approximately 1772 pages a 30 to
376. parts 12 one column in each index extspace 1 876 2 048 40 36 12 84 limit 234 extspace 8 Figure 10 3 Values used to determine upper limit on extents Defragmenting Tables Query performance can suffer after many extents are added to a table This can only be the case when two or more large growing tables share a dbspace When tables grow at the same time their new extents and index pages are interleaved creating large gaps between the extents of any one table This sit uation is diagrammed in Figure 10 4 E tavie1 as BETIID table 3 Figure 10 4 A fragmented dbspace The figure also shows gaps of unused space perhaps created by tables that existed when extents were allocated but which have since been dropped Disorganization such as that depicted in Figure 10 4 hurts performance in two ways During sequential access to any table several long seeks must be made For nonsequential access to any table the disk might have to seek across the entire width of the dbspace It is possible to rebuild a dbspace so that tables are compact once again as shown in Figure 10 5 The relative order of the reorganized tables within the dbspace is not important all that matters is that the pages of each are together When reading a table sequen tially there are no long seeks When reading a table nonsequentially the disk arm ranges only over the space occupied by that table Tuning the Model 10 11 IBM Informix OnLine Disk Storage H
377. placing a lock on an index key value Key locks are used identically to row locks When the table uses row locking key locks are implemented as locks on imaginary rows When it uses page locking a key lock is placed on the index page that contains the key or that would con tain the key if the key existed 7 22 Programs That Modify Data Concurrency and Locking The Duration of a Lock The program controls the duration of a database lock A database lock remains until it is released by the closing of the database The duration of a table lock depends on whether the database uses transac tions If it does not that is if there is no transaction log and the COMMIT WORK statement is not used a table lock remains until it is removed by the execution of the UNLOCK TABLE statement The duration of table row and index locks depends on what SQL statements are used and on whether transactions are in use When transactions are used the end of a transaction releases all table row page and index locks This is an important point when a transaction ends all locks are released Locks While Modifying When the database server fetches a row through an update cursor it places a promotable lock on the fetched row If this succeeds the database server knows that no other program can alter that row Since a promotable lock is not exclusive other programs can continue to read the row This helps per formance because the program that fet
378. ple SELECT FROM customer WHERE zipcode 4 5 gt 50 The optimizer does not use an index to evaluate such a filter even when one exists Optimizing Your Queries 4 35 Making Queries Faster The optimizer uses an index to process a filter that tests an initial substring of an indexed column However the presence of the substring test can interfere with the use of a composite index to test both the substring column and another column A test of an initial substring can often be rewritten as a relational or BETWEEN test on the whole column and may be faster when that is done Using a Temporary Table to Speed Queries Building a temporary ordered subset of a table can sometimes speed up a query It can help to avoid multiple sort operations and can simplify the work of the optimizer in other ways Using a Temporary Table to Avoid Multiple Sorts For example suppose your application produces a series of reports on customers who have outstanding balances one report for each major postal area ordered by customer name In other words there is a series of queries each of this form using hypothetical table and column names SELECT cust name rcvbles balance other columns FROM cust rcvbles WHERE cust customer_id rcvbles customer_id AND rcvbls balance gt 0 AND cust postcode LIKE 98 _ _ ORDER BY cust name This query reads the entire cust table For every row with the right postcode the database ser
379. plication Program IBM Informix IBM Informix Database Server Client Server Product Product Application Program IBM Informix NET Product Figure 12 3 Typical configuration of IBM Informix NET products Figure 12 3 depicts two machines that contain application programs The upper one contains several applications This machine since it supports mul tiple concurrent programs must be running an operating system such as UNIX 12 6 Networks and Distribution Connecting to Data The lower machine in Figure 12 3 contains only one application It can be running PC DOS or MS DOS All of these configurations are supported by a version of IBM Informix NET Network Transparency It is important to realize that in all of these network configurations the appli cation programs are basically unchanged There is nothing special about a report form or program that works with a network database Except for one possible change discussed in the next section the use of data base server names when referring to databases it is possible to run an appli cation against a local database and later run the identical application against a database in another machine The program runs equally well in either case In fact as long as the data model is the same a program cannot tell the dif ference between a local database server and a distant one Connecting to Data When the application and its data are
380. pped 11 24 effect of changing basis 11 24 effect on performance 4 31 inserting rows in 11 27 modifying 11 25 to 11 29 null inserted in unexposed columns 11 27 privilege when accessing 11 30 privileges 11 29 to 11 32 produces duplicate rows 11 23 restrictions on use 11 24 updating duplicate rows 11 27 using CHECK OPTION 11 27 virtual column 11 26 Ww WEEKDAY function as time function 2 49 2 53 WHERE CURRENT OF keywords use in DELETE 7 7 in UPDATE 7 15 WHERE keyword Boolean expression in 2 33 comparison condition 2 27 to 2 40 date oriented functions in 2 53 enforcing data constraints 11 28 host variables in 6 12 in DELETE 5 4 to 5 6 null data tests 2 33 prevents use of index 4 32 4 35 range of values 2 30 relational operators 2 27 selecting rows 2 26 subqueries in 3 29 testing a subscript 2 39 use with NOT keyword 2 30 with OR keyword 2 31 wildcard comparisons 2 34 Wildcard comparison character class 2 37 in WHERE clause 2 34 to 2 39 WITH CHECK OPTION keywords 11 27 WITH HOLD keywords declaring a hold cursor 7 33 10 34 X X Open compliance level Intro 21 Y YEAR function as time function 2 49
381. program How much more effective will the user be if you make the pro gram faster If the answer is not much look elsewhere for a solution 4 4 Optimizing Your Queries Optimizing Techniques Considering the Total System Consider the entire system of programs computers and users within an organization You might find a better solution by changing schedules or man aging resources differently Maybe the problem operation would be faster if it were done at a different time or on a different machine or with different jobs running at the same time Or maybe not But you need to consider these possibilities before you decide your best course of action Understanding the Application Learn all about the application as a whole A database application usually has many parts such as saved queries screen forms report specifications and programs Consider them together with the user s procedures and ask yourself the following questions e What is being done You may identify excess or redundant steps that can be eliminated Even if every step or action is important it will help you to know them all and their sequence of use e Why is it being done Especially in older applications you may find steps that serve no pur pose for example an operation might have been put in long ago for debugging and never removed e For whom is it being done Make sure that all output from the application is wanted and used by someone Yo
382. programs conforming to IBM s application programming interfaces Notices A 3 Trademarks Each copy or any portion of these sample programs or any derivative work must include a copyright notice as follows your company name year Portions of this code are derived from IBM Corp Sample Programs Copyright IBM Corp enter the year or years All rights reserved If you are viewing this information softcopy the photographs and color illus trations may not appear Trademarks AIX DB2 DB2 Universal Database Distributed Relational Database Architecture NUMA Q OS 2 OS 390 and OS 400 IBM Informix C ISAM Foundation 2000 IBM Informix 4GL IBM Informix DataBlade Module Client SDK Cloudscape Cloudsync IBM Informix Connect IBM Informix Driver for JDBC Dynamic Connect IBM Informix Dynamic Scalable Architecture DSA IBM Informix Dynamic Server IBM Informix Enterprise Gateway Manager Enterprise Gateway Manager IBM Informix Extended Parallel Server i Financial Services J Foundation MaxConnect Object Translator Red Brick Decision Server IBM Informix SE IBM Informix SQL InformiXML RedBack SystemBuilder U2 UniData UniVerse wintegrate are trademarks or registered trademarks of International Business Machines Corporation Java and all Java based trademarks and logos are trademarks or registered trademarks of Sun Micr
383. provisions are inconsistent with local law INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION AS IS WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS OR IMPLIED INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF NON INFRINGEMENT MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE Some states do not allow disclaimer of express or implied warranties in certain transactions therefore this statement may not apply to you This information could include technical inaccuracies or typographical errors Changes are periodically made to the information herein these changes will be incorporated in new editions of the publication IBM may make improvements and or changes in the product s and or the program s described in this publication at any time without notice Any references in this information to non IBM Web sites are provided for convenience only and do not in any manner serve as an endorsement of those Web sites The materials at those Web sites are not part of the materials for this IBM product and use of those Web sites is at your own risk IBM may use or distribute any of the information you supply in any way it believes appropriate without incurring any obligation to you Licensees of this program who wish to have information about it for the purpose of enabling i the exchange of information between independently created programs and other programs including this one and ii the mutual use of the informa
384. pt an unconditional delete using the DB Access or IBM Informix SQL menu options you are warned and asked for confirmation However an unconditional delete from within a program is performed without warning Deleting a Known Number of Rows 5 4 Modifying Data The WHERE clause in a DELETE statement has the same form as the WHERE clause in a SELECT statement You can use it to designate exactly which row or rows should be deleted For example you can delete a customer with a specific customer number DELETE FROM customer WHERE customer_num 175 In this example since the customer_num column has a unique constraint you are sure that at most one row is deleted Statements That Modify Data Deleting an Unknown Number of Rows You can also choose rows based on nonindexed columns for example DELETE FROM customer WHERE company Druid Cyclery Since the column tested does not have a unique constraint this statement might delete more than one row Druid Cyclery may have two stores both with the same name but different customer numbers You can find out how many rows might be affected by a DELETE statement by selecting the count of qualifying rows from the customer table for Druid Cyclery SELECT COUNT FROM customer WHERE company Druid Cyclery You can also select the rows and display them to be sure they are the ones you mean to delete Using a SELECT statement as a test is only an approximat
385. ptimizing Your Queries 4 9 The Query Optimizer A Join with Column Filters In the preceding example there was no difference in the amount of work that would be done by the two possible query plans The presence of a column fil ter changes things A column filter is a WHERE expression that reduces the number of rows that a table contributes to a join Here is the preceding query with a filter added SELECT C customer_num O order_num SUM items total_ price FROM customer C orders O items I WHERE C customer_num O customer_num AND O order_ num I order_num AND O paid_date IS NULL GROUP BY C customer_num O order_num The expression 0 paid_date IS NULL filters out some rows reducing the number of rows that are used from the orders table As before two query plans are possible The plan that starts by reading from orders is displayed in pseudocode in Figure 4 2 for each row in the orders table do read the row into O if O paid_date is null then for each row in the customer table do read the row into C if O customer_num C customer_num then let Sum 0 for each row in the items table do read the row into I if I order_num O order_num then let Sum Sum I total_price end if end for prepare an output row from C I and Sum end if end for end if end for Figure 4 2 One of two query plans in pseudocode Let pdnull stand for the number of rows in orders that pass the filter It is the number that the fol
386. qui joins This chapter discusses the uses of two more complex kinds of joins self joins and outer joins As described for simple joins in Chapter 2 you can define aliases for tables and assign display labels to expressions to shorten your multiple table queries You also can sort data with an ORDER BY clause and SELECT query results into a temporary table 3 10 Advanced SELECT Statements Creating Advanced Joins Self Joins A join does not always have to involve two different tables You can join a table to itself creating a self join This can be useful when you want to com pare values in a column to other values in the same column To create a self join list a table twice in the FROM clause assigning it a differ ent alias each time Use the aliases to refer to the table in the SELECT and WHERE clauses as if it were two different tables Aliases in SELECT state ments are shown in Chapter 2 of this manual and discussed in Chapter 7 of IBM Informix Guide to SQL Reference Just as in joins between tables you can use arithmetic expressions in self joins You can test for NULL values and you can ORDER BY a specified col umn in ascending or descending order SELECT x order_num x ship weight x ship date y order num y ship weight y ship date FROM orders x orders y WHERE x ship weight gt 5 y ship weight AND x ship date IS NOT NULL AND y ship date IS NOT NULL ORDER BY x ship date This SELECT statement fi
387. r 101 PRC bicycle tires 88 00 box 4 box 102 SHM bicycle brakes 220 00 case 4 sets case 102 PRC bicycle brakes 480 00 case 4 sets case 105 PRC bicycle wheels 53 00 pair pair 106 PRC bicycle stem 23 00 each each 107 PRC bicycle saddle 70 00 pair pair 108 SHM crankset 45 00 each each 109 SHM pedal binding 200 00 case 4 pairs case 110 ANZ helmet 244 00 case 4 case 110 HRO helmet 260 00 case 4 case 112 SHM 12 spd assmbld 549 00 each each 113 SHM 18 spd assmbld 685 90 each each 201 KAR golf shoes 90 00 each each 202 NKL metal woods 174 00 case 2 sets case 203 NKL irons wedge 670 00 case 2 sets case 205 NKL 3 golf balls 312 00 case 24 case 205 HRO 3 golf balls 312 00 case 24 case 301 NKL running shoes 97 00 each each 301 HRO running shoes 42 50 each each 301 PRC running shoes 75 00 each each 301 ANZ running shoes 95 00 each each 302 HRO ice pack 4 50 each each 303 KAR socks 36 00 box 24 pairs box 305 HRO first aid kit 48 00 case 4 case 306 PRC tandem adapter 160 00 each each 308 PRC twin jogger 280 00 each each 309 SHM ear drops 40 00 case 20 case 310 SHM kick board 80 00 case 10 case 310 ANZ kick board 84 00 case 12 case 311 SHM water gloves 48 00 box 4 pairs box 312 SHM racer goggles 96 00 box 12 box 312 HRO racer goggles 72 00 box 12 box 313 SHM swim cap 72 00 box 12 box 313 ANZ swim cap 60 00 box 12 box Note that there is no logical limit to the number of subqueries a SELECT state ment can have but there
388. r Only one row is locked at a time that is each time a row is fetched the lock on the previous row is released unless that row is updated in which case the lock holds until the end of the transaction Cursor Stability ensures that a row does not change while the program exam ines it This is important when the program updates some other table based on the data it reads from this row Because of Cursor Stability the program is assured that the update is based on current information It prevents the use of stale data Here is an example to illustrate this point In terms of the demonstration database Program A wants to insert a new stock item for manufacturer Hero Concurrently program B wants to delete manufacturer Hero and all stock associated with it The following sequence of events can take place 1 Program A operating under Cursor Stability fetches the Hero row of the manufact table to learn the manufacturer code This places a shared lock on the row 2 Program B issues a DELETE statement for that row Because of the lock the database server makes the program wait 3 Program A inserts a new row in the stock table using the manufacturer code it obtained from the manufact table Programs That Modify Data 7 25 Concurrency and Locking 4 Program A closes its cursor on the manufact table or reads a different row of it releasing its lock 5 Program B released from its wait completes the deletion of the row and
389. r of single quotes if you prefer You cannot mix double and single quotes variable A word in italics represents a value that you must supply The nature of the value is explained immediately following the diagram unless the variable appears in a box In that case the page number of the detailed explanation follows the variable name ADD Clause A reference in a box represents a subdiagram on the same page or another page Imagine that the subdiagram is spliced into the main diagram at this point Relational Operator see SQLR 12 Introduction A reference to SQLR in another manual represents an SQL statement or segment described in Chapter 7 Syntax Imagine that the statement or segment is spliced into the main diagram at this point Document Conventions Element Description A code in an icon is a signal warning you that this path is valid only for some products or under certain conditions The codes indicate the products or conditions that support the path The following codes are used Bam This path is valid only for IBM Informix SE This path is valid only for IBM Informix OnLine This path is valid only for IBM Informix STAR This path is valid only for IBM Informix NET This path is valid only for IBM Informix 4GL This path is valid only for IBM Informix SQL This path is valid for SQL statements in all the following embedded language products
390. r in the much less likely event that it selects only rows that have null values in the total_price column a column that should never be null the indicator variable is set and the default value is assigned e If any serious error occurs the host variable is left unchanged it contains the default value initially set At this point in the program the program mer sees no need to trap such errors and report them Retrieving Multiple Rows Here is an expansion of an earlier IBM Informix 4GL example that displays default values if it cannot find the company the user requests DEFINE cfname clname ccompany CHAR 20 DEFINE cnumbr INTEGER PROMPT Enter the customer number FOR cnumbr LET cfname unknown LET clname person LET ccompany noplace SELECT fname lname company INTO cfname clname ccompany WHERE customer num cnumbr DISPLAY cfname clname at ccompany This query does not use aggregates so if there is no row matching the user specified customer number SOLCODE is set to 100 and the host variables remain unchanged Retrieving Multiple Rows When there is any chance that a query could return more than one row the program must execute the query differently Multirow queries are handled in two stages First the program starts the query No data is returned immedi ately Then the program requests the rows of data one at a time These operations are performed using a special data object
391. r limit on the number of extents allowed This is covered in the section Upper Limit on Extents on page 10 10 Next extent sizes become important when two or more large and growing tables share a dbspace Because the extents added to the different tables are interleaved each new extent represents another long seek that must be made when reading sequentially It also extends the total distance over which the disk arm must range when reading nonsequentially Tuning the Model 10 9 IBM Informix OnLine Disk Storage There is no upper limit on extent sizes except the size of the dbspace When you know the final size of a table or confidently can predict it within 25 allocate all its space in the initial extent When tables grow steadily to unknown size assign them next extent sizes that let them share the dbspace with a small number of extents each Here is one possible approach e Decide on the ratio in which the dbspace is shared between the tables For example you might divide the dbspace among three tables in the ratio 0 4 0 2 0 3 reserving 10 for small tables and overhead e Give each table one fourth of its share of the dbspace as its initial extent e Assign each table one eighth of its share as its next extent size Monitor the growth of the tables regularly using tbcheck What happens if as the dbspace fills up there is not enough contiguous space to create an extent of the size you specified In that case IBM Inf
392. r not at all The database server guarantees that operations performed within the bounds of a transaction are either completely and per fectly committed to disk or the database is restored to the state it was in before the transaction started The transaction is not merely protection against unforeseen failures it also offers a program a way to escape when the program detects a logical error This is discussed further in Chapter 7 of this manual The Transaction Log The database server can keep a journal of each change that it makes to the database during a transaction If something happens to cancel the transac tion the database server automatically uses the data in the journal to reverse the changes This journal is called a transaction log The log is typically a disk file separate from the database The action of keeping the transaction up to date is called transaction logging When a transaction fails the database server uses the contents of the log to undo whatever modifications were made when the transaction started Many things can make a transaction fail The program that issues the SQL state ments can crash or be terminated or there might be a hardware or software failure in any other component of the system As soon as the database server discovers that the transaction failed which might only be after the com puter and the database server are restarted it returns the database to the state it was in before the transacti
393. r program is modifying data another program is reading or modifying the same data This is concurrency two or more independent uses of the same data at the same time Concurrency and Performance Concurrency is crucial to good performance in a multiprogramming system When access to the data is serialized so that only one program at a time can use it processing slows dramatically Programs That Modify Data 7 17 Concurrency and Locking Locking and Integrity Just the same unless there are controls on the use of data concurrency can lead to a variety of negative effects Programs can read obsolete data or mod ifications can be lost even though they were apparently completed The database server prevents errors of this kind by imposing a system of locks A lock is a claim or reservation that a program can place on a piece of data The database server guarantees that as long as the data is locked no other program can modify it When another program requests the data the database server either makes the program wait or turns it back with an error Locking and Performance Since a lock serializes access to one piece of data it reduces concurrency any other programs that want access to that piece of data must wait The database server can place a lock on a single row on a disk page which holds multiple rows on a whole table or on an entire database The more locks it places and the larger the objects it locks the more con
394. r to enter it or it can be read from the database The DELETE statement itself can be part of a subroutine in which case onum can be a parameter of the subroutine the subroutine can be called once or repetitively In short when you embed SQL statements in a program you can apply all the power of the host language to them You can hide the SQL under a multitude of interfaces and you can embellish its functions in a multitude of ways Calling the Database Server Executing an SQL statement is essentially calling the database server as a sub routine Information must pass from the program to the database server and information must be returned Some of this communication is done through host variables You can think of the host variables named in an SQL statement as the parameters of the proce dure call to the database server In the preceding example a host variable acts as a parameter of the WHERE clause Also as a later section shows host vari ables receive data that is returned by the database server The SOL Communications Area The database server always returns a result code and possibly other informa tion about the effect of the operation in a data structure known as the SQL Communications Area SQLCA If the database server executes an SQL state ment in a stored procedure the SQLCA of the calling application contains the values triggered by the SQL statement in the procedure The principal fields of the SQLCA are list
395. rating system commands You can automate the IBM Informix OnLine administrator commands by invoking the command line equivalents to DB Monitor Summary This chapter covered the work you must do to implement a data model Specify the domains or constraints that are used in the model and com plete the model diagram by assigning constraints to each column Use interactive SQL to create the database and the tables in it If you must create the database again write the SQL statements to do so into a script of commands for the operating system Populate the tables of the model first using interactive SOL and then by bulk operations Possibly write the bulk load operation into a command script so you can repeat it easily You can now use and test your data model If it contains very large tables or if you must protect parts of it from certain classes of users there is more work to do That is the subject of the next chapter 9 30 Implementing the Model Chapter 10 Tuning the Model Chapter Overview 3 IBM Informix OnLine Disk Storage 4 Chunks and Pages 4 Dbspaces and Blobspaces 5 Disk Mirroring 5 Databases 6 Tables and Spaces 6 Exploiting Mirroring 6 Sharing Temporary Space 6 Assigning Dedicated Hardware 7 Assigning Additional Access Arms to a Table 7 Tblspaces 8 Extents 8 Choosing Extent Sizes 9 Upper Limit on Extents 10 Defragmenting Tables 11 Calculating Table Sizes 13 Estimating Fixed Length Rows 13 Est
396. re stored directly in a database within tables You can then execute a stored procedure from DB Access or an embedded language program Chapters 6 and 7 of this manual present an overview of how SQL is used in programs Applications and Database Servers Every program that uses data from a database operates the same way Regardless of whether it is a packaged program such as IBM Informix SQL a report program compiled by ACE or a program that you wrote using IBM Informix 4GL or embedded SQL you find the same two layers in every case 1 An application that interacts with the user prepares and formats data and sets up SQL statements 2 A database server that manages the database and interprets the SQL All the applications converge on the database server and only the database server manipulates the database files on disk This concept is illustrated in Figure 1 7 Database Fundamentals 1 19 Summary DATABASE SERVER Figure 1 7 Many applications converging on one database server Summary A database contains a collection of related information but differs in a fun damental way from other methods of storing data The database contains not only the data but also a data model that defines each data item and specifies its meaning with respect to the other items and to the real world A database can be used and even modified by a number of computer users working concurrently Different users can be given differe
397. reading a page is variable and hard to predict It is a combination of the following factors Buffering The needed page might be in a page buffer already in which case the cost of access is near zero Contention If more than one application is contending for the use of the disk hardware the database server request can be delayed Optimizing Your Queries 4 23 Time Costs of a Query Seek time The slowest thing a disk does is to seek that is to move the access arm to the track holding the data Seek time depends on the speed of the disk and the location of the disk arm when the operation starts Seek time varies from zero to a large fraction of a second Latency The transfer cannot start until the beginning of the page rotates under the access arm This latency or rotational delay depends on the speed of the disk and on the position of the disk when the operation starts Latency can vary from zero to a few milliseconds The time cost of reading a page can vary from microseconds for a page ina buffer to a few milliseconds when contention is zero and the disk arm is already in position to hundreds of milliseconds The Cost of Sequential Access Disk costs are lowest when the database server reads the rows of a table in physical order When the first row on that page is requested its disk page is read Requests for subsequent rows are satisfied from the buffer until the entire page is used As a result each page is read only
398. reated before the program started That leaves only the duplicate rows Remember in the demonstration database the orders table has a unique index and cannot have duplicate rows This example deals with some other database In IBM Informix 4GL you can define a data structure like a table the structure is automatically given one element for each column in the table The ord_row structure is a buffer to hold one row of the table The code in Figure 7 5 then declares two cursors The first called dup_row returns the duplicate rows in the table Because it is only for input it can use the ORDER BY clause to impose some order on the duplicates other than the physical record order used in Figure 7 2 on page 7 7 In this example the duplicate rows are ordered by their dates the oldest one is kept but you can use any other order based on the data Programs That Modify Data 7 13 Using UPDATE The second cursor is an insert cursor It is written to take advantage of the asterisk notation of IBM Informix 4GL you can supply values for all columns simply by naming a record with an asterisk to indicate all fields The remainder of the code examines the rows returned through dup_row It inserts the first one from each group of duplicates into the new table and dis regards the rest This example uses the simplest kind of error handling Unless told otherwise an IBM Informix 4GL program automatically terminates when an error code is set
399. red here e Select privilege which is granted ona table by table basis and allows you to select rows from a table This privilege can be limited by specific columns in a table e Delete privilege which allows you to delete rows e Insert privilege which allows you to insert rows e Update privilege which allows you to update existing rows that is to change their content The people who create databases and tables often grant the Connect and Select privileges to public so that all users have them If you can query a table you have at least the Connect and Select privileges for that database and table Modifying Data 5 15 Database Privileges The other table level privileges are needed to modify data The owners of tables often withhold these privileges or grant them only to specific users As a result you may not be able to modify some tables that you can query freely Since these privileges are granted on a table by table basis you can have only Insert privileges on one table and only Update privileges on another The Update privileges can be restricted even further to specific columns in a table Chapter 11 of this manual contains a complete discussion of the granting of privileges from the standpoint of the database designer A complete list of privileges and a summary of the GRANT and REVOKE statements can be found in Chapter 7 of IBM Informix Guide to SQL Reference Displaying Table Privileges 5 16 Modifying Data
400. relational oper ator Unlike earlier examples these examples illustrate how to query on an external table in an ANSI compliant database 2 34 Simple SELECT Statements Single Table SELECT Statements An external table is a table that is not in the current database You can access only external tables that are part of an ANSI compliant database Whereas the database used previously in this chapter was the demonstration database called stores5 the FROM clause in the following examples specifies the manatee table created by the owner bubba which resides in an ANSI compliant database named syzygy For more information on defining exter nal tables see the IBM Informix Guide to SQL Reference SELECT FROM syzygy bubba manatee WHERE description helmet ORDER BY mfg _ code SELECT FROM syzygy bubba manatee WHERE description LIKE helmet ORDER BY mfg_code SELECT FROM syzygy bubba manatee WHERE description MATCHES helmet ORDER BY mfg_code Any of these SELECT statements retrieves all the rows that have the single word helmet in the description column stock _no mfg_code description unit_price unit unit _type 991 ANT helmet 222 00 case 4 case 991 BKE helmet 269 00 case 4 case 991 JSK helmet 311 00 each 4 case 991 PRM helmet 234 00 case 4 case 991 SHR helmet 245 00 case 4 case Using a Single Character Wildcard The following examples illustrate the use of a single character wildcard in a WHERE clause
401. rent Hence they cannot make a row unique from other rows If a column permits null values it cannot be part of a primary key In a diagram the primary key columns of a table are flagged with the note PK as in this table from Figure 8 1 Modem MdmNumber PK UA 416 566 7024 33 1 42 70 67 74 The note PK means primary key The note UA means user assigned That is the values in this primary key come from the real world they are not codes assigned by the system A system assigned key is flagged SA Candidate Keys Sometimes more than one column or group of columns qualifies as the pri mary key Such columns or groups are called candidate keys Choose the can didate with the fewest columns to be the primary key of the table All candidate keys are worth noting because their property of uniqueness makes them predictable in a SELECT operation When you select the columns of a candidate key you know the result can contain no duplicate rows Some times that allows you to predict how many rows are returned It always means that the result can be a table in its own right with the selected candi date key as its primary key It is optional to flag candidate key columns as CK in table diagrams Building a Data Model 8 7 Step 1 Name the Entities Foreign Keys Join Columns A foreign key is simply a column or group of columns in one table that contain values that match the primary key in another table F
402. requests of the application to it Networks and Distribution 12 9 Connecting to Data Two slashes at the start of a database file specification introduce the name of a network machine They are always forward slashes even when used in a DOS application Here is an example DATABASE avignon usr maxtel testdb The double slash at the start of the pathname tells IBM Informix NET that the database is located on a different machine in this case the machine known to the network as avignon Since a complete file specification follows IBM Informix SE must manage the database IBM Informix OnLine does not use the normal file system IBM Informix NET starts a database server in machine avignon and acts as a conduit between it and the application Explicit Location by Database Server Name When the complete file specification is not required you can specify the loca tion of the database in a different form as in this example DATABASE telefonen munchen The database name is telefonen it is located in the machine known to the net work as munchen You use this method to specify the location of a database when the database is managed by the IBM Informix OnLine database server You can use the same form of the statement with the CREATE DATABASE and DROP DATABASE commands However when you write an explicit location into one of these commands you limit the application to that location It must be changed to use a databa
403. retrieve data from a relational database with the SELECT statement This chapter increases the scope of what you can do with this powerful SQL statement and enables you to perform more complex database queries and data manipulation Whereas the previous chapter focused on five of the clauses in SELECT state ment syntax this chapter adds two more You can use the GROUP BY clause with aggregate functions to organize rows returned by the FROM clause You can include a HAVING clause to place conditions on the values returned by the GROUP BY clause This chapter extends the earlier discussion of joins It illustrates self joins which enable you to join a table to itself and four kinds of outer joins where you apply the keyword OUTER to treat two or more joined tables unequally It also introduces correlated and uncorrelated subqueries and their opera tional keywords shows how to combine queries with the UNION operator and defines the set operations known as union intersection and difference Examples in this chapter show how to use some or all of the SELECT state ment clauses in your queries The clauses must appear in this order SELECT clause FROM clause WHERE clause GROUP BY clause HAVING clause ORDER BY clause INTO TEMP clause a 2G ASU Re sie An additional SELECT statement clause INTO which you can use to specify program and host variables in IBM Informix 4GL and the embedded language products is described in Chapter 6 of th
404. ries faster Sometimes you also must consider making queries do less that is reducing the functions available to on line users You can look for any allowed transaction that entails scanning an entire large table any kind of summation average or management report especially if it requires a join Consider removing such transactions from on line programs Instead offer a new facility that interactively schedules an off peak job with the output returned the next day Rescheduling Modifications To the greatest extent possible schedule modifications for times when no interactive users are using the database One reason for this is that concurrent modifications must be done with all indexes in place that means they incur all the time costs noted earlier Another reason is that modifications not only lock table rows they lock index pages as well That increases the number of locks in use and the number of lock delays for all users Tuning the Model 10 33 Maximizing Concurrency The means of rescheduling modifications depend entirely on the details of your application Using an Update Journal Instead of performing updates as the data becomes available consider creat ing an update journal This is a table that contains rows that represent pending updates Its rows contain the following information e Data items to be changed in some base table with null meaning no change e Audit information that allows an erroneous update to
405. ring alterations is slightly improved CREATE DATABASE buf log db WITH BUFFERED LOG Buffered logging is best for databases that are updated frequently so that speed of updating is important but the updates can be re created from other data in the event of a crash You can use the SET LOG statement to alternate between buffered and regular logging 9 24 Implementing the Model Creating the Database e ANSI compliant logging This is the same as regular logging but the ANSI rules for transaction processing are also enforced See the discus sion of ANSI SQL in Chapter 1 CREATE DATABASE std_rules_ db WITH LOG MODE ANSI The design of ANSI SQL prohibits the use of buffered logging The IBM Informix OnLine administrator can turn transaction logging on and off later For example it can be turned off before inserting a large number of new rows Using CREATE DATABASE with Other IBM Informix Database Servers Other Informix database servers create a database as a set of one or more files managed by the operating system For example under the UNIX operating system a database is a small group of files in a directory whose name is the database name See the manual for your database server for details on how it uses files This means that the rules for database names are the same as the rules the operating system has for file names Choosing the Type of Logging Other database servers offer the following three choices of
406. ritten assuming that you can not change the data model Nevertheless the better you understand it the better you can understand the query plans chosen by the optimizer For information on data types and views see Chapters 9 and 11 of this manual respectively Studying the Query Plan Use SET EXPLAIN ON to determine the query plan being used Here are some things to look for in particular e Unexpected tables are joined A query against a view often joins more tables than you might expect e Mention of temporary files means the output is being written to a temporary table after which it is sorted The number of disk accesses is at least twice what it is if a sort were not needed e Use of a sequential access path for the second or subsequent table in a join means that the table is read in its entirety for every selected row of every table that precedes it in the plan 4 30 Optimizing Your Queries Making Queries Faster e Use of an autoindex path means the database server takes the time to construct an index as a way of avoiding multiple sequential accesses e Use of a sequential access path for the first table in a join can be wasteful when only a small fraction of its rows appear in the output Rethinking the Query Now that you understand what the query is doing look for ways to obtain the same output with less effort The following suggestions correspond to the preceding list Rewriting Joins Through Views You mi
407. rmal methods for making backup copies in your operating system There are only two special considerations for databases The first is a practical consideration a database can grow to great size It may become the largest file or set of files in the system It also can be awkward or very time consuming to make a copy of it You may need a special procedure for copying the database separate from the usual backup procedures and the job may not be done as frequently The second consideration is the special relationship between the database and the transaction log file An archive copy is an image of the database at one instant The log file contains the history of modifications that were made since one instant It is important that those two instants are identical in other words it is important to start a new transaction log file immediately upon making an archive copy of the database Then if you must restore the data base from the archive tape the transaction log contains exactly the history needed to bring it forward in time from that instant to the latest update The statement that applies a log to a restored database is ROLLFORWARD DATABASE You start a new log file by using whatever operating system com mands are needed to delete the file and re create it empty or simply to set the length of the file to zero A transaction log file can grow to extreme size If you update a row ten times there is still just one row in the database but
408. rms that reflect the meaning of the data You do not have to waste time and effort thinking about details of fields within records in a file so the chances for error are less The statements you use to modify stored data are covered in Chapter 5 of this manual 1 8 Database Fundamentals Databases What and Why Concurrent Use A database can be a common resource for many computer users Multiple users can query and modify a database simultaneously The database server the program that manages the contents of all databases ensures that the queries and modifications are done in sequence and without conflict Having concurrent users on a database provides great advantages but also introduces new problems of security and privacy Some databases are private individuals set them up for their own use Other databases contain confidential material that must be shared but only among a select group of persons Still other databases provide public access IBM Informix database software provides the means to control database use See Figure 1 4 When you design a database you can perform any of these functions e Keep the database completely private e Open its entire contents to all users or to selected users e Restrict the selection of data that some users can view In fact you can reveal entirely different selections of data to different groups of users e Allow specified users to view certain items but not modify them e A
409. roduce that report PERFORM is the module of IBM Informix SQL that generates interactive screen forms You prepare a form specification that relates display fields on the screen to columns within tables in the database PERFORM compiles this specification into a program that you can run at any time When run the form program interrogates the database to display a row or rows of data on the screen in the format you specified You can arrange the form so that the user can type in sample values and have matching rows returned from the data base the query by example feature For more information on these products refer to the manuals that come with them 1 18 Database Fundamentals The Database Software General Programming Programs that you write can incorporate SQL statements and exchange data with the database server That is you can write a program to retrieve data from the database and format it in any way you choose You also can write programs that take data from any source in any format prepare it and insert it into the database The most convenient programming language for this kind of work is IBM Informix 4GL a nonprocedural language designed expressly for writing database applications However you can also communicate with an Informix database server from programs written in C and COBOL You also can write programs called stored procedures to work with database data and objects The stored procedures that you write a
410. roups that had identical order numbers and computed the COUNT of rows in each group and the sum of the prices Note that you cannot include a column having a TEXT or BYTE data type ina GROUP BY clause To group you must be able to sort and there is no natural sort order for TEXT or BYTE data Unlike the ORDER BY clause the GROUP BY clause does not order data Include an ORDER BY clause after your GROUP BY clause if you want to sort data in a particular order or to sort on an aggregate in the select list SELECT order_num COUNT number SUM total_price price FROM items GROUP BY order _num ORDER BY price 3 6 Advanced SELECT Statements Using the GROUP BY and HAVING Clauses This query is the same as the previous one but includes an ORDER BY clause to sort the retrieved rows in ascending order of price order _num number price 1010 2 84 00 1011 T 99 00 1013 4 143 80 1022 3 232 00 1001 1 250 00 1020 2 438 00 1006 5 448 00 1015 al 450 00 1009 1 450 00 1018 5 1131 00 1002 2 1200 00 1004 4 1416 00 1014 2 1440 00 1019 1 1499 97 1021 4 1614 00 1007 5 1696 00 As stated in the preceding chapter you can use an integer in an ORDER BY clause to indicate the position of a column in the select list You also can use an integer in a GROUP BY clause to indicate the position of column names or display labels in the group list This SELECT statement returns the same rows as the previous query SEL
411. rs2 y po_num purch2 y ship date ship2 FROM orders x orders y WHERE x ship weight gt 5 y ship weight AND x ship date IS NOT NULL AND y ship date IS NOT NULL INTO TEMP shipping This SELECT statement which is similar to the previous one labels all col umns selected from the orders table and puts them in a temporary table called shipping If you SELECT from that table you see these rows orders1 purchl shipl orders2 purch2 ship2 004 8006 05 30 1991 011 B77897 07 03 1991 004 8006 05 30 1991 020 W2286 07 16 1991 004 8006 05 30 1991 022 W9925 07 30 1991 005 2865 06 09 1991 011 B77897 07 03 1991 005 2865 06 09 1991 020 W2286 07 16 1991 005 2865 06 09 1991 022 W9925 07 30 1991 007 278693 06 05 1991 001 B77836 06 01 1991 007 278693 06 05 1991 009 4745 06 21 1991 007 278693 06 05 1991 011 B77897 07 03 1991 007 278693 06 05 1991 015 MAOO3 07 16 1991 007 278693 06 05 1991 020 W2286 07 16 1991 007 278693 06 05 1991 022 W9925 07 30 1991 012 278701 06 29 1991 011 B77897 07 03 1991 012 278701 06 29 1991 020 W2286 07 16 1991 013 B77930 07 10 1991 011 B77897 07 03 1991 017 DM354331 07 13 1991 011 B77897 07 03 1991 018 S22942 07 13 1991 011 B77897 07 03 1991 018 S22942 07 13 1991 020 W2286 07 16 1991 019 Z55709 07 16 1991 011 B77897 07 03 1991 019 255709 07 16 1991 020 W2286 07 16 1991 019 755709 07 16 1991 022 W9925 07 30 1991 023 KF2961 07 30 1991 011 B77897 07 03 1991 3 12 Advanced SELECT Statements Creating Ad
412. rted row must provide values for all columns and the database server cannot tell how to distribute an inserted value through an expression An attempt to insert into the call_response view shown in Figure 11 9 would fail When a modifiable view contains no derived columns you can insert into it as if it were a table However the database server uses null as the value for any column that is not exposed by the view If such a column does not allow nulls an error occurs and the insert fails Using WITH CHECK OPTION It is possible to insert into a view a row that does not satisfy the conditions of the view that is a row that is not visible through the view It is also possible to update a row of a view so that it no longer satisfies the conditions of the view If this is improper you can add the clause WITH CHECK OPTION when you create the view This clause asks the database server to test every inserted or updated row to ensure that it meets the conditions set by the WHERE clause of the view The database server rejects the operation with an error if the con ditions are not met Security Stored Procedures and Views 11 27 Using Views In Figure 11 9 the view named call_response was defined as follows CREATE VIEW call _ response user_id received resolved duration AS SELECT user_id call_dtime res dtime res dtime call_dtime FROM cust_calls WHERE user_id USER It is possible to update the user_id column of the view
413. rview The preceding chapter introduced the idea of putting SQL statements espe cially the SELECT statement into programs written in other languages This enables a program to retrieve rows of data from a database This chapter covers the issues that arise when a program needs to modify the database by deleting inserting or updating rows As in Chapter 6 of this manual the aim is to prepare you for reading the manual for the IBM Informix ESQL or 4GL product you are using The general use of the INSERT UPDATE and DELETE statements is covered in Chapter 5 of this manual This chapter examines their use from within a pro gram It is quite easy to put the statements in a program but it can be quite difficult to handle errors and to deal with concurrent modifications from multiple programs Using DELETE A program deletes rows from a table by executing a DELETE statement The DELETE statement can specify rows in the usual way with a WHERE clause or it can refer to a single row the last one fetched through a specified cursor Whenever you delete rows you must consider whether rows in other tables depend on the deleted rows This problem of coordinated deletions is cov ered in Chapter 5 of this manual the problem is the same when deletions are made from within a program Programs That Modify Data 7 3 Using DELETE Direct Deletions You can embed a DELETE statement in a program Here is an example using IBM Informix ESQL C
414. s Database locking is often used before applying massive changes to data during off peak hours Table Locks You can lock entire tables In some cases this is done automatically IBM Informix OnLine always locks an entire table while it performs any of the following statements ALTER INDEX ALTER TABLE CREATE INDEX DROP INDEX RENAME COLUMN RENAME TABLE The completion of the statement or end of the transaction releases the lock An entire table also can be locked automatically during certain queries as described later in this section You can use the LOCK TABLE statement to lock an entire table explicitly This statement allows you to place either a shared lock or an exclusive lock on an entire table Programs That Modify Data 7 21 Concurrency and Locking A shared table lock prevents any concurrent updating of that table while your program is reading from it IBM Informix OnLine achieves the same degree of protection by setting the isolation level as described in the next sec tion this allows greater concurrency However all IBM Informix database servers support the LOCK TABLE statement An exclusive table lock prevents any concurrent use of the table This has a serious effect on performance if many other programs are contending for the use of the table Like an exclusive database lock an exclusive table lock is often used when massive updates are applied during off peak hours For example some applications do n
415. s a choice of four isolation levels It implements them by setting different rules for how a program uses locks when it is reading You set the isolation level using the command SET ISOLATION LEVEL Not all database servers support this command so before executing it in a program test to see whether the database server supports it The simplest test is to execute the statement and either ignore the return code or test the return code and use it as an indication of which database server is in use Error code 513 displays the message Statement not available with this database engine Dirty Read Isolation The simplest isolation level Dirty Read amounts to virtually no isolation at all When a program fetches a row it places no locks and it respects none it simply copies rows from the database without regard for what other pro grams are doing A program always receives complete rows of data even under Dirty Read isolation a program never sees a row in which some columns have been updated and some not However a program using Dirty Read isolation sometimes reads updated rows before the updating program ends its trans action If the updating program later rolls back its transaction the reading program processed data that never really existed case 4 in the list of concur rency issues on page 7 19 Dirty Read is the most efficient level The reading program never waits and never makes another program wait It is the preferred lev
416. s discussed in Chapter 4 of this manual and in Chapter 7 of IBM Informix Guide to SQL Reference SELECT customer num company FROM customer WHERE customer_num NOT IN SELECT customer num FROM orders WHERE customer customer_num orders customer_num SELECT customer num company FROM customer WHERE NOT EXISTS SELECT FROM orders WHERE customer customer_num orders customer_num Both of these statements return the following 11 rows identifying customers who have not placed orders customer _ num company 102 Sports Spot 103 Phil s Sports 105 Los Altos Sports 107 Athletic Supplies 108 Quinn s Sports 109 Sport Stuff 113 Sportstown 114 Sporting Place 118 Blue Ribbon Sports 125 Total Fitness Sports 128 Phoenix University Note that the keywords EXISTS and IN are used for the set operation known as intersection and the keywords NOT EXISTS and NOT IN are used for the set operation known as difference These concepts are discussed later in this chapter The following SELECT statement identifies all the items in the stock table that have not been ordered yet by performing a subquery on the items table SELECT stock FROM stock WHERE NOT EXISTS SELECT FROM items WHERE stock stock num items stock_num AND stock manu_code items manu_code Advanced SELECT Statements 3 35 Subqueries in SELECT Statements It returns these rows stock _num manu_code description unit_price unit unit desc
417. s in the INTO clause as there are items in the select list If by accident these lists are of different lengths the data base server returns as many values as it can and sets the warning flag in the fourth field of SQLAWARN Retrieving Single Rows Data Type Conversion This example retrieves the average of a DECIMAL column which is itself a DECIMAL value However the host variable into which it is placed is not required to have that data type select avg total price into Savg price from items The declaration of the receiving variable avg_price in this example of ESQL C code is not shown It could be any one of the following definitions int avg_price double avg_price char avg _price 16 dec_t avg_price typedef of decimal number structure TE Ut Ut Ut The data type of each host variable used in a statement is noted and passed to the database server along with the statement The database server does its best to convert column data into the form used by the receiving variables Almost any conversion is allowed although some conversions cause a loss of precision The results of the preceding example differ depending on the data type of the receiving host variable as described in the following list FLOAT The database server converts the decimal result to FLOAT possibly truncating some fractional digits If the magnitude of a decimal exceeds the maximum magni tude of the FLOAT format an error
418. s like Figure 8 6 name address number number number voice fax modem name none address none number none voice number none none fax number none modem A matrix in which no entities relate to themselves Although in this model no entities relate to themselves in other models this is not always true A typical example is the employee who is the manager of another employee Another example occurs in manufacturing when a part entity is a component of another part Another decision reflected in the matrix is that there is no relationship between a fax number and a modem number In the remaining cells you write the kind of relationship that exists between the entity on the row and the entity on the column Three kinds of relation ships are possible e One to one written 1 1 in which there is never more than one entity A for one entity B and never more than one B for one A One to many written 1 n in which there is never more than one entity A but there can be several entities B related to it or vice versa Building a Data Model 8 15 Step 2 Define the Relationships e Many to many written m n in which several entities A can be related to one B and several entities B can be related to one A One to many relationships are the most common but examples of all three relationships are in the address book model As youcansee in Figure 8 6 the first unfilled
419. s odd round the size to the next full byte All possible precisions of the DATETIME data type with their sizes in bytes Implementing the Model 9 13 Defining the Domains Durations INTERVAL The INTERVAL data type stores a duration that is a length of time The dif ference between two DATETIME values is an INTERVAL that represents the span of time that separates them Here are some examples that might help to clarify the differences e Anemployee began working here on May 21 1991 either a DATE or a DATETIME e She worked here 254 days an INTERVAL the difference between the TODAY function and the starting DATE or DATETIME e She begins work each day at 0900 hours a DATETIME e She works 8 hours an INTERVAL with 45 minutes for lunch another INTERVAL e Her quitting time is 1745 hours the sum of the DATETIME when she begins work and the two INTERVALS Like DATETIME INTERVAL is a family of types with different precisions An INTERVAL can represent a count of years and months or it can represent a count of days hours minutes seconds or fractions of seconds 18 possible precisions in all The size of an INTERVAL value ranges from 2 to 8 bytes as shown in Figure 9 4 Precision Size Precision Size year p to year 1 p 2 hour p to minute 2 p 2 year p to month 2 p 2 hour p to second 3 p 2 month p to month 1 p 2 hour p to fraction f 3 ptf 2 day p to day 1 p 2 minute p to minute
420. s order_num items order_num GROUP BY orders order_num orders order_date While the join to the items table only reads three or four additional pages that might be too much time for an interactive program One solution is to add an order total column to the orders table The costs of derived data are in disk space complexity and data integrity The disk space devoted to an order total column is wasted because the same information is stored twice Also the presence of the column makes the rows of the table wider there are fewer of them in a page and querying the table becomes slower Most important any program that updates the base Tuning the Model 10 31 Denormalizing attributes must be changed to also update the derived column Inevitably there are times when the derived column is wrong when it does not contain the right derived value Derived data is not reliable data In the example of a derived order price the unreliability occurs while an order is being entered While rows are being added to the items table there are times when the order total in orders is not equal to the sum of the corresponding rows from items In general before you allow derived data to appear in the database you must define its accu racy as carefully as possible Actually you should define as closely as possi ble the conditions under which the derived column is unreliable Adding Redundant Data A correct data model avoids redundancy by ke
421. s the number of host variables given in the INTO clause to receive them After preparing an UPDATE or DELETE statement set to W when the prepared statement has no WHERE clause and so affects an entire table Set to W following execution of a statement that does not use ANSI standard SQL syntax provided that the DBANSIWARN environment variable is set Not used Not used Contains the error message Figure 6 5 The uses of SQLAWARN SQL in Programs 6 9 Calling the Database Server In particular the subscript by which you name one element of the SQLERRD and SQLAWARN arrays differs array elements are numbered starting with zero in IBM Informix ESQL C but starting with one in the other languages In this discussion the fields are named using unambiguous words like third and you must translate into the syntax of your programming language The SQLCODE Field The SQLCODE field is the primary return code of the database server After every SQL statement SQLCODE is set to an integer value as shown in Figure 6 4 When that value is zero the statement is performed without error In particular when a statement is supposed to return data into a host variable a code of zero means that the data has been returned and can be used Any nonzero code means the opposite no useful data was returned to host variables In 4GL SQLCODE is also accessible under the name STATUS End of Data The database server sets SQLCODE to 100 whe
422. s used for access e The name of a remote server preceded by a double slash IBM Informix NET queries that network site to find out which kind of database server it is and whether it can open a database of the specified name In this way it is possible to take an application written for a local database and by changing the environment variable DBPATH make it work with a database located in a different computer Distributed Data While a LAN or other network allows you to separate the application from the data the application still is limited to the contents of a single database With most database servers you only can query or modify tables in the cur rent database The IBM Informix OnLine database server allows you to query data in any database that it controls That is you can query and modify tables in data bases other than the current database as long as those other databases are managed by the same IBM Informix OnLine database server and as long as IBM Informix STAR also resides on the same machine as the OnLine database server Networks and Distribution 12 11 Distributed Data When the IBM Informix STAR product is added to IBM Informix OnLine it becomes possible to query and modify tables in databases that are managed by any IBM Informix OnLine database server anywhere in your network When the IBM Informix TP XA feature is added to IBM Informix OnLine with IBM Informix ESQL C you can create global transactio
423. s you supply or it can create a group of new rows using data selected from other tables Statements That Modify Data Single Rows In its simplest form the INSERT statement creates one new row from a list of column values and puts that row in the table Here is an example of adding a row to the stock table INSERT INTO stock VALUES 115 PRC tire pump 108 box 6 box The stock table has the following columns e stock_num a number identifying the type of merchandise e manu_code a foreign key to the manufact table e description e unit_price e unit of measure e unit_descr characterizing the unit of measure Notice that the values listed in the VALUES clause in the preceding example have a one to one correspondence with the columns of this table To write a VALUES clause you must know the columns of the tables as well as their sequence from first to last Possible Column Values The VALUES clause accepts only constant values not expressions The values you supply can include e Literal numbers e Literal datetime values e Literal interval values Quoted strings of characters e The word NULL for a null value e The word TODAY for today s date e The word CURRENT for the current date and time e The word USER for your user name e The word DBSERVERNAME or SITENAME for the name of the computer where the database server is running Some columns of a table might not allow null values If you
424. s5 database requires these steps e Insert a row in the orders table This generates an order number e For each item ordered insert a row in the items table There are two ways to program an order entry application One way is to make it completely interactive so that the program inserts the first row imme diately and then inserts each item as the operator enters data This is the wrong approach because it exposes the operation to the possibility of many more unforeseen events the customer s telephone disconnecting the opera tor hitting the wrong key the operator s terminal losing power and so on The right way to build an order entry application is as follows e Accept all the data interactively e Validate the data and expand it by looking up codes in stock and manufact for example e Display the information on the screen for inspection e Wait for the operator to make a final commitment e Perform all the insertions as fast as possible Even when this is done something unforeseen circumstance can halt the pro gram after it inserts the order but before it finishes inserting the items If that happens the database is in an unpredictable condition data integrity is compromised Modifying Data 5 21 Interrupted Modifications The Transaction The solution to all these potential problems is called the transaction A trans action is a sequence of modifications that either must be accomplished com pletely o
425. se at a different location Implicit Database Locations Quite often the database name in the command consists of nothing but an identifier giving no clue as to location This is the best way to write the DATABASE CREATE DATABASE and DROP DATABASE statements because you do not need to change the application when the database location changes When the application tries to open a database giving only a name IBM Informix NET looks at the DBPATH environment variable for informa tion 12 10 Networks and Distribution Distributed Data This environment variable lists all the locations where a database might be found When a network is not used the contents of the variable tell IBM Informix SE the file directories where a database might be found If no DBPATH variable is defined IBM Informix NET takes a default action If IBM Informix OnLine is installed on this machine it is used Otherwise the database is managed by IBM Informix SE and is located in the current direc tory When DBPATH exists IBM Informix NET consults the contents of the variable to find where the database is located Three kinds of items can be listed in DBPATH e A local directory If the named database appears there the local IBM Informix SE is used to access it e Ina UNIX system the path to a directory mounted by NFS or RFS If the named database appears there a copy of IBM Informix SE is started on the machine that owns the file system and it i
426. se rows in the stock table that have a manu_code of SHM SELECT AVG unit price FROM stock WHERE manu_code SHM This is the result avg 200 24 You can combine aggregate functions in a SELECT statement SELECT MAX ship charge MIN ship charge FROM orders 2 48 Simple SELECT Statements Single Table SELECT Statements This SELECT statement finds and displays both the highest and lowest ship_charge in the orders table max min 25 20 5 00 You can apply functions to expressions and you can supply display labels for their results SELECT MAX res_dtime call _dtime maximum MIN res_dtime call _dtime minimum AVG res_dtime call _dtime average FROM cust_calls This query finds and displays the maximum minimum and average amount of time in days hours and minutes between the reception and resolution of a customer call and labels the derived values appropriately maximum minimum average 5 20 55 0 00 01 1 02 56 SELECT SUM ship weight FROM orders WHERE ship date 07 13 1991 This SELECT statement calculates and displays the total ship_weight of orders shipped on July 13 1991 sum 130 5 Time Functions You can use the time functions DAY MDY MONTH WEEKDAY YEAR and DATE in either the SELECT clause or the WHERE clause of a query These func tions return a value that corresponds to the expressions or arguments that you use to call the function
427. select them into a temporary table and order it then insert from that temporary table Or you can apply a physical order to the table using a clustered index after all insertions are done The fourth restriction is more serious because it prevents you from naming the same table in both the INTO clause of the INSERT statement and the FROM clause of the SELECT statement This saves the database server from getting into an endless loop in which each inserted row is reselected and reinserted In some cases however you may want to do this For example suppose that you have learned that the Nikolus company supplies the same products as the Anza company but at half the price You want to add rows to the stock Statements That Modify Data table to reflect this Optimally you want to select data from all the Anza stock rows and reinsert it with the Nikolus manufacturer code However you can not select from the same table into which you are inserting There is a way around this restriction Select the data you want to insert into a temporary table Then select from that table in the INSERT statement Three statements are required to accomplish this SELECT stock num NKL temp_manu description unit _price 2 half price unit unit_descr FROM stock WHERE manu_code ANZ INTO TEMP anzrows INSERT INTO stock SELECT FROM anzrows DROP TABLE anzrows This SELECT statement takes existing rows from stock substitutes a literal val
428. ser The advantage of using transactions is that no matter what goes wrong the database is left in a known predictable state There is never a question about how much of the modification is completed either all of it is or none of it is Programs That Modify Data 7 5 Using DELETE Coordinated Deletions The usefulness of transaction logging is particularly clear when you must modify more than one table For example consider the problem of deleting an order from the demonstration database In the simplest form of the prob lem you must delete rows from two tables orders and items as shown in the IBM Informix 4GL example in Figure 7 1 WHENEVER ERROR CONTINUE do not terminate on error BEGIN WORK start transaction DELETE FROM items WHERE order num o_num IF status gt 0 THEN no error on first delete DELETE FROM orders WHERE order num o_num END IF IF status gt 0 THEN no error on either delete COMMIT WORK ELSE problem on some delete DISPLAY Error status deleting ROLLBACK WORK END IF Figure 7 1 A fragment of 4GL that deletes from two tables The logic of this program is much the same whether or not transactions are used But if they are not used the person who saw the error message has a much more difficult set of decisions to make Depending on when the error occurred the situation is as follows e No deletions were performed all rows with this order number remain in the database
429. sert Index Alter unconditional Select SU IdXar References Delete if column privilege granted A hyphen means an ungranted privilege so that a grant of all privileges is shown as su idxar while u shows a grant of only Update The code letters are normally lowercase but they are uppercase when the keywords WITH GRANT OPTION are used in the GRANT statement When an asterisk appears in the third position some column level priv ilege exists for that table and grantee The specific privilege is recorded in syscolauth Its primary key is a composite of the table number the grantor the grantee and the column number The only attribute is a three letter list showing the type of privilege s u or r Security Stored Procedures and Views 11 9 Granting Privileges For example your application might have a usage table Every time a certain program is started it inserts a row into the usage table to document that it was used Before the program terminates it updates that row to show how long it ran and perhaps to record counts of work performed by its user You want any user of the program to be able to insert and update rows in this usage table so you grant Insert and Update privileges on it to public How ever you might grant Select privilege on it to only a few Index Alter and References Privileges Index privilege permits its holder to create and alter indexes on the table Index privilege like Sel
430. solation The Repeatable Read isolation level asks the database server to put a lock on every row the program fetches The locks placed are shareable for an ordi nary cursor and promotable for an update cursor The locks are placed one at a time as rows are fetched They are not released until the cursor is closed or a transaction ends 7 26 Programs That Modify Data Concurrency and Locking Repeatable Read allows a program that uses a scroll cursor to read selected rows more than once and to be sure that they are not modified or deleted between readings scroll cursors are described in Chapter 6 of this manual No lower isolation level guarantees that rows still exist and are unchanged the second time they are read Repeatable Read isolation places the largest number of locks and holds them the longest Therefore it is the level that reduces concurrency the most If your program uses this level of isolation you must think carefully about how many locks it places how long they are held and what the effect can be on other programs In addition to the effect on concurrency the large number of locks can be a problem The database server records only a fixed number of locks for all the programs it serves If that table fills up the database server cannot place a lock and returns an error code The person who administers an IBM Informix OnLine system can monitor the lock table and tell you when it is heavily used Repeatable Read is
431. st of a Sort on page 4 22 Finally the optimizer selects a plan that appears to promise the least amount of work and passes it to the main part of the database server to be executed 4 18 Optimizing Your Queries The Query Optimizer Reading the Plan Figure 4 5 The choice the optimizer makes does not have to remain a mystery you can determine exactly what query plan it chooses Execute the statement SET EXPLAIN ON before you execute a query Beginning with the next query the optimizer writes an explanation of its query plan to a particular file the name of the file and its location depend on the operating system in use A typical explanation is shown in Figure 4 5 After repeating the query the optimizer shows its estimate of the work to be done 104 in Figure 4 5 in arbitrary units A single disk access is one unit and other actions are scaled to that This query plan was chosen over others because its estimate was the lowest SELECT C customer_num O order_ num SUM I total_price FROM customer C orders O items I WHERE C customer_num O customer_num AND O order_num I order_num GROUP BY C customer_num O order_num Estimated Cost 104 Estimated of Rows Returned 2 1 pubs o INDEX PATH 1 Index Keys order num 2 pubs c INDEX PATH 1 Index Keys customer num Key Only Lower Index Filter pubs c customer_num pubs o customer_num 3 pubs i INDEX PATH 1 Index Keys order num Lower Index Fi
432. stomer_num u customer num The addition of the keyword OUTER in front of the cust_calls table makes it the subservient table An outer join causes the query to return information on all customers whether or not they have made calls to customer service All rows from the dominant customer table are retrieved and null values are assigned to corresponding rows from the subservient cust_calls table 3 22 Advanced SELECT Statements Creating Advanced Joins customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_ descr customer_num iname company phone call _dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr customer_num iname company phone call dtime call_descr 101 Pauli All Sports Supplies 408 789 8075 102 Sadler Sports Spot 415 822 1289 103 Currie Phil s Sports 415 328 4543 104 Higgins Play Ball 415 368 1100 105 Vector Los Altos Sports 415 776 3249 106 Watson Watson amp Son 415 389 8789 1991 06 12 08 20 Order was received but two of the cans of ANZ tennis balls within the case were empty 107 Ream Athletic Supplies 415 356 9876 108 Quinn Quinn s Sports 415 544 8729 Advanced SELECT Stat
433. t You cannot use such a cursor to fetch rows of data you can only use it to insert them An example of the declara tion of an insert cursor is shown in Figure 7 3 DEFINE the company LIKE customer company the fname LIKE customer fname the_lname LIKE customer 1lname DECLARE new_custs CURSOR FOR INSERT INTO customer company fname lname VALUES the _ company the fname the_lname A 4GL fragment that declares an insert cursor When you open an insert cursor a buffer is created in memory to hold a block of rows The buffer receives rows of data as the program produces them then they are passed to the database server in a block when the buffer is full This reduces the amount of communication between the program and the data base server and it lets the database server insert the rows with less difficulty As a result the insertions go faster The minimum size of the insert buffer is set for any implementation of embedded SQL you have no control over it it is typically one or two kilo bytes The buffer is always made large enough to hold at least two rows of inserted values It is large enough to hold multiple rows when the rows are shorter than the minimum buffer size Programs That Modify Data 7 9 Using INSERT Inserting with a Cursor The code in Figure 7 3 prepares an insert cursor for use The continuation shown in Figure 7 4 shows how the cursor can be used For simplicity this example assumes that a function
434. t the following items e Any single character e The letter R e Any single character 2 36 Simple SELECT Statements Single Table SELECT Statements WHERE Clause with Restricted Single Character Wildcard SELECT FROM stock WHERE manu_code MATCHES A H ORDER BY description manu_code unit price This statement selects only those rows where the manu_code begins with A through H and returns the following rows stock_num 205 205 2 3 1 1 7 110 110 110 301 301 313 manu_code description ANZ HRO HRO HSK HRO HSK HRO ANZ HRO HSK 3 golf balls 3 golf balls baseball baseball bat baseball gloves baseball gloves basketball helmet helmet helmet running shoes running shoes swim cap tennis ball tennis racquet volleyball volleyball net watch watch 312 312 126 240 250 800 600 244 260 308 95 42 60 48 19 840 20 170 280 00 00 00 00 00 00 00 00 00 00 unit_price unit unit_descr case 24 case case 24 case case 24 case case 12 case case 10 gloves case case 10 gloves case case 24 case case 4 case case 4 case case 4 case each each each each box 12 box case 24 cans case each each case 24 case each each box 10 box box 10 box The class test A H specifies any single letter from A through H inclusive There is no equivalent wildcard symbol for the LIKE keyword Simple SELECT St
435. t handed gloves pick up wrong case memo to billing requesting 5 discount to placate customer due to second offense and lateness of resolution because of holiday Using Subscripting in a WHERE Clause You can use subscripting in the WHERE clause of a SELECT statement to specify a range of characters or numbers in a column SELECT catalog num stock_num manu_code cat_advert cat_descr FROM catalog WHERE cat_advert 1 4 High The subscript 1 4 causes the query to retrieve all rows in which the first four letters of the cat_advert column are High Simple SELECT Statements 2 39 Single Table SELECT Statements catalog num 10004 stock_num 2 manu_code HRO cat_advert Highest Quality Ball Available from Hand Stitching to the Robinson Signature cat_descr Jackie Robinson signature ball Highest professional quality used by National League catalog _num 10005 stock_num 3 manu_code HSK cat_advert High Technology Design Expands the Sweet Spot cat_descr Pro style wood Available in sizes 31 32 33 34 35 catalog_num 10008 stock_num 4 manu_code HRO cat_advert Highest Quality Football for High School and Collegiate Competitions cat_descr NFL style pigskin catalog _num 10012 stock_num 6 manu_code SMT cat_advert High Visibility Tennis Day or Night cat_descr Soft yellow color for easy visibility in sunlight or artificial light catalog _num 10043 stock_num 202 manu_code KAR cat_advert High Qualit
436. t it fetches The database server places a more demanding lock on rows that are fetched through an update cursor and a less demanding lock when fetching a row for a cursor that is not declared with that keyword This results in better perfor mance for ordinary cursors and a higher level of concurrent use in a multi processing system Levels of locks and concurrent use are discussed later in this chapter Programs That Modify Data 7 15 Using UPDATE Updating Specific Columns You can declare a cursor to update specific columns Here is a revision of the preceding example that uses this feature EXEC SQL DECLARE names CURSOR FOR SELECT fname lname company phone INTO FNAME LNAME COMPANY PHONE FROM customer FOR UPDATE OF fname lname END EXEC Only the fname and Iname columns can be updated through this cursor A statement such as the following one is rejected as an error EXEC SQL UPDATE customer SET company Siemens WHERE CURRENT OF names END EXEC If the program attempts such an update an error code is returned and no update takes place An attempt to delete using WHERE CURRENT OF is also rejected since deletion affects all columns UPDATE Keyword Not Always Needed The ANSI standard for SQL does not provide for the clause FOR UPDATE ina cursor definition When a program uses an ANSI compliant database it can update or delete using any cursor Cleaning up a Table A final hypot
437. t of the program source text they are constructed in memory during execution Program Variables and Host Variables Figure 6 2 Application programs can use program variables within SQL statements In IBM Informix 4GL and SPL you put the program variable in the SQL statement as syntax allows For example a DELETE statement can use a pro gram variable in its WHERE clause Figure 6 2 shows a program variable in IBM Informix 4GL MAIN DEFINE drop_number INT LET drop number 108 DELETE FROM items WHERE order num drop number Using a program variable in IBM Informix 4GL SQL in Programs 6 5 SQL in Programs Figure 6 3 6 6 SQL in Programs Figure 6 3 shows a program variable in SPL CREATE PROCEDURE delete item drop number INT DELETE FROM items WHERE order num drop number Using a program variable in SPL In applications that use embedded SQL statements the SOL statements can refer to the contents of program variables A program variable that is named in an embedded SQL statement is called a host variable because the SQL state ment is thought of as being a guest in the program Here is a DELETE statement as it might appear when embedded in a COBOL source program EXEC SQL DELETE FROM items WHERE order num o num END EXEC The first and last lines mark off embedded SOL from the normal COBOL state ments Between them you see an ordinary DELETE statement just as it was described
438. t value is the value inserted into a column when an explicit value is not specified A default value can be a literal character string defined by you or one of the following SQL null constant expressions USER CURRENT TODAY SITENAME Not all columns need default values but as you work with your data model you may discover instances where the use of a default value saves data entry time or prevents data entry error For example the address book model has a State column While looking at the data for this column you discover that more than 50 of the addresses list California as the state To save time you specify the string California as the default value for the State column Default values also come in handy when a column contains a flag The address book model uses a flag Y N to indicate whether a modem works at 300 1200 or 2400 baud You could specify a default value N for that col umn Then you no longer need to enter a value for those modems that do not work at certain baud rates Check Constraints Check constraints specify a condition or requirement on a data value before it can be a part of a domain You can write a constraint in natural language like the previous examples Or for greater precision you also can write a con straint in the syntax of a WHERE clause For example the following require ment constrains the values of an integer domain to a certain range Customer Number gt 50000 AND Custom
439. ta tions without actually altering the data in the database Add an INTO TEMP clause to save the altered data in a temporary table for further reference com putations or impromptu reports You cannot use TEXT or BYTE columns in arithmetic expressions SELECT stock num description unit unit descr unit price unit price 1 07 FROM stock WHERE unit price gt 400 Simple SELECT Statements 2 41 Single Table SELECT Statements This SELECT statement calculates a 7 sales tax on the unit_price column when the unit_price is 400 or higher but does not update it in the database If you are using the DB Access or IBM Informix SQL Interactive Editor the result is displayed in a column labeled expression stock _num description unit unit descr unit_price expression 1 baseball gloves case 10 gloves case 800 00 856 0000 1 baseball gloves case 10 gloves case 450 00 481 5000 4 football case 24 case 960 00 1027 2000 4 football case 24 case 480 00 513 6000 7 basketball case 24 case 600 00 642 0000 8 volleyball case 24 case 840 00 898 8000 102 bicycle brakes case 4 sets case 480 00 513 6000 111 10 spd assmbld each each 499 99 534 9893 112 12 spd assmbld each each 549 00 587 4300 113 18 spd assmbld each each 685 90 733 9130 203 irons wedge case 2 sets case 670 00 716 9000 This statement calculates a surcharge of 6 50 on orders when the quantity ordered is less than 5 SELECT item_num order n
440. table a program can execute the following command SET LOCK MODE TO NOT WAIT When the program requests a locked row it immediately receives an error code for example error 107 Record is locked and the current SQL statement terminates It is up to the program to roll back its current transac tion and try again Not waiting is the initial setting when a program starts up If you are using SQL interactively and see an error related to locking set the lock mode to wait If you are writing a program consider making that one of the first embedded SQL commands the program executes Waiting a Limited Time When you use IBM Informix OnLine you have an additional choice you can ask the database server to set an upper limit on a wait You can issue the following command SET LOCK MODE TO WAIT 17 This places an upper limit of 17 seconds on the length of any wait If a lock is not removed in that time the error code is returned 7 28 Programs That Modify Data Concurrency and Locking Handling a Deadlock A deadlock is a situation in which a pair of programs block each other s progress Each program has a lock on some object that the other program wants to access A deadlock only arises when all programs concerned set their lock modes to wait for locks IBM Informix OnLine detects deadlocks immediately when they involve only data at a single network server It prevents the deadlock from occurring by returning an
441. tables others must be usable by many programs concurrently or by programs that operate under tight requirements for response time and others must be extremely reliable You can tune your database design to meet such requirements In some cases you might have to sacrifice theoretical correctness in the data model to get the performance you need Before you make any changes however make sure that the queries are as effi cient as possible Study Chapter 4 Optimizing Your Queries to see what you can do to improve performance without changing the data model The remainder of this chapter contains discussions on the following topics e The disk storage methods used by IBM Informix OnLine and their impli cations for performance and reliability e The methods for calculating the sizes of tables and indexes and using those numbers to estimate query execution time e The benefits and costs of adding indexes e The ways you can denormalize the data model that is spoil its theoret ical purity to improve performance e Suggestions for increasing concurrency among multiple programs Tuning the Model 10 3 IBM Informix OnLine Disk Storage IBM Informix OnLine Disk Storage IBM Informix OnLine manages disk storage directly To the greatest extent possible it bypasses the host operating system and works with the raw disk space The extent to which this is possible depends on the operating system Figure 10 1 Chunks
442. tained in buffers to be read again and the requesting program is not allowed to proceed until all output to them is complete The reason is that blobspace input and output are expected to be voluminous If these pages are Tuning the Model 10 19 Managing Indexes passed through the normal buffering mechanisms they could monopolize the buffers driving out index pages and other pages useful to good performance For best performance then you should locate a TEXT or BYTE column in a blobspace in either of these circumstances e When single data items are larger than one or two pages each if kept in the dbspace their transfer dilutes the effectiveness of the page buffers When the number of pages of blob data is more than half the number of pages of row data if kept in the dbspace the table is inflated and queries against it are slowed For a table that is both relatively small and nonvolatile you can achieve the effect of a dedicated blobspace by the following means Load the entire table with rows in which the blob columns are null Create all indexes Row pages and index pages are now contiguous Update all the rows to install the blob data The blob pages follow the pages of row and index data in the tblspace Managing Indexes An index is necessary on any column or composition of columns that must be unique However as discussed in Chapter 4 the presence of an index can also allow the query optimizer to speed up a quer
443. tatement from DB Access or from an embedded SQL program To run the read_address procedure to see the full name and address of a customer named Putnam you use the following statement EXECUTE PROCEDURE read_address Putnum The following sections describe four ways to control access to data using a stored procedure Security Stored Procedures and Views 11 17 Using Stored Procedures Restricting Reads of Data The procedure in Figure 11 3 hides the SQL syntax from users but it requires that users have SELECT privilege on the customer table If you want to restrict what users can select you can write your procedure to work in the following environment e You are the DBA of the database e The users have CONNECT privilege to the database They do not have SELECT privilege on the table e Your stored procedure or set of stored procedures is created using the DBA keyword e Your stored procedure or set of stored procedures reads from the table for users If you want users only to read the name address and telephone number of a customer you can modify the procedure in Figure 11 3 as shown in Figure 11 4 CREATE DBA PROCEDURE read_customer cnum INT RETURNING CHAR 15 CHAR 15 CHAR 18 DEFINE p_lname p fname CHAR 15 DEFINE p_phone CHAR 18 SELECT fname lname phone INTO p_ fname p_lname p phone FROM customer WHERE customer_num cnum RETURN p_ fname p_lname p_phone E
444. tatement more general If you change the procedure in Figure 11 6 to record all deletions it looks like the procedure in Figure 11 6 CREATE DBA PROCEDURE delete_customer cnum INT DEFINE username CHAR 8 LET username USER DELETE FROM tbname WHERE customer _num cnum SYSTEM echo Deletion made from customer table by username gt gt hr records deletes END PROCEDURE Figure 11 7 Stored procedure to delete rows and record user Restricting Object Creation To put restraints on what and how objects are built use stored procedures within the following setting e You are the DBA of the database e All the other users have Connect privilege to the database They do not have Resource privilege e Your stored procedure or set of stored procedures is created using the DBA keyword 11 20 Security Stored Procedures and Views Using Views e Your stored procedure or set of stored procedures creates tables indexes and views however you defined them You might use such a pro cedure to set up a training database environment Your procedure might include the creation of one or more tables and associ ated indexes as shown in Figure 11 8 CREATE DBA PROCEDURE all objects CREATE TABLE learnl intone SERIAL inttwo INT NOT NULL charcol CHAR 10 CREATE INDEX learn_ix ON learnl inttwo CREATE TABLE toys name CHAR 15 NOT NULL UNIQUE description CHAR 30 on_hand INT END PROCEDURE
445. te the journal row in some way to mark it as finished Issue the COMMIT WORK command or the ROLLBACK WORK command if an error is found 10 34 Tuning the Model Maximizing Concurrency You run a different program to drop and re create the journal table only after every journal row is validated applied and marked The obvious disadvantage of an update journal is that the base tables do not reflect the most current data If it is essential that updates be instantly visible a journal scheme does not work The great advantages of reduced I O and reduced locking delays during peak hours are a powerful argument in favor of an update journal Deferred updates are accepted in many applications For example no bank promises to know your account balance more precisely than as of the close of business the preceding day and for exactly this reason the bank records transactions in a journal during the day and applies the updates overnight Isolating and Dispersing Updates If updates really must be performed interactively during peak hours you must find a different way to isolate queries from updates Splitting Tables to Isolate Volatile Columns This idea was covered in an earlier section If it is necessary to perform updates during peak hours examine the structure of the tables Can you sep arate the columns into volatile ones that are updated constantly and static ones that are rarely updated If so consider splitting the tables s
446. tead of nonsequentially These points are covered in Chapter 4 Tuning the Model 10 25 Managing Indexes In the stores5 database the orders table has an index zip_ix on the zip code column The following command causes the database server to put the rows of the customer table into descending order by zip code ALTER INDEX zip ix TO CLUSTER To cluster a table on a nonindexed column you must create an index The fol lowing command reorders the orders table by order date CREATE CLUSTERED INDEX o _date_ix ON orders order date ASC To reorder a table the database server must copy the table In the preceding example the database server reads all rows of the table and constructs an index Then it reads the index entries in sequence For each entry it reads the matching row of the table and copies it to a new table The rows of the new table are in the desired sequence This new table replaces the old table Clustering is not preserved when you alter a table When you insert new rows they are stored physically at the end of the table regardless of their con tents When you update rows and change the value of the clustering column the rows are nevertheless written back into their original location in the table When clustering is disturbed by updates it can be restored The following command reorders the table to restore the physical sequence ALTER INDEX o date_ix TO CLUSTER Reclustering is usually quic
447. tements Single Table SELECT Statements In this SELECT statement the label surcharge is defined for the column that displays the results of the operation total_price 6 50 SELECT item_num order_num quantity total price total_price 6 50 surcharge FROM items WHERE quantity lt 5 The surcharge column is labeled in the output item_num order num quantity total price surcharge 2 1013 1 36 00 42 50 3 1013 1 48 00 54 50 4 1013 2 40 00 46 50 ub 1014 d 960 00 966 50 2 1014 1 480 00 486 50 1 1015 1 450 00 456 50 1 1016 2 136 00 142 50 2 1016 3 90 00 96 50 3 1016 1 308 00 314 50 4 1016 1 120 00 126 50 ub 1017 4 150 00 156 50 2 1017 1 230 00 236 50 This SELECT statement assigns the label span to the column that displays the results of subtracting the DATETIME column call_dtime from the DATETIME column res_dtime SELECT customer _num user_id call_ code call _dtime res dtime call _dtime span FROM cust_calls ORDER BY user_id Simple SELECT Statements 2 45 Single Table SELECT Statements The span column is labeled in the output customer _num user_id call_code call dtime span 116 mannyn I 1990 12 21 11 24 5 20 55 116 mannyn I 1990 11 28 13 34 0 03 13 106 maryj D 1991 06 12 08 20 0 00 05 121 maryj O 1991 07 10 14 05 0 00 01 127 maryj F 1991 07 31 14 30 110 riche L 1991 07 07 10 24 0 00 06 119 riche B 1991 07 01 15 00 0 17 21 Sorting on Derived Columns
448. ten using IBM Informix ESQL C select avg total_price into avg_price from items where order_num in select order _num from orders where order date lt date 6 1 91 The INTO clause is the only detail that distinguishes this statement from any example in Chapter 2 or 3 This clause specifies the host variables that are to receive the data that is produced When the program executes an embedded SELECT statement the database server performs the query The example statement selects an aggregate value so that it produces exactly one row of data The row has only a single column and its value is deposited in the host variable named avg_price Subsequent lines of the program can use that variable You can use statements of this kind to retrieve single rows of data into host variables The single row can have as many columns as desired In this IBM Informix 4GL example host variables are used in two ways as receivers of data and in the WHERE clause DEFINE cfname clname ccompany CHAR 20 DEFINE cnumbr INTEGER LET cnumbr 104 SELECT fname lname company INTO cfname clname ccompany FROM customer WHERE customer_num cnumbr Since the customer_num column has a unique index implemented through a constraint this query returns only one row If a query produces more than one row of data the database server cannot return any data at all It returns an error code instead You should list as many host variable
449. ter join treats two or more joined tables unsymmetrically It makes one of the tables dominant also called preserved over the other subservient tables There are four basic types of outer joins e A simple outer join on two tables e A simple outer join to a third table e An outer join for a simple join to a third table e An outer join for an outer join to a third table These four types of outer joins are illustrated in this section See the discus sion of outer joins in Chapter 7 of IBM Informix Guide to SQL Reference for full information on their syntax use and logic In a simple join the result contains only the combinations of rows from the tables that satisfy the join conditions Rows that do not satisfy the join conditions are discarded In an outer join the result contains the combinations of rows from the tables that satisfy the join conditions Rows from the dominant table that would other wise be discarded are preserved even though no matching row was found in the sub servient table The dominant table rows that do not have a matching subservi ent table row receive a row of nulls before the selected columns are projected An outer join applies conditions to the subservient table while sequentially applying the join conditions to the rows of the dominant table The condi tions are expressed in a WHERE clause An outer join must have a SELECT clause a FROM clause and a WHERE clause You transform a simple join
450. test possible join This may be a loop join a sort merge join or a combination of the two Sort merge functionality optimizes the execution of certain queries without degrading performance where sort merge is not used A sort merge join hap pens automatically when at least one filter of the join is an equality operator The sort merge join does not change the fundamental strategy of the opti mizer Rather it provides a richer set of alternatives to nested loop joins using temporary indexes and alters the way the ORDER BY and GROUP BY paths are analyzed The path chosen by the optimizer is displayed in the output when the SET EXPLAIN ON statement is issued is described in the IBM Informix Guide to SQL Reference and in Reading the Plan on page 4 19 Optimizing Your Queries 4 13 The Query Optimizer How the Optimizer Works The optimizer in Version 4 0 and later IBM Informix database servers formu lates all possible query plans For each plan it estimates the number of table rows to be examined disk pages to be read and when the IBM Informix STAR feature is installed network accesses that the plan requires It selects the plan with the lowest estimate Selecting an Optimization Level With Version 5 0 you can specify a high or low level of database server opti mization with the SET OPTIMIZATION statement This statement is described in detail in the IBM Informix Guide to SQL Reference The default high optimization
451. th the reasons why a query takes more or less time After you understand all the features of the SELECT statement and the alternative ways of stating a query as covered in Chapters 2 and 3 you can use the tips in Chapter 4 to improve the performance of the queries that otherwise might take excessive amounts of time Database Fundamentals 1 11 Important Database Terms Essential Databases The IBM Informix OnLine database server is designed to manage large data bases with requirements for high reliability high availability and high per formance While it supports private and group databases very well it is at its best managing the databases that are essential if your organization is to carry out its work successfully IBM Informix OnLine gives its operator the ability to make archival copies while the databases are in use It also allows incremental archiving archiving only modified data an important feature when a full copy could take many reels of tape IBM Informix OnLine has an interactive monitor program by which its oper ator or any user can monitor the activities within the database server to see when bottlenecks are developing It also comes with utility programs to ana lyze its use of disk storage Chapter 10 contains an overview of the IBM Informix OnLine disk storage methods as part of the necessary background information to the main topic However all the details of using and managing IBM Informix OnLine are co
452. the cursor can be closed and reopened While the cursor is closed a dif ferent SELECT statement can be prepared under the name q_orders In this way a single cursor can be used to fetch from different SELECT statements Dynamic SQL Dynamic Host Variables In the embedded language products which support dynamically allocated data objects it is possible to take dynamic statements one step further It is possible to dynamically allocate the host variables that receive column data This makes it possible to take an arbitrary SELECT statement from program input determine how many values it produces and their data types and allo cate the host variables of the appropriate types to hold them The key to this ability is the DESCRIBE statement It takes the name of a pre pared SQL statement and returns information about the statement and its contents It sets SQLCODE to specify the type of statement that is the verb with which it begins If the prepared statement is a SELECT or an INSERT the DESCRIBE statement also returns information about the selected or inserted values to a data structure The data structure is a predefined data structure allocated for this purpose and known as a system descriptor area If you are using IBM Informix ESQL C the data structure can be an sqlda pointer structure The data structure that a DESCRIBE statement returns or references for a SELECT statement includes an array of structures Each structure describes
453. the demonstration database it could be that the ship_instruct ship_weight and ship_charge columns are queried only in one program In that case you can move them out to a companion table Division by Frequency of Update Updates take longer than queries and the updating programs lock index pages and rows of data slowing down the programs that only query If cer tain attributes of an entity are updated frequently while many others are changed only rarely or not at all and if many queries select the latter and do not need the former you can split the volatile columns to a companion table The updating programs contend for the use of that table while the query programs use the primary table Tuning the Model 10 29 Denormalizing Costs of Companion Tables Splitting a table consumes extra disk space and adds complexity There are two copies of the primary key for each row one copy in each table There are also two primary key indexes You can use the methods described in earlier sections to estimate the number of pages added You must modify existing programs reports and forms that use SELECT because fewer columns are returned Programs reports and forms that use attributes from both tables must perform a join to bring them together When you insert or delete a row two tables must be altered instead of one If you do not coordinate the alteration of the two tables by making them within a single transaction for example
454. the results that the database server returns You can use DB Access to try out all the SOL statements described in this guide Introduction 3 Organization of this Manual Organization of this Manual IBM Informix Guide to SQL Tutorial includes the following chapters 4 Introduction The Introduction tells how SQL fits into the IBM Informix family of prod ucts and books explains how to use this book introduces the demonstration database from which the product examples are drawn describes the IBM Informix Messages and Corrections product and lists the new features for Version 5 x of IBM Informix server products Chapter 1 Database Fundamentals contains an overview of database terminology and defines some important terms and ideas that are used throughout the book Chapter 2 Simple SELECT Statements begins the exploration of mak ing simple queries to fetch and display database data Chapter 3 Advanced SELECT Statements discusses making advanced queries to fetch and display database data Chapter 4 Optimizing Your Queries defines techniques to refine and optimize your queries introduces and explains the query Optimizer and discusses the time costs of various operations Chapter 5 Statements That Modify Data describes the statements you use to insert delete or update data and introduces the concepts of data base privileges maintaining data integrity and archiving data Chapter
455. the set of valid data items the column can store e It determines the kinds of operations you can perform on the data For example you cannot apply aggregate functions such as SUM to columns with a character data type e It determines how much space each data item occupies on disk This is not important for small tables but if a table has tens of thousands or hun dreds of thousands of rows the difference between a 4 byte and an 8 byte type can be crucial The decision tree shown in Figure 9 1 summarizes the choices among data types They are explained in the following sections 9 4 Implementing the Model Defining the Domains Data items purely yes numeric no Numbers all integral yes no All numbers between yes 215 and 215 1 no SMALLINT All numbers between yes 231 and 231 1 no INTEGER DECIMAL p 0 Number of fractional yes digits is fixed daa DECIMAL p s At most 8 significant yes digits no SMALLFLOAT At most 16 significant yes digits Eo FLOAT DECIMAL p Figure 9 1 A diagram of the decisions to be made in choosing a data type 1 of 2 Implementing the Model 9 5 Defining the Domains Data is chronological no Span of time or specific point in time Precise only to nearest day no INTERVAL yes DATE DATETIME Data is ASCII characters no No or little variance in item lengths no Lengths under 32 511 bytes CHA
456. ther way there is no practical difference between changes that occur while the program is run ning and changes that are saved and applied the instant the program terminates The only time that stale data can cause a problem is when the program intends to use the input data to modify the same database for example when a banking application must read an account balance change it and write it back The next chapter discusses programs that modify data SQL in Programs 6 23 Retrieving Multiple Rows Using a Cursor A Parts Explosion 6 24 SQL in Programs When you use a cursor supplemented by program logic you can solve prob lems that plain SQL cannot solve One of these is the parts explosion problem sometimes called Bill of Materials processing At the heart of this problem is a recursive relationship between objects so that one object contains other objects which contain yet others The problem is usually stated in terms of a manufacturing inventory A com pany makes a variety of parts Some parts are discrete but some are assem blages of other parts These relationships are documented in a single table which might be called contains The column contains parent holds the part numbers of parts that are assemblages The column contains child has the part number of a part that isa component of the parent If part 123400 is an assembly of nine parts there are nine rows with 123400 in the first column and other part numbers
457. thony 415 368 1100 1002 Pauli Ludwig 408 789 8075 1003 Higgins Anthony 415 368 1100 1004 Watson George 415 389 8789 1005 Parmelee Jean 415 534 8822 1006 Lawson Margaret 415 887 7235 1007 Sipes Arnold 415 245 4578 1008 Jaeger Roy 415 743 3611 1009 Keyes Frances 408 277 7245 1010 Grant Alfred 415 356 1123 For more information on external tables and external databases see Chapter 12 in this manual and Chapter 7 in IBM Informix Guide to SQL Reference You also can use synonyms as shorthand references to the long names of exter nal and current tables and views For details on how to create and use syn onyms see the CREATE SYNONYM statement in Chapter 7 of IBM Informix Guide to SQL Reference 2 72 Simple SELECT Statements Multiple Table SELECT Statements The INTO TEMP Clause By adding an INTO TEMP clause to your SELECT statement you can tempo rarily save the results of a multiple table query in a separate table that can be queried or manipulated without modifying the database Temporary tables are dropped when you end your SQL session or when your program or report terminates SELECT DISTINCT stock _num manu_name description unit _price unit_price 1 05 FROM stock manufact WHERE manufact manu_code stock manu_code INTO TEMP stockman This SELECT statement creates a temporary table called stockman and stores the results of the query in it stock num manu_name description unit_price expression 1 Hero base
458. tical correctness in the data model Before you make the change be sure it returns a reasonable savings in disk space or execution time 10 28 Tuning the Model Denormalizing Moving Strings to a Companion Table Strings less than half a page long waste disk space if you treat them as TEXT but you can remove them from the main table to a companion table The use of companion tables is the subject of the next section Splitting Wide Tables Consider all the attributes of an entity whose rows are too wide for good per formance Look for some theme or principle on which they can be divided into two groups Split the table into two a primary table and a companion table repeating the primary key in each one The shorter rows allow each table to be queried or updated more quickly Division by Bulk One principle on which you can divide an entity table is bulk move the bulky attributes which are usually character strings to the companion table Keep the numeric and other small attributes in the primary table In the demon stration database you can split the ship_instruct column from the orders table You can call the companion table orders_ship It has two columns a primary key that is a copy of orders order_num and the original ship_instruct column Division by Frequency of Use Another principle for division of an entity is frequency of use If a few attributes are rarely queried they can be moved out to a companion table In
459. time FROM manufact ORDER BY lead_time An implicit select list uses the symbol SELECT FROM manufact ORDER BY lead_time Either of the preceding statements produce the same display that is a list of every column and row in the manufact table in order of lead_time manu_code manu_name lead_time SMT Smith 3 HRO Hero 4 HSK Husky 5 ANZ Anza 5 NRG Norge 7 NKL Nikolus 8 PRC ProCycle 9 KAR Karsten 21 SHM Shimara 30 Ascending Order The retrieved data is sorted and displayed by default in ascending order Ascending order is uppercase A to lowercase z for CHARACTER data types and lowest to highest value for number data types DATE and DATETIME type data are sorted from earliest to latest and INTERVAL data is ordered from shortest to longest span of time SELECT FROM manufact ORDER BY lead_time DESC 2 14 Simple SELECT Statements Single Table SELECT Statements Descending Order The keyword DESC following a column name causes the retrieved data to be sorted in descending order manu_code manu_name lead_time SHM Shimara 30 KAR Karsten 21 PRC ProCycle 9 NKL Nikolus 8 NRG Norge 7 HSK Husky 5 ANZ Anza 5 HRO Hero 4 SMT Smith 3 You can specify any column except TEXT or BYTE in the ORDER BY clause and the database server will sort the data based on the values in that column Sorting on Multiple Columns You also can ORDER BY two or more columns creating a nested sort The default is stil
460. tion which has been exchanged should contact IBM Corporation J46A G4 555 Bailey Avenue San Jose CA 95141 1003 U S A Such information may be available subject to appropriate terms and condi tions including in some cases payment of a fee The licensed program described in this information and all licensed material available for it are provided by IBM under terms of the IBM Customer Agreement IBM International Program License Agreement or any equiv alent agreement between us IBM Informix Guide to SQL Tutorial Any performance data contained herein was determined in a controlled environment Therefore the results obtained in other operating environ ments may vary significantly Some measurements may have been made on development level systems and there is no guarantee that these measure ments will be the same on generally available systems Furthermore some measurements may have been estimated through extrapolation Actual results may vary Users of this document should verify the applicable data for their specific environment Information concerning non IBM products was obtained from the suppliers of those products their published announcements or other publicly available sources IBM has not tested those products and cannot confirm the accuracy of performance compatibility or any other claims related to non IBM products Questions on the capabilities of non IBM products should be addressed to the suppliers of those pr
461. tions of their employees Only for the manager of the Human Resources department or whoever is trusted to alter salary levels would you execute a statement such as this one GRANT UPDATE salary ON hr data to willard_b For the clerks in the Human Resources department you could execute a statement like this one GRANT UPDATE emp_key emp name hire date dept _num ON hr data TO marvin t This statement gives certain users the ability to maintain the nonsensitive col umns but denies them authorization to change performance ratings or sala ries The person in the MIS department who assigns computer user ids is the beneficiary of a statement such as this one GRANT UPDATE user_id ON hr data TO eudora_b On behalf of all users who are allowed to connect to the database but who are not authorized to see salaries or performance reviews you execute state ments such as this one to permit them to see the nonsensitive data GRANT SELECT emp_key emp_name hire date dept_num user id ON hr data TO george_b john_s Such users can perform queries such as this one SELECT COUNT FROM hr data WHERE dept_num IN 32 33 34 However any attempt to execute a query like the following one produces an error message and no data SELECT performance_level FROM hr data WHERE emp name LIKE Smythe 11 12 Security Stored Procedures and Views Granting Privileges Procedure Level Privileges You
462. torage Choosing Extent Sizes When you create a table you can specify the size of the first extent as well as the size of the extents to be added as the table grows You can change the size of added extents later with the ALTER TABLE statement The following partial example creates a table with a half megabyte initial extent and 100 kilobyte added extents CREATE TABLE big one column specifications IN big space EXTENT SIZE 512 NEXT SIZE 100 The following example changes the next extent size of the table to 50 kilo bytes This has no effect on extents that already exist ALTER TABLE big one MODIFY NEXT SIZE 50 The next extent sizes of the following kinds of tables are not very important to performance e A small table has only one extent otherwise it would not be small If it is heavily used large parts of it are buffered in memory anyway e An infrequently used table is not important to performance no matter what size it is e A table that resides in a dedicated dbspace always receives new extents that are adjacent to its old extents The size of these extents is not impor tant because being adjacent they perform like one large extent When you assign an extent size to these kinds of tables the only consider ation is to avoid creating large numbers of extents A large number of extents causes the database server to spend a small amount of extra time on book keeping Also there is an uppe
463. tored Procedures and Views Granting Privileges If you do not grant Connect privilege to public the only users who can access the database through the database server are those to whom you specifically grant the Connect privilege If only certain users should have access this is your means of providing it to them and denying it to all others Resource Privilege The Resource privilege carries the same authorization as the Connect privi lege In addition users with the Resource privilege can create new perma nent tables indexes and stored procedures thus permanently allocating disk space Database Administrator Privilege The highest level of database privilege is Database Administrator or DBA When you create a database you are automatically the administrator Hold ers of the DBA privilege can perform these functions e Execute the DROP DATABASE START DATABASE and ROLLFORWARD DATABASE commands e Alter the NEXT SIZE but no other attribute of the system catalog tables and insert delete or update rows of any system catalog table except systables Warning Although users with DBA privilege can modify the system catalog tables it is strongly recommend that you do not update delete or alter any rows in the sys tem catalog tables Modifying the system catalog tables can destroy the integrity of the database e Drop or alter any object regardless of who owns it e Create tables views and indexes to be owned by ot
464. tring 926 6300 null Telephone 0800 a NameVce NameString Attendant hours VceNumber PK FK PK FK VceNumber SPOR S A Name S AddressCode Gaius C Caesar 1 800 274 8184 011 49 89 922 030 Telephone PK UA FK NN FK FK 416 566 7024 33 1 42 70 67 74 Telephone Nite Owl BBS CompuServe Name 926 6300 null Telephone Address code True false Figure 9 6 The address book data model begun in Chapter 8 with domains added 9 22 Implementing the Model Creating the Database Creating the Database Now you are ready to create the data model as tables in a database You do this with the CREATE DATABASE CREATE TABLE and CREATE INDEX com mands The syntax of these commands is shown in detail in IBM Informix Guide to SQL Reference This section discusses the use of CREATE DATABASE and CREATE TABLE in implementing a data model The use of CREATE INDEX is covered in the next chapter You might have to create the same model more than once However the com mands that create the model can be stored and executed automatically When the tables exist you must populate them with rows of data You can do this manually with a utility program or with custom programming Using CREATE DATABASE A database is a container that holds all the parts that go into a data model These parts include th
465. ts Proceed as if no other pro grams exist If no performance problems arise you do not need to read this section again Programs That Modify Data 7 29 Concurrency and Locking Locking with Other Database Servers IBM Informix OnLine manages its own locking so that it can provide the dif ferent kinds of locks and levels of isolation described in the preceding topics Other IBM Informix database servers implement locks using the facilities of the host operating system and cannot provide the same conveniences Some host operating systems provide locking functions as operating system services In these systems database servers support the SET LOCK MODE statement Some host operating systems do not provide kernel locking facilities In these systems the database server performs its own locking based on small files that it creates in the database directory These files have the suffix lok You can tell in which kind of system your database server is running by exe cuting the SET LOCK MODE statement and testing the error code as in the fol lowing fragment of IBM Informix ESQL C code define LOCK ONLINE 1 define LOCK KERNEL 2 define LOCK FILES 3 int which locks int locktype locktype LOCK FILES set lock mode to wait 30 if sqlca sqlcode 0 locktype LOCK ONLINE else set lock mode to wait if sqlca sqlcode 0 locktype LOCK KERNEL set lock mode to not wait restore
466. ttribute used for segmenting queries should be dramati cally faster Denormalizing The drawback of splitting a table is that operations that apply to the whole table become much more complicated If a query cannot be directed to one subtable it must be written in the form of a UNION of many subqueries each on a different subtable This greatly complicates the design of reports and browsing programs Redundant and Derived Data The data model produced by the methods of Chapter 8 contains no redun dant data every attribute appears in just one table and no derived data data that can be computed from existing attributes is selected as an expression based on those attributes These features minimize the amount of disk space used and make updating the tables as easy as possible However they can force you to use joins and aggregate functions often and that may take more time than is acceptable As an alternative you can introduce new columns that contain redundant or derived data provided you understand the risks Adding Derived Data In the stores5 database there is no column in the orders table for the total price of an order The reason is that the information can be derived from the rows of the items table A program that wants to report the date and total price of order number 1009 can obtain it with the following query SELECT order date SUM total price FROM orders items WHERE orders order_ num 1009 AND order
467. ty and perfor mance are discussed in Chapters 8 through 11 in this manual This chapter covers the following topics e A general discussion of techniques for optimizing software emphasizing all the things to look at before you change any SQL statement e A description of the optimizer the part of the database server that decides how to perform a query When you know how the optimizer forms a query plan you can help it form more efficient ones e A discussion of the operations that take time during a query so you can better choose between fast and slow operations e An assortment of techniques to help the optimizer choose the fastest way to accomplish a query This chapter concentrates on SQL performance but performance problems can arise from other parts of the programs in which SQL statements are embedded Two books that address general issues of performance are The Elements of Programming Style by Kernighan and Ritchie McGraw Hill 1978 and Writing Efficient Programs by Jon Louis Bentley Prentice Hall 1982 Much of Bentley s advice can be applied to SOL statements and data base design Optimizing Your Queries 4 3 Optimizing Techniques Optimizing Techniques Before you begin optimizing your SQL statements begin considering them as part of a larger system that includes these components One or more programs The saved queries compiled screen forms and reports and programs in one or more languages in which SQL
468. ty is processing comparisons using LIKE and MATCHES especially those that test for zero or more characters at the front or in the middle of values Optimizing Your Queries 4 21 Time Costs of a Query Disk Access Management It takes much longer to read a row from disk than to examine a row in mem ory The main goal of the optimizer is to reduce the amount of data that must be read from disk but it can eliminate only the most obvious inefficiencies Time Cost of a Sort A sort requires both in memory work and disk work The in memory work is proportional to c w n log gt n where c is the number of columns being ordered and represents the costs of extracting column values from the row and concate nating them into a sort key w is proportional to the width of the combined sort key in bytes and stands for the work of copying or comparing one sort key A numeric value for w would depend strongly on the com puter hardware in use n log gt n is the number of comparisons that are made while sorting a table of n rows The disk work is proportional to 2 n m where n is again the number of rows The factor m represents the number of levels of merge the sort must use a factor that depends on the number of sort keys that can be held in memory When all the keys can be held in memory m 1 and the disk work is pro portional to 2n In other words the rows are read sorted in memory and written When building an index onl
469. u also must be sure to place each attribute in the correct table An attribute can be part of a table only if its value depends solely on the values of the primary and candidate key columns of that table To say that the value of an attribute depends on a column means that if the value in the column changes the value of the attribute must also change The attribute is a function of the column The following explanations make this more specific 8 22 Building a Data Model If the table has a one column primary key the attribute must depend on that key If the table has a composite primary key the attribute must depend on the values in all of its columns taken as a whole not on just one or some of them If the attribute also depends on other columns these must be columns of a candidate key that is columns that are unique in every row Step 3 List the Attributes When you follow these rules the tables of the model are in what E F Codd the inventor of relational databases calls third normal form When tables are not in third normal form there is either redundant data in the model or there are problems when you attempt to update the tables If you cannot find a place for an attribute that observes these rules then most likely you have made one of these errors The attribute is not well defined The attribute is derived not direct The attribute is really an entity or a relationship Some entity or relationship is missi
470. u may find output that nobody wants any more Or the out put may be needed infrequently or in a simpler format Where is the slow part Isolate as closely as possible which steps are too slow Your time is limited too you want to spend time where it yields the best results By taking the time to understand the application you can know all of its parts how they are used whether they are all essential and which parts are too slow Optimizing Your Queries 4 5 Optimizing Techniques Measuring the Application You cannot make meaningful progress on a performance problem until you have measured it You must find a way to take repeatable quantitative measurements of the slow parts of the application This is crucial for the following reasons e Without numbers you cannot accurately and specifically describe the problem to users or to the organization To convey the problem appropriately you need to determine measure ments such as The report runs in 2 hours 38 minutes or The average update takes 13 seconds but during peak hours it takes up to 49 sec onds e Without numbers you cannot set meaningful goals When you have specific measurements you can obtain agreement on numeric goals for performance e Without numbers you cannot measure and demonstrate your progress You need measurements to detect and demonstrate small improvements and to choose between alternative solutions Manual Timing You can obtain
471. u want all the columns in their defined order SELECT FROM manufact 2 12 Simple SELECT Statements Single Table SELECT Statements The two examples are equivalent and display the same results that is a list of every column and row in the manufact table The results are displayed as they would appear in the DB Access or IBM Informix SQL Interactive Editor manu_code manu_name lead_time SMT Smith 3 ANZ Anza 5 NRG Norge 7 HSK Husky 5 HRO Hero 4 SHM Shimara 30 KAR Karsten 21 NKL Nikolus 8 PRC ProCycle 9 Reordering the Columns You can change the order in which the columns are listed by changing their order in your select list SELECT manu_name manu_code lead _ time FROM manufact This select list includes the same columns as the previous one but because the columns are specified in a different order the display is different also manu_name manu _ code lead _ time Smith SMT 3 Anza ANZ 5 Norge NRG 7 Husky HSK 5 Hero HRO 4 Shimara SHM 30 Karsten KAR 21 Nikolus NKL 8 ProCycle PRC 9 Simple SELECT Statements 2 13 Single Table SELECT Statements Sorting the Rows You can direct the system to sort the data in a specific order by adding an ORDER BY clause to your SELECT statement The columns you want to use in the ORDER BY clause must be included in the select list either explicitly or implicitly An explicit select list includes all the column names SELECT manu_code manu_name lead_
472. ue Then you can work out the following three cases Count Value Indicator Case 0 1 zero rows selected gt 0 1 some rows selected all were null gt 0 0 some non null rows selected SQL in Programs 6 15 Retrieving Single Rows Serious Errors The database server rarely reports a serious problem Negative return codes occur infrequently and at unexpected times but they cannot be neglected on that account For example a query can return error 206 meaning table name is not in the database This happens if someone dropped the table since the program was written or if through some error of logic or mistake in input the program opened the wrong database Such errors can occur and the pro gram must deal with them Using Default Values 6 16 SQL in Programs There are many ways to handle these inevitable errors In some applications there are more lines of code to handle errors than for normal situations In the examples in this section however one of the simplest methods the default value should work avg price 0 set default for errors SELECT AVG total_price INTO avg_price null_flag FROM items if null_flag lt 0 probably no rows avg_price 0 set default for 0 rows This example deals with the following considerations e Ifthe query selects some non null rows the correct value is returned and used This is the expected and most frequent result e Ifthe query selects no rows o
473. ue for the manufacturer code and a computed value for the unit price These rows are then saved in a temporary table anzrows which is immedi ately inserted into the stock table When you insert multiple rows there is a risk that one of the rows contains invalid data that will cause the database server to report an error When this happens the statement terminates early Even if no error occurs there is also a very small risk that there will be a hardware or software failure while the statement is executing for example the disk might fill up In either event you cannot easily tell how many new rows were inserted If you repeat the statement in its entirety you might create duplicate rows or you might not Since the database is in an unknown state you cannot tell what to do The answer lies in using transactions as discussed under Inter rupted Modifications on page 5 21 Updating Rows You use the UPDATE statement to change the contents of one or more col umns in one or more existing rows of a table This statements takes two fun damentally different forms One lets you assign specific values to columns by name the other lets you assign a list of values that might be returned by a SELECT statement to a list of columns In either case if you are updating rows and some of the columns have data integrity constraints the data you change must be within the constraints placed on those columns For more information refer to th
474. ulating the Tables 9 29 Summary 9 30 Chapter 10 Chapter 11 Tuning the Model Chapter Overview 10 3 IBM Informix OnLine Disk Storage 10 4 Chunks and Pages 10 4 Dbspaces and Blobspaces 10 5 Disk Mirroring 10 5 Databases 10 6 Tables and Spaces 10 6 Tblspaces 10 8 Extents 10 8 Defragmenting Tables 10 11 Calculating Table Sizes 10 13 Estimating Fixed Length Rows 10 13 Estimating Variable Length Rows 10 15 Estimating Index Pages 10 16 Estimating Blobpages 10 18 Locating Blob Data 10 19 Managing Indexes 10 20 Space Costs of Indexes 10 20 Time Costs of Indexes 10 21 Choosing Indexes 10 22 Duplicate Keys Slow Index Modifications 10 23 Dropping Indexes 10 24 Clustered Indexes 10 25 Denormalizing 10 27 Shorter Rows for Faster Queries 10 27 Expelling Long Strings 10 27 Splitting Wide Tables 10 29 Splitting Tall Tables 10 30 Redundant and Derived Data 10 31 Maximizing Concurrency 10 33 Easing Contention 10 33 Rescheduling Modifications 10 33 Isolating and Dispersing Updates 10 35 Summary 10 36 Security Stored Procedures and Views Chapter Overview 11 3 Controlling Access to Databases 11 3 Securing Database Files 11 4 Securing Confidential Data 11 5 Table of Contents ix Chapter 12 Appendix A x Table of Contents Granting Privileges 11 5 Database Level Privileges 11 6 Ownership Rights 11 7 Table Level Privileges 11 8 Procedure Level Privileges 11 13 Automating Privileges 11 13 Using Stored Procedures 11 16 Creat
475. um quantity total price total price 6 50 FROM items WHERE quantity lt 5 2 42 Simple SELECT Statements Single Table SELECT Statements If you are using DB Access or IBM Informix SQL the result is displayed in a column labeled expression item_num order num quantity total_price expression 1 1001 HE 250 00 256 50 1 1002 1 960 00 966 50 2 1002 1 240 00 246 50 1 1003 1 20 00 26 50 2 1003 alt 840 00 846 50 alt 1004 1 250 00 256 50 2 1004 1 126 00 132 50 3 1004 i 240 00 246 50 4 1004 1 800 00 806 50 1 1021 2 75 00 81 50 2 1021 3 225 00 231 50 3 1021 3 690 00 696 50 4 1021 2 624 00 630 50 1 1022 1 40 00 46 50 2 1022 2 96 00 102 50 3 1022 2 96 00 102 50 1 1023 2 40 00 46 50 2 1023 2 116 00 122 50 3 1023 q 80 00 86 50 4 1023 1 228 00 234 50 5 1023 1 170 00 176 50 6 1023 1 190 00 196 50 SELECT customer_num user_id call_ code call _dtime res dtime call dtime FROM cust_calls ORDER BY user_id Simple SELECT Statements 2 43 Single Table SELECT Statements This SELECT statement calculates and displays in an expression column if you are using DB Access or IBM Informix SQL the interval between when the cus tomer call was received call_dtime and when the call was resolved res_dtime in days hours and minutes customer _num user_id call _ code call_dtime expression 116 mannyn I 1990 12 21 11 24 5 20 55 116 mannyn I 1990 11 2
476. up a demonstration application are included as well Most of the examples in this manual are based on the stores5 demonstration database The stores5 database is described in detail and its contents are listed in the IBM Informix Guide to SQL Reference The script that you use to install the demonstration database is called dbaccessdemo5 and is located in the INFORMIXDIR bin directory The database name that you supply is the name given to the demonstration data base If you do not supply a database name the name defaults to stores5 Fol low these rules for naming your database e Names for databases can be up to 10 characters long e The first character of a name must be a letter e You can use letters characters and underscores _ for the rest of the name e DB Access makes no distinction between uppercase and lowercase letters e The database name should be unique When you run dbaccessdemo5 you are as the creator of the database the owner and Database Administrator DBA of that database If you installed your IBM Informix database server product according to the installation instructions the files that make up the demonstration database are protected so that you cannot make any changes to the original database You can run the dbaccessdemo5 script again whenever you want to work with a fresh demonstration database The script prompts you when the cre ation of the database is complete and asks if you would like to cop
477. urns one value the subquery returns either one aggregate expres sion or else selects exactly one row and one column Such a subquery is equivalent to a single number or character value e If it returns a list or set of values the subquery returns either one row or one column The following keywords introduce a subquery in the WHERE clause of a SELECT statement ALL e ANY Advanced SELECT Statements 3 29 Subqueries in SELECT Statements e IN e EXISTS You can use any of the relational operators with ALL and ANY to compare something to every one of ALL or to any one of ANY the values that the subquery produces You can use the keyword SOME in place of ANY The operator IN is equivalent to ANY To create the opposite search condition use the keyword NOT or a different relational operator The EXISTS operator tests a subquery to see if it found any values at all that is it asks if the result of the subquery is not null See Chapter 7 in IBM Informix Guide to SQL Reference for the complete syntax used in creating a condition with a subquery See also Chapter 4 of this man ual for information on performance implications for correlated and uncorre lated subqueries Using ALL Use the keyword ALL preceding a subquery to determine whether a compar ison is true for every value returned If the subquery returns no values the search condition is true If it returns no values at all the condition is true of all of the
478. useful order You can add an ORDER BY clause to sort the column data in ascending order and make it easier to find that particular po_num SELECT po_num FROM orders ORDER BY po_num po_num 278693 278701 2865 4290 4745 8006 8052 9270 B77836 B77890 B77897 B77930 C3288 DM354331 KF2961 L2Z230 MA003 PC6782 Q13557 S22942 W2286 w9925 Z55709 2 22 Simple SELECT Statements Single Table SELECT Statements To select multiple columns from a table list them in the select list in the SELECT clause The order in which the columns are selected is the order in which they are produced from left to right SELECT paid_date ship date order date customer num order_num po_num FROM orders ORDER BY paid date order date customer _num As shown earlier you can use the ORDER BY clause to sort the data in ascend ing or descending order and perform nested sorts paid_date ship date order _date customer_num order num po_num 05 30 1991 05 22 199 06 004 8006 05 30 199 2 006 Q13557 06 05 1991 05 31 199 7 007 278693 06 29 1991 06 18 199 7 012 278701 07 12 1991 06 29 199 9 016 PC6782 07 13 1991 07 09 199 20 017 DM354331 06 03 1991 05 26 1991 05 21 199 o1 002 9270 06 14 1991 05 23 1991 05 22 199 04 003 B77890 06 21 1991 06 09 1991 05 24 199 6 005 2865 07 10 1991 07 03 1991 06 25 199 06 014 8052 07 21 1991 07 06 1991 06 07 199 0 008 LZ230 07 22 1991 06 01 1991 05 20 199 04 001 B77836 07 31
479. ut none of them can be supplied in the form of a host variable The syntax of these statements does not allow host variables at any point The only alternative is to assemble the parts of a statement into a character string and prepare and execute the assembled statement Program input can be incorporated into the prepared statement as characters Figure 6 9 shows a function in IBM Informix 4GL that assembles a GRANT statement from the function parameters then prepares and executes it FUNCTION table grant priv_to_grant table name user_id DEFINE priv_to_ grant char 100 table name char 20 user_id char 20 grant stmt char 200 LET grant_stmt GRANT priv_to_grant ON table name TO user_id WHENEVER ERROR CONTINUE PREPARE the_grant FROM grant_stmt IF status 0 THEN EXECUTE the_grant END IF IF status lt gt 0 THEN DISPLAY Sorry got error status attempting DISPLAY grant_stmt END IF FREE the grant WHENEVER ERROR STOP FUNCTION A 4GL function that builds prepares and executes a GRANT statement The opening statement defines the name of the function and the names of its three parameters FUNCTION table grant priv_to_grant table name user_id SQL in Programs 6 33 Embedding Data Definition 6 34 SQL in Programs The DEFINE statement defines the parameters and one additional variable local to the function All four are character strings of various lengths
480. ute when using forms in IBM Informix SQL or IBM Informix 4GL or by writing a 4GL or embedded language program to do so 2 30 Simple SELECT Statements Single Table SELECT Statements Excluding a Range of Rows SELECT fname lname company city state FROM customer WHERE zipcode NOT BETWEEN 94000 AND 94999 ORDER BY state Here by using the keywords NOT BETWEEN the condition excludes rows that have the character range 94000 through 94999 in the zipcode column fname lname company city state Fred Jewell Century Pro Shop Phoenix AZ Frank Lessor Phoenix University Phoenix AZ Eileen Neelie Neelie s Discount Sp Denver co Jason Wallack City Sports Wilmington DE Marvin Hanlon Bay Sports Jacksonville FL James Henry Total Fitness Sports Brighton MA Bob Shorter The Triathletes Club Cherry Hill NJ Cathy O Brian The Sporting Life Princeton NJ Kim Satifer Big Blue Bike Shop Blue Island NY Chris Putnum Putnum s Putters Bartlesville OK Using a WHERE Clause to Find a Subset of Values As shown earlier these examples also assume the use of an ANSI compliant database Here the owner qualifier is in quotation marks to preserve the case SELECT lname city state phone FROM Aleta customer WHERE state AZ OR state NJ ORDER BY lname SELECT lname city state phone FROM Aleta customer WHERE state IN AZ NJ ORDER BY lname Both of these statements retrieve rows that include the subset of AZ or NJ
481. values of customer_num can be looked up in an index on orders customer_num Whether an index can be used in processing an ORDER BY clause If all the columns in the clause appear in one index in the same sequence the database server can use the index to read the rows in their ordered sequence thus avoiding a sort Whether an index can be used in processing a GROUP BY clause If all the columns in the clause appear in one index in the same sequence the data base server can read groups with equal keys from the index without needing a sort 4 16 Optimizing Your Queries The Query Optimizer Filter Selectivity Assignments The following table lists some of the selectivities that the optimizer assigns to filters of differ ent types It is not an exhaustive list and other expression forms may be added in the future Expression Form indexed col literal value indexed col host variable indexed col IS NULL tab1 indexed col tab2 indexed col indexed col gt literal value indexed col lt literal value any col IS NULL any col any expression any col gt any expression any col lt any expression any col MATCHES any expression any col LIKE any expression EXISTS subquery NOT expression expr1 AND expr2 expr1 OR expr2 any col IN list any col relop ANY subquery Key Selectivity F F 1 number of distinct keys in index F 1 number of distinct keys in the larger index F 2nd max literal value
482. vanced Joins You can join a table to itself more than once The maximum number of self joins depends on the resources available to you SELECT sl manu_code s2 manu_code s3 manu_code sl stock num sl description FROM stock s1 stock s2 stock s3 WHERE sl stock_num s2 stock_num AND s2 stock_num s3 stock_num AND s1 manu_code s2 manu_code AND s2 manu_code s3 manu_code ORDER BY stock_num lt lt This self join creates a list of those items in the stock table that are supplied by three manufacturers By including the last two conditions in the WHERE clause it eliminates duplicate manufacturer codes in rows retrieved manu_code manu_code manu_code stock num description HRO HSK SMT 1 baseball gloves ANZ NRG SMT 5 tennis racquet ANZ HRO HSK 110 helmet ANZ HRO PRC 110 helmet ANZ HRO SHM 110 helmet ANZ HSK PRC 110 helmet ANZ HSK SHM 110 helmet ANZ PRC SHM 110 helmet HRO HSK PRC 110 helmet HRO HSK SHM 110 helmet HRO PRC SHM 110 helmet HSK PRC SHM 110 helmet ANZ KAR NKL 201 golf shoes ANZ HRO NKL 205 3 golf balls ANZ HRO KAR 301 running shoes HRO PRC SHM 301 running shoes KAR NKL PRC 301 running shoes KAR NKL SHM 301 running shoes KAR PRC SHM 301 running shoes NKL PRC SHM 301 running shoes Advanced SELECT Statements 3 13 Creating Advanced Joins Say you want to select rows from a payroll table to determine which employ ees earn more than their manager You can construct the
483. vendor_num ORDER BY part part_num Although it appears to be a relatively simple three table join the query takes too much time As part of your investigation you prepare a table showing the approximate sizes of the tables and their indexes in pages The table appears in Figure 4 7 Itis based ona disk page size of 4 096 bytes Only approximate numbers are used The actual number of rows changes often and only esti mated calculations are made in any case On further investigation you learn that the index on part_num is clustered so that the part table is in physical order by part_num Similarly the vendor table is in physical order by vendor_num The parven table is not in any par ticular order The sizes of these tables indicate that the odds of a successful nonsequential access from a buffered page are very poor The best query plan for this query not necessarily the one the optimizer chooses is to read the part table sequentially first then use the value of part_num to access the matching rows of parven about 1 5 of them per part and then use the value of parven vendor_num to access vendor through its index 4 38 Optimizing Your Queries Making Queries Faster Figure 4 7 Tables Row Size RowCount Rows Page Data Pages part 150 10 000 25 400 vendor 150 1 000 25 40 parven 13 15 000 300 50 Indexes Key Size Keys Page Leaf Pages part_num 4 500 20 vendor_num 4 500 2 parven composite 8 250 60 Document
484. ver searches the index on revbles customer_id and performs a nonsequential disk access for every match The rows are written to a tem porary file and sorted This procedure is acceptable if the query is done only once but this example includes a series of queries each incurring the same amount of work 4 36 Optimizing Your Queries Making Queries Faster An alternative is to select all customers with outstanding balances into a temporary table ordered by customer name like this SELECT cust name rcvbles balance other columns FROM cust rcevbles WHERE cust customer_id rcevbles customer_id AND cvbls balance gt 0 ORDER BY cust name INTO TEMP cust _with balance Now you can direct queries against the temporary table in this form SELECT FROM cust_with balance WHERE postcode LIKE 98 Each query reads the temporary table sequentially but the table has fewer rows than the primary table No nonsequential disk accesses are performed No sort is required since the physical order of the table is the desired order The total effort should be considerably less than before There is one possible disadvantage any changes made to the primary table after the temporary table has been created are not reflected in the output This is not a problem for most applications but it might be for some Substituting Sorting for Nonsequential Access Nonsequential disk access is the slowest kind The SQL language hides
485. views see Chapter 11 in this manual See the IBM Informix Guide to SQL Reference for information on the GRANT and CREATE VIEW statements 2 56 Simple SELECT Statements Single Table SELECT Statements This SELECT statement specifies the cust_calls table SELECT USER from cust_calls This SELECT statement returns the user name login account name of the user who executes the query It is repeated once for each row in the table SELECT FROM cust_calls WHERE user_id USER If the user name of the current user is richc this SELECT statement retrieves only those rows in the cust_calls table that are owned by that user customer_num 110 call dtime 1991 07 07 10 24 user_id riche call_code L call descr Order placed one month ago 6 7 not received res_dtime 1991 07 07 10 30 res descr Checked with shipping Ed Smith Order sent yesterday we were waiting for goods from ANZ Next time will call with delay if necessary customer_num 119 call dtime 1991 07 01 15 00 user_id riche call_code B call descr Bill does not reflect credit from previous order res_dtime 1991 07 02 08 21 res descr Spoke with Jane Akant in Finance She found the error and is sending new bill to customer SELECT FROM orders WHERE order_date TODAY This SELECT statement if issued when today s system date is July 10 1991 returns this one row order num 1018 order date 07 10 1991 customer _num 121 ship i
486. w into O if O customer_num C customer_num then let Sum 0 for each row in the items table do read the row into I if I order_num O order_num then let Sum Sum I total_price end if end for prepare an output row from C I and Sum end if end for end for A query plan in pseudocode This procedure reads the following rows e All rows of the customer table once e All rows of the orders table once for each row of the customer table e All rows of the items table once for each row of orders that appears in the output every row of orders should appear once This is not the only possible query plan another merely reverses the roles of customer and orders for each row of orders it reads all rows of customer looking for a matching customer_num It reads the same number of rows although in a different sequence The number of rows in each table is kept in the system catalog table named systables You can write the following query to calculate the total count of rows read by the query plan in Figure 4 1 SELECT C nrows C nrows O nrows O nrows I nrows FROM systables C systables O systables I WHERE C tabname customer AND O tabname orders AND I tabname items That is essentially how the optimizer predicts the amount of work required by this query plan The row counts in systables are only updated when the UPDATE STATISTICS command is run Thus the optimizer sometimes works from outdated information O
487. within a transaction can be rolled back at the end of it To do this reliably the database server normally applies the following rules e All cursors are closed by the ending of a transaction e All locks are released by the ending of a transaction These rules are normal with all database systems that support transactions and for most applications they do not cause any trouble However there is a program design that is possible when transactions are not used that becomes impractical when transactions are added The design is sketched in pseudocode in Figure 7 7 DECLARE master CURSOR FOR DECLARE detail CURSOR FOR FOR UPDATE OPEN master LOOP FETCH master INTO IF the fetched data is appropriate THEN BEGIN WORK OPEN detail USING data read from master FETCH detail UPDATE WHERE CURRENT OF detail COMMIT WORK END IF END LOOP CLOSE MASTER A pseudocode sketch of one common form of database application In this design one cursor is used to scan a table Selected records are used as the basis for updating a different table The problem is that when each update is treated as a separate transaction as in the sketch in Figure 7 7 the COMMIT WORK statement following the UPDATE closes all cursors includ ing the master cursor The simplest alternative is to move the COMMIT WORK and BEGIN WORK statements to be the last and first ones respectively so that the entire scan over the master table is one large trans
488. ws 12 Using the Asterisk 12 Reordering the Columns 13 Sorting the Rows 14 Selecting Specific Columns 19 Selecting Substrings 25 Using the WHERE Clause 26 Creating a Comparison Condition 27 Using Variable Text Searches 34 Using Exact Text Comparisons 34 Using a Single Character Wildcard 35 Comparing for Special Characters 39 Expressions and Derived Values 41 Arithmetic Expressions 41 Sorting on Derived Columns 46 Using Functions in SELECT Statements 47 Aggregate Functions 47 Time Functions 49 Other Functions and Keywords 55 Multiple Table SELECT Statements 60 Creating a Cartesian Product 60 Creating a Join 62 Equi Join 62 Natural Join 65 Multiple Table Join 68 Some Query Shortcuts 70 Using Aliases 70 The INTO TEMP Clause 73 Summary 74 2 2 Simple SELECT Statements Chapter Overview SELECT is the most important and the most complex SQL statement It is used along with the SQL statements INSERT UPDATE and DELETE to manipulate data You can use the SELECT statement in the following ways e By itself to retrieve data from a database e As part of an INSERT statement to produce new rows e As part of an UPDATE statement to update information The SELECT statement is the primary way to query on information in a data base It is your key to retrieving data in a program report screen form or spreadsheet This chapter shows how you can use the SELECT statement to query on and retrieve data in a variety of ways
489. xpressions are more difficult than others for the database server to process A wildcard in the initial position as in the following example find customers whose first names do not end in y forces the database server to examine every value in the column SELECT FROM customer WHERE fname NOT LIKE y The optimizer does not attempt to use an index for such a filter even when one exists It forces sequential access for the table If the table is the second or later one in a join the query is slow If a difficult test for a regular expression is essential avoid combining it with a join First process the single table applying the test for a regular expression to select the desired rows Save the result in a temporary table and join that table to the others Regular expression tests with wildcards only in the middle or at the end of the operand do not prevent the use of an index when one exists However they still can be slow to execute Depending on the data in the column you can convert some expressions to range tests using relational operators The following SELECT statement is an example SELECT FROM customer WHERE zipcode LIKE 98 You can rewrite that SELECT statement using a relational operator SELECT FROM customer WHERE zipcode gt 98000 Avoiding Noninitial Substrings A filter based on a noninitial substring of a column also requires every value in the column to be tested Here is an exam
490. y Stored Procedures and Views Chapter Overview In some databases all data is accessible to every user In others this is not the case some users are denied access to some or all of the data You can restrict access to data at these five levels 1 When the database is stored in operating system files you can sometimes use the file permission features of the operating system This level is not available when IBM Informix OnLine holds the database It manages its own disk space and the rules of the operating system do not apply 2 You can use the GRANT and REVOKE statements to give or deny access to the database or to specific tables and you can control the kinds of uses that people can make of the database 3 You can use the CREATE PROCEDURE statement to write and compile a stored procedure that controls and monitors which users can read mod ify or create database tables 4 You can use the CREATE VIEW statement to prepare a restricted or modi fied view of the data The restriction can be vertical excluding certain columns or horizontal excluding certain rows or both 5 Youcan combine GRANT and CREATE VIEW statements to achieve precise control over the parts of a table a user can modify and with what data These points are the subject of this chapter Controlling Access to Databases The normal database privilege mechanisms are based on the GRANT and REVOKE statements They are covered in the section Granting Privile
491. y Hill NJ 609 663 6079 2 Wallack Jason City Sports Wilmington DE 302 366 7511 Set Operations Intersection The intersection of two sets of rows produces a table containing rows that exist in both of the original tables Use the keyword EXISTS or IN to introduce sub queries that show the intersection of two sets Figure 3 2 illustrates the inter section set operation SELECT stock _num manu_code unit price FROM stock WHERE stock _num IN stock num SELECT stock _num FROM items E ORDER BY stock_num exists in not in stock table items table items table exists in stock table qualifies stock _num items table not in stock table Figure 3 2 The intersection set operation The following example of a nested SELECT statement shows the intersection of the stock and items tables SELECT stock num manu_code unit _price FROM stock WHERE stock _num IN SELECT stock num FROM items ORDER BY stock _num Advanced SELECT Statements 3 45 Set Operations The results contain all the elements from both sets returning the following 57 rows stock_num manu_code unit_price 1 HRO 250 00 1 HSK 800 00 1 SMT 450 00 2 HRO 126 00 3 HSK 240 00 3 SHM 280 00 4 HRO 480 00 4 HSK 960 00 5 ANZ 19 80 5 NRG 28 00 5 SMT 25 00 6 ANZ 48 00 6 SMT 36 00 7 HRO 600 00 8 ANZ 840 00 9 ANZ 20 00 101 PRC 88 00 101 SHM 68 00 103 PRC
492. y Woods Appropriate for High School Competitions or Serious Amateurs cat_descr Full set of woods designed for precision control and power performance catalog _num 10045 stock_num 204 manu_code KAR cat_advert High Quality Beginning Set of Irons Appropriate for High School Competitions cat_descr Ideally balanced for optimum control Nylon covered shaft catalog _num 10068 stock_num 310 manu_code ANZ cat_advert High Quality Kickboard cat_descr White Standard size 2 40 Simple SELECT Statements Single Table SELECT Statements Expressions and Derived Values You are not limited to selecting columns by name You can use the SELECT clause of a SELECT statement to perform computations on column data and to display information derived from the contents of one or more columns You do this by listing an expression in the select list An expression consists of a column name a constant a quoted string a key word or any combination of these connected by operators It also can include host variables program data when the SELECT statement is embedded ina program Arithmetic Expressions Figure 2 4 An arithmetic expression contains one or more arithmetic operators listed in Figure 2 4 and translates to a number Operator Operation addition E subtraction multiplication division Arithmetic operators used in arithmetic expressions Operations of this nature enable you to see the results of proposed compu
493. y change too fast to cover them in this book Refer to the manual that accompanies the IBM Informix client server product that you use Network Configurations Figure 12 1 shows a diagram of the simplest database configuration The components of the system are as follows e An application program which includes any program that issues a query Besides programs written in IBM Informix 4GL or another language with embedded SQL it includes compiled screen forms and reports e A database server that receives SQL statements from the application and returns selected rows of data to it e An operating system that manages the computer file system Some data base servers manage disk space directly e A disk device where the tables are actually stored Networks and Distribution 12 3 Network Configurations Application Database Program Server Figure 12 1 A simple database configuration Figure 12 1 describes a wide range of systems For example the operating system could be PC DOS or MS DOS the database server could be IBM Informix SE and the program could be written in IBM Informix 4GL Or with one minor change Figure 12 1 could depict either the UNIX or the NetWare operating system and the IBM Informix OnLine database server The change is the depiction of not one but several application programs running concurrently all receiving service from a corresponding database server The common theme in these configurati
494. y in several ways The opti mizer can use an index as follows e To replace repeated sequential scans of a table with nonsequential access e To avoid reading row data at all when processing expressions that name only indexed columns e To avoid a sort including building a temporary table when executing the GROUP BY and ORDER BY clauses As a result an index on the right column can save thousands tens of thou sands or in extreme cases even millions of disk operations during a query However there are costs associated with indexes Space Costs of Indexes 10 20 Tuning the Model The first cost of an index is disk space An estimating method is given in Estimating Index Pages on page 10 16 Loosely an index contains a copy of every unique data value in the indexed columns plus a 4 byte pointer for every row in the table This information can add many pages to the table space requirements it is easy to have as many index pages as row pages Managing Indexes Time Costs of Indexes The second cost of an index is time while the table is modified The descrip tions that follow assume that approximately two pages must be read to locate an index entry That is the case when the index consists of a root page one intermediate level and leaf pages and the root page is already in a buffer The index for a very large table has two intermediate levels so roughly three pages are read when an entry is looked up Presumably one
495. y index pages are written For tables from moderate to large sizes rows are sorted in batches that fit in memory and then the batches are merged When m 2 the rows are read sorted and written in batches Then the batches are read again and merged and written again resulting in disk work proportional to 4n For extremely large tables the batches must be broken into batches The disk work is then proportional to 6n In short as table size goes up there are sudden discontinuous changes in the amount of disk work in a sort from 2n to 4n to 6n The table size at which these steps occur depends on many factors only one of which key size is in your control The best way to reduce the cost of sorting is to find a way to sort fewer rows since the factor n dominates both expressions When that is not possible look for ways to sort on fewer and narrower columns Not only does this reduce the factors c and w it defers the step to the next merge level 4 22 Optimizing Your Queries Time Costs of a Query Disk Pages The database server deals with disk storage in units called pages A page is a block of fixed size The same size is used for all databases managed by one database server Indexes are also stored in page size units The size of a page depends on the database server With IBM Informix OnLine the page size is set when OnLine is initialized It is usually 2 kilo bytes 2 048 bytes but you can ask the person who installed On
496. y row that is requested Since the pages are not taken sequentially from the disk there is usually both a seek delay and a rotational delay before each page can be read In short when a table is read nonsequentially the disk access time is much higher than when it is read sequentially The Cost of Rowid Access The simplest form of nonsequential access is to select a row based on its rowid value The use of rowid in a SELECT statement is discussed in Chapter 3 The use of rowid in database design is discussed in Chapter 10 A rowid value specifies the physical location of the row and its page The database server simply reads the page incurring the costs already noted The Cost of Indexed Access There is an additional cost associated with finding a row through an index The index itself is stored on disk and its pages must be read into memory The database server uses indexes in two ways One way is to look up a row given a key value This is the kind of look up used when you join two tables as in a statement such as this SELECT company order num FROM customer orders WHERE customer customer_num orders customer_num One table probably customer is read sequentially Its value of customer_num is used to search the index on the customer_num column of orders When a match is found that row of orders is read An index look up works downward from the root page to a leaf page See The Structure of an Index on page
497. y the sam ple command files to the current directory Answer N to the prompt if you have made changes to the sample files and do not want them replaced with the original versions Answer Y to the prompt if you want to copy over the sample command files The Demonstration Database Creating the Demonstration Database on IBM Informix OnLine Use the following steps to create and populate the demonstration database in the IBM Informix OnLine environment 1 Set the INFORMIXDIR environment so that it contains the name of the directory in which your IBM Informix products are installed Set SQLEXEC to INFORMIXDIR lib sqlturbo For a full description of environment variables see the IBM Informix Guide to SQL Reference Create a new directory for the SQL command files Create the directory by entering mkdir dirname Make the new directory the current directory by entering cd dirname Create the demonstration database and copy over the sample command files by entering dbaccessdemo5 dbname The data for the database is put into the root dbspace To give someone else the SQL privileges to access the data use the GRANT and REVOKE statements The GRANT and REVOKE statements are described in the IBM Informix Guide to SQL Reference To use the command files that have been copied to your directory you must have UNIX read and execute permissions for each directory in the pathname of the directory from which you ran th
498. y those rows for which the values for the two columns are equal 2 62 Simple SELECT Statements Multiple Table SELECT Statements manu_code manu_name lead_time stock_num manu_code description unit_price unit unit descr manu_code manu_name lead_time stock_num manu_code description unit_price unit unit descr manu_code manu_name lead_time stock_num manu_code description unit _price unit unit descr manu_code manu_name lead_time stock_num manu_code description unit_price unit unit descr SMT Smith 3 1 SMT baseball gloves 450 00 case 10 gloves case SMT Smith 3 5 SMT tennis racquet 25 00 each each SMT Smith 3 6 SMT tennis ball 36 00 case 24 cans case ANZ Anza 5 5 ANZ tennis racquet 19 80 each each Note that in this equi join the output includes the manu_code column from both the manufact and stock tables because the select list requested every column Simple SELECT Statements 2 63 Multiple Table SELECT Statements You also can create an equi join with additional constraints one where the comparison condition is based on the inequality of values in the joined col umns These kinds of joins use a relational operator other than in the com parison condition specified in the WHERE clause When columns in the joined tables have the same name the columns must be preceded by the name of a specific table and a period as shown in the follow ing exampl

Download Pdf Manuals

image

Related Search

Related Contents

ISRxx Serie Bedienungsanleitung    Presentación  User Manual - Ruby Encoder  取扱説明書 - Pioneer  DCH 300  Zalman CNPS7500-AlCu LED  平成19年3月期 中間決算短信(連結)  Vannes chimie pour fluides ultra-pures (sans métal à l`extérieur)  Operating Instructions  

Copyright © All rights reserved.
Failed to retrieve file