Tips to Tune SQL Queries
In this post I hope to give some knowledge about the Oracle Execution plan and
the some tips to optimize sql queries for better performances.
Execution Plan
Oracle can run Explain plan for given SELECT, INSERT,UPDATE, DELETE SQL
statements as below
Oracle -
the some tips to optimize sql queries for better performances.
Execution Plan
Oracle can run Explain plan for given SELECT, INSERT,UPDATE, DELETE SQL
statements as below
Oracle -
EXPLAIN PLAN FOR
SELECT customer_name FROM CUSTOMER;MySql - Explain SELECT customer_name FROM CUSTOMER; Then it displays the execution plan chosen by the Oracle optimizer, which contains the sequence of operations used to run a particular sql statement. Execution plan contains, tables, views referenced by the statementaccess methods for each tables and views (table access full,table access by index) join methodsdata operations such as sort, aggregatecost, cardinalityparallel executions According to the execution plan you can get the idea to optimize a given sql statement in a proper way.Now I am going to explain the ways that can be used to tune/optimize the SQL statements for higher efficiency and performance. IndexingIndexes in DBMS are just like indexes in a book. Index creates entry foreach value in indexed columns with excluding all other detailed data.So indexes can be stored in a less disk space.Oracle use different types of indexes such as B-Tree (Default), Bitmap index(Use rowid to store), function based index, partitioned index.According to the execution plan, you can get an idea that oracle performs afull table/view scan to find records or it accesses the table/view through the indexes.If it accesses a table with a full scan you can index columns for higher performances.Always create indexes when you need to retrieve less number of rows fromlarge table which contains millions of records.When you find a particular record or set of recordsfrom a table with using WHERE clause or GROUP BY clause or ORDER BY clause,to achieve higher performances,try to use indexed columns with these clauses.As well as, Indexing can be done in different ways to identify particular rowsfrom a table in an efficient way.indexing primary and unique columns
Short indexes - this means less number of columns for indexes.When there are less index entries it makes easier andless number of comparisons since index entries are often involvedin comparisons
'SELECT first_name, last_name FROM StudentWHERE medium = 'ENGLISH' AND gpa > 3'assume you have created index for media columns. IX(medium).So when this statement is executing, Oracle may useIX(media) index to search data from the table.For higher performances you can create new Index on media and gpa
ex : Create index Student_IX on Student(medium,gpa)You can drop or alter indexes anytime without affecting other indexes,tables and views because indexes are independent.
ex: Drop index Student_IX
Alter index Student_IX Rename to Student_IX1As well as, join the multiple tables to improve performances and
use indexed columns with those joins.
2. Use WHERE clause instead of HAVING clause. Because HAVING clause filters rows after selecting all the rows in table/view. Use always indexed columns in the WHERE clause with symbol operators such as =, >=,<=.3. Avoid usage of NOT operator (NOT EXIST, NOT IN, !=). Because those prevent use of Indexes. Use positive operators such as EXIST, IN, =ex; IN (val1, val2, val3) => col = val1 OR col val2 OR col val3
It is enough one of three values evaluate to TRUE.
But, NOT IN (val1, val2, val3) => col = val1 AND col = VAL2 AND col = VAL3Here, all 3 values must evaluate to TRUE. So it slows the performances.
4. Use Wildcard instead of Substr with the WHERE clause because substr allows each single row to substring for performing the comparisons. So it prevents the use of indexes. For higher performances use postfix wild card with indexed columns instead of full wildcard and prefix wildcard.5. Use 'Select (first_name, last_name)' instead of 'Select * From..' 6. Avoid use of IN comparisons. Instead use Straight value comparisons with symbol operators such as '= ,<=, >='. Because large IN lists also prevent use of indexes. 7. Use 'UNION ALL' instead of 'UNION'. Because 'UNION' has to filter all the duplicate values and select only distinct values.So, it has an extra step to Sort(Distinct) which is highly cost than UNION ALL because UNION ALL selects all the datawith duplicate values. If it is required to use UNION use it with indexed columns. 8. If COUNT is used to check the existence of particular column data , Use 'EXIST' for thatIf (Select Count(*) from TABLE where student_age=24)>0When executing this statement COUNT scans all the records but EXIST stops finding records when first record is foundSo use it as If (Exist(Select 1 from TABLE where student_age=24))
9. If you use PLSQL functions or procedures to communicate with the database, avoid the execution of dynamic sql. Because it slows the performances of DBMS
Comments
Post a Comment