SlideShare a Scribd company logo
1 of 12
SQL Tuning Best
Practices
Emrah METE
Solution Architect | Oracle ACE | OCE
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
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.
-- 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
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,…)
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
- Full Table Scans
- Full Partition Scans
- Full Index Scans
- Rowid Access
- Index Access
- Singe Table Hash
Cluster
Full Table Scan & HWM
insert
insert
insert
Delete
Delete
Delete
Delete Operation doesnt change HWM position
Truncate
Alter Table Move
Alter Table Shrink
Index Access
select salary from employees
where employee_id=10
Strong Selectivity
Rowid: AAAR5kAAFAAAADPAAA
DB
Result: 24000
Total Access: 2
Execution Plan
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
Questions/Answers

More Related Content

Similar to Introduction to SQL Tuning

Sql egitimi-avcilar
Sql egitimi-avcilarSql egitimi-avcilar
Sql egitimi-avcilar
sersld61
 
Sql egitimi-kartal
Sql egitimi-kartalSql egitimi-kartal
Sql egitimi-kartal
sersld61
 
Sql egitimi-catalca
Sql egitimi-catalcaSql egitimi-catalca
Sql egitimi-catalca
sersld61
 
Sql egitimi-fiyati
Sql egitimi-fiyatiSql egitimi-fiyati
Sql egitimi-fiyati
sersld61
 
Sql egitimi-antalya
Sql egitimi-antalyaSql egitimi-antalya
Sql egitimi-antalya
sersld61
 
Sql egitimi-adana
Sql egitimi-adanaSql egitimi-adana
Sql egitimi-adana
sersld61
 
Sql egitimi-sancaktepe
Sql egitimi-sancaktepeSql egitimi-sancaktepe
Sql egitimi-sancaktepe
sersld61
 
Sql egitimi-kagithane
Sql egitimi-kagithaneSql egitimi-kagithane
Sql egitimi-kagithane
sersld61
 
Sql egitimi-konya
Sql egitimi-konyaSql egitimi-konya
Sql egitimi-konya
sersld61
 
Sql egitimi-basaksehir
Sql egitimi-basaksehirSql egitimi-basaksehir
Sql egitimi-basaksehir
sersld61
 
Sql kursu-fiyatlari
Sql kursu-fiyatlariSql kursu-fiyatlari
Sql kursu-fiyatlari
sersld61
 
Sql dersi-sorulari
Sql dersi-sorulariSql dersi-sorulari
Sql dersi-sorulari
sersld61
 
Sql egitimi-arnavutkoy
Sql egitimi-arnavutkoySql egitimi-arnavutkoy
Sql egitimi-arnavutkoy
sersld61
 
Sql egitimi-esenler
Sql egitimi-esenlerSql egitimi-esenler
Sql egitimi-esenler
sersld61
 
Sql egitimi-atasehir
Sql egitimi-atasehirSql egitimi-atasehir
Sql egitimi-atasehir
sersld61
 
Sql egitimi-mersin
Sql egitimi-mersinSql egitimi-mersin
Sql egitimi-mersin
sersld61
 
Sql uzaktan-egitim
Sql uzaktan-egitimSql uzaktan-egitim
Sql uzaktan-egitim
sersld61
 
Sql egitimi-sakarya
Sql egitimi-sakaryaSql egitimi-sakarya
Sql egitimi-sakarya
sersld61
 
Sql egitimi-levent
Sql egitimi-leventSql egitimi-levent
Sql egitimi-levent
sersld61
 

Similar to Introduction to SQL Tuning (20)

Sql egitimi-avcilar
Sql egitimi-avcilarSql egitimi-avcilar
Sql egitimi-avcilar
 
Sql egitimi-kartal
Sql egitimi-kartalSql egitimi-kartal
Sql egitimi-kartal
 
Sql egitimi-catalca
Sql egitimi-catalcaSql egitimi-catalca
Sql egitimi-catalca
 
Sql egitimi-fiyati
Sql egitimi-fiyatiSql egitimi-fiyati
Sql egitimi-fiyati
 
Sql egitimi-antalya
Sql egitimi-antalyaSql egitimi-antalya
Sql egitimi-antalya
 
Sql egitimi-adana
Sql egitimi-adanaSql egitimi-adana
Sql egitimi-adana
 
Sql egitimi-sancaktepe
Sql egitimi-sancaktepeSql egitimi-sancaktepe
Sql egitimi-sancaktepe
 
Sql egitimi-kagithane
Sql egitimi-kagithaneSql egitimi-kagithane
Sql egitimi-kagithane
 
Sql egitimi-konya
Sql egitimi-konyaSql egitimi-konya
Sql egitimi-konya
 
Sql egitimi-basaksehir
Sql egitimi-basaksehirSql egitimi-basaksehir
Sql egitimi-basaksehir
 
Sql kursu-fiyatlari
Sql kursu-fiyatlariSql kursu-fiyatlari
Sql kursu-fiyatlari
 
Sql dersi-sorulari
Sql dersi-sorulariSql dersi-sorulari
Sql dersi-sorulari
 
Sql egitimi-arnavutkoy
Sql egitimi-arnavutkoySql egitimi-arnavutkoy
Sql egitimi-arnavutkoy
 
Sql egitimi-esenler
Sql egitimi-esenlerSql egitimi-esenler
Sql egitimi-esenler
 
Sql egitimi-atasehir
Sql egitimi-atasehirSql egitimi-atasehir
Sql egitimi-atasehir
 
Sql egitimi-mersin
Sql egitimi-mersinSql egitimi-mersin
Sql egitimi-mersin
 
Sql uzaktan-egitim
Sql uzaktan-egitimSql uzaktan-egitim
Sql uzaktan-egitim
 
Sql egitimi-sakarya
Sql egitimi-sakaryaSql egitimi-sakarya
Sql egitimi-sakarya
 
Pivot Unpivot
Pivot UnpivotPivot Unpivot
Pivot Unpivot
 
Sql egitimi-levent
Sql egitimi-leventSql egitimi-levent
Sql egitimi-levent
 

More from Emrah METE (8)

Useful Features of Oracle SQL Developer
Useful Features of Oracle SQL DeveloperUseful Features of Oracle SQL Developer
Useful Features of Oracle SQL Developer
 
Veri Ambarları için Oracle'ın Analitik SQL Desteği
Veri Ambarları için Oracle'ın Analitik SQL DesteğiVeri Ambarları için Oracle'ın Analitik SQL Desteği
Veri Ambarları için Oracle'ın Analitik SQL Desteği
 
Oracle PL/SQL Best Practices
Oracle PL/SQL Best PracticesOracle PL/SQL Best Practices
Oracle PL/SQL Best Practices
 
Analytical Functions for DWH
Analytical Functions for DWHAnalytical Functions for DWH
Analytical Functions for DWH
 
Oracle'da Transaction Yönetimi
Oracle'da Transaction YönetimiOracle'da Transaction Yönetimi
Oracle'da Transaction Yönetimi
 
Opti̇mi̇zi̇ng Data Access
Opti̇mi̇zi̇ng Data AccessOpti̇mi̇zi̇ng Data Access
Opti̇mi̇zi̇ng Data Access
 
Oracle’ın parallel execution yetenekleri ve performans
Oracle’ın parallel execution yetenekleri ve performansOracle’ın parallel execution yetenekleri ve performans
Oracle’ın parallel execution yetenekleri ve performans
 
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
 

Introduction to SQL Tuning

  • 1. SQL Tuning Best Practices Emrah METE Solution Architect | Oracle ACE | OCE
  • 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