Other Performance Considerations

Team-Fly    

 
Sams Teach Yourself SQL in 24 Hours, Third Edition
By Ronald R. Plew, Ryan K. Stephens
Table of Contents
Hour  17.  Improving Database Performance


There are other performance considerations that should be noted when tuning SQL statements. The following concepts are discussed in the next sections:

  • Using the LIKE operator and wildcards

  • Avoiding the OR operator

  • Avoiding the HAVING clause

  • Avoiding large sort operations

  • Using stored procedures

Using the LIKE Operator and Wildcards

The LIKE operator is a useful tool that is used to place conditions on a query in a flexible manner. The placement and use of wildcards in a query can eliminate many possibilities of data that should be retrieved. Wildcards are very flexible for queries that search for similar data (data that is not equivalent to an exact value specified).

Suppose you want to write a query using the EMPLOYEE_TBL selecting the EMP_ID, LAST_NAME, FIRST_NAME, and STATE columns . You need to know the employee identification, name , and state for all the employees with the last name Stevens. Three SQL statement examples with different wildcard placements serve as examples.

 QUERY1:  SELECT EMP_ID, LAST_NAME, FIRST_NAME, STATE FROM EMPLOYEE_TBL WHERE LAST_NAME LIKE '%E%'; QUERY2: SELECT EMP_ID, LAST_NAME, FIRST_NAME, STATE FROM EMPLOYEE_TBL WHERE LAST_NAME LIKE '%EVENS%'; QUERY3: SELECT EMP_ID, LAST_NAME, FIRST_NAME, STATE FROM EMPLOYEE_TBL WHERE LAST_NAME LIKE 'ST%'; 

The SQL statements do not necessarily return the same results. More than likely, QUERY1 will return more rows than the other two queries. QUERY2 and QUERY3 are more specific as to the data desired for return, thus eliminating more possibilities than QUERY1 and speeding data retrieval time. Additionally, QUERY3 is probably faster than QUERY2 because the first letters of the string for which you are searching are specified (and the column LAST_NAME is likely to be indexed). QUERY3 can take advantage of an index.

graphics/note_icon.gif

With QUERY1, you might retrieve all individuals with the last name Stevens; but can't Stevens also be spelled different ways? QUERY2 picks up all individuals with the last name Stevens and its various spellings. QUERY3 also picks up any last name starting with St; this is the only way to assure that you receive all the Stevens (Stephens).


Avoiding the OR Operator

Rewriting the SQL statement using the IN predicate instead of the OR operator consistently and substantially improves data retrieval speed. Your implementation will tell you about tools you can use to time or check the performance between the OR operator and the IN predicate. An example of how to rewrite a SQL statement by taking the OR operator out and replacing the OR operator with the IN predicate follows .

graphics/note_icon.gif

Hour 8, "Using Operators to Categorize Data," can be referenced for the use of the OR operator and the IN predicate.


The following is a query using the OR operator:

 SELECT EMP_ID, LAST_NAME, FIRST_NAME  FROM EMPLOYEE_TBL WHERE CITY = 'INDIANAPOLIS'    OR CITY = 'BROWNSBURG'    OR CITY = 'GREENFIELD'; 

The following is the same query using the IN operator:

 SELECT EMP_ID, LAST_NAME, FIRST_NAME  FROM EMPLOYEE_TBL WHERE CITY IN ('INDIANAPOLIS', 'BROWNSBURG',                'GREENFIELD'); 

The SQL statements retrieve the very same data; however, through testing and experience, you find that the data retrieval is measurably faster by replacing OR conditions with the IN, as in the second query.

Avoiding the HAVING Clause

The HAVING clause is a useful clause; however, you can't use it without cost. Using the HAVING clause causes the SQL optimizer extra work, which results in extra time. If possible, SQL statements should be written without the use of the HAVING clause.

Avoid Large Sort Operations

Large sort operations mean the use of the ORDER BY, GROUP BY, and HAVING clauses. Subsets of data must be stored in memory or to disk (if there is not enough space in allotted memory) whenever sort operations are performed. You must often sort data. The main point is that these sort operations affect a SQL statement's response time. Because large sort operations cannot always be avoided, it is best to schedule queries with large sorts as periodic batch processes during off-peak database usage so that the performance of most user processes is not affected.

Use Stored Procedures

Stored procedures should be created for SQL statements executed on a regular basisparticularly large transactions or queries. Stored procedures are simply SQL statements that are compiled and permanently stored in the database in an executable format.

graphics/newterm_icon.gif

Normally, when a SQL statement is issued in the database, the database must check the syntax and convert the statement into an executable format within the database (called parsing ). The statement, once parsed, is stored in memory; however, it is not permanent. This means that when memory is needed for other operations, the statement may be ejected from memory. In the case of stored procedures, the SQL statement is always available in an executable format and remains in the database until it is dropped like any other database object. Stored procedures are discussed in more detail in Hour 22, "Advanced SQL Topics."

Disabling Indexes During Batch Loads

When a user submits a transaction to the database (INSERT, UPDATE, or DELETE), an entry is made to both the database table and any indexes associated with the table being modified. This means that if there is an index on the EMPLOYEE table, and a user updates the EMPLOYEE table, an update also occurs to the index associated with the EMPLOYEE table. In a transactional environment, the fact that a write to an index occurs every time a write to the table occurs is usually not an issue.

During batch loads, however, an index can actually cause serious performance degradation. A batch load may consist of hundreds, thousands, or millions of manipulation statements or transactions. Because of their volume, batch loads take a long time to complete and are normally scheduled during off-peak hoursusually during weekends or evenings. To optimize performance during a batch loadwhich may equate to decreasing the time it takes the batch load to complete from 12 hours to 6 hoursit is recommended that the indexes associated with the table affected during the load are dropped. When the indexes are dropped, changes are written to the tables much faster, so the job completes faster. When the batch load is complete, the indexes should be rebuilt. During the rebuild of the indexes, the indexes will be populated with all the appropriate data from the tables. Although it may take a while for an index to be created on a large table, the overall time expended if you drop the index and rebuild it is less.

Another advantage to rebuilding an index after a batch load completes is the reduction of fragmentation that is found in the index. When a database grows, records are added, removed, and updated, and fragmentation can occur. For any database that experiences a lot of growth, it is a good idea to periodically drop and rebuild large indexes. When an index is rebuilt, the number of physical extents that comprise the index is decreased, there is less disk I/O involved to read the index, the user gets results faster, and everyone is happy.


Team-Fly    
Top
 


Sams Teach Yourself SQL in 24 Hours
Sams Teach Yourself SQL in 24 Hours (5th Edition) (Sams Teach Yourself -- Hours)
ISBN: 0672335417
EAN: 2147483647
Year: 2002
Pages: 275

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net