2. Agenda
- Why SQL Tuning?
- Oracle SQL Processing
- Shared Pool
- Bind Variables
- Hard Parsing
- Soft Parsing
- Selectivity & Cardinality
- Full Table Scan
- High Water Mark
- Access with Indexes
- Execution Plan
- Hint & Tips
3. Oracle SQL Processing
Create Cursor: Bu adımda yazdığımız SQL için memory’de bir
alan ayrılır ve bu alanda yazdığımız SQL’in ve sorgu ile ilgili
gerekli bilgiler tutulur.
Parse SQL: Parse SQL adımında yazılan SQL’in syntax
checking işlemi, shared pool’da(Shared pool hakkında bilgi
daha sonra verilecektir.) daha önceden olup olmadığı eğer
yok ise Execution planının oluşturulduğu en önemli adımdır.
Parse SQL adımı Oracle SQL Processing’in en maliyetli ve en
önemli adımıdır.
Bind Variables: Eğer çalıştırdığımız veya yazdığımız SQL daha
önce farklı bir parametre ile çalıştırıldıysa, aynı SQL’e yeni
parametrenin eklendiği adımdır. Ancak bind variable
kullandığımızı sorgu içinde farklı bir yazım notasyonu ile belli
edilmesi gerekmektedir. Aksi takdirde sorgu ilk kez
çalıştırılıyormuş gibi işlem görür. Daha önce çalışmış bir
sorgunun yeniden parse edilmesi performans anlamında
ciddi kayıplara neden olacaktır. İleride vereceğim örnekle
bind variable kullanmanın performansa olumlu etkilerini
inceleyebileceksiniz.
Execute SQL: Bu adımda SQL statementımız bir
DML(insert,update,delete) veya DDL(Alter,Create,..) ise SQL
tamamı ile işlenir. Ancak SQL’imiz bir sorgu cümlesi ise SQL’in
döndüreceği satırları elde etmek için SQL fetch işlemine
gönderilir.
Fetch Rows: SQL’in içeriğine göre database’den ilgili satırlara
erişim sağlanarak kayıtlar resultset’e döndürülür.
Close Cursor: SQL’imizin memory üzerinde tüm kullandığı
alan dealocate edilir.
4. -- Soft Parsing
SET TIMING ON;
DECLARE
v_sql VARCHAR2 (100);
BEGIN
FOR i IN 1 .. 100000
LOOP
v_sql := ‘insert into deneme values(:i)’;
EXECUTE IMMEDIATE v_sql USING i;
END LOOP;
END;
PL/SQL procedure successfully completed.
Elapsed: 00:00:30.01
PL/SQL procedure successfully completed.
Elapsed: 00:00:03.49
-- Hard Parsing
SET TIMING ON
DECLARE
v_sql VARCHAR2 (100);
BEGIN
FOR i IN 1 .. 100000
LOOP
v_sql := ‘insert into deneme values(‘||i||‘)’;
EXECUTE IMMEDIATE v_sql;
END LOOP;
END;
Bind Variables
5. Selectivity
Selectivity =
Number of rows satisfying a condition
Total number of rows
Selectivity is the estimated proportion of a row set retrieved by a
particular predicate or combination of predicates.
It is expressed as a value between 0.0 and 1.0:
High selectivity: Small proportion of rows
Low selectivity: Big proportion of rows
Selectivity computation:
If no statistics: Use dynamic sampling
If no histograms: Assume even distribution of rows
Statistic information:
DBA_TABLES and DBA_TAB_STATISTICS (NUM_ROWS)
DBA_TAB_COL_STATISTICS (NUM_DISTINCT, DENSITY,
HIGH/LOW_VALUE,…)
6. Cardinality
Cardinality = Selectivity * Total number of rows
Querry: SELECT * FROM employees WHERE first_name = 'Donald';
SELECT COUNT (DISTINCT (first_name)) FROM employees;--> 91
SELECT COUNT (*) FROM employees WHERE first_name = 'Donald'; --> 1
SELECTIVITY = SELECT 1 / 91 FROM DUAL; --> 0,0109
CARDINALITY = SELECT (SELECT 1 / 91 FROM DUAL) * (SELECT COUNT (*)
FROM employees) FROM DUAL; --> 1,17
Example
7. - Full Table Scans
- Full Partition Scans
- Full Index Scans
- Rowid Access
- Index Access
- Singe Table Hash
Cluster
8. Full Table Scan & HWM
insert
insert
insert
Delete
Delete
Delete
Delete Operation doesnt change HWM position
Truncate
Alter Table Move
Alter Table Shrink
9. Index Access
select salary from employees
where employee_id=10
Strong Selectivity
Rowid: AAAR5kAAFAAAADPAAA
DB
Result: 24000
Total Access: 2
11. Hint & Tips
- And – OR Logical Operators
- Oracle Tuning Advisor
- Index With Non-Equality
- NULL Values and Indexes
- Function Based Index
- Distinct – Group By – Count
- Union vs Union All
- Avoiding Nested Subquerry
- IN vs EXIST