Post Page Advertisement [Top]

Merhaba,
Daha önceki yazımızın devamı olan bu sayfada SQL sorgu performansını artırmaya devam ediyoruz.

Okurken ne dinlemeli ?



13. Veritabanı ve Store Procedure isimlerini yazarken tam isim ile yazmak bize daha hız kazandıracaktır.Çünkü ilgili tablo ve prosedür'ün bulunması zaman alabilir ve bulunduğunda da tekrar çağrım adına cach'lenecektir.

format database_name.schema_name.table_name
EXEC Your_Proc_name yerine EXEC master.dbo.Your_Proc_name
of CREATE PROCEDURE Your_Proc_name  yerine CREATE PROCEDURE dbo.Your_Proc_name gibi. 


























14. Store Procedure isimlendirmelerinde  "sp_" ön ekini kullanmayalım bu DB'de system 
 prosedür'leri için ayrılmıştır. Prosedür'ün bulunması için fazla zaman harcamaya sebep olur.




15.  IN yerine EXISTS NOT IN yerine ise EXISTS kullanmak daha iyidir. Çünkü  IN null olan satırları da sayar.EXISTS sadece sonuç ile ilgili false /true dönerken IN tüm satırları döner.

SELECT name
FROM teacher
WHERE teacher_id IN (SELECT teacher_id FROM student)
SELECT name
FROM teacher
WHERE EXISTS (SELECT 1 FROM student
where teacher.teacher_id = student.teacher_id)

 16.  Belli bir ay ve yıl karşılaştırmasını farklı şekilde yapabiliriz DAY MONTH gibi keywordleri kullanmadan daha hızlı bir çalışma için aşağıdaki gibi düşünebiliriz.


SELECT * FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2005 AND MONTH(OrderDate) = 7

SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate >= '20050701' AND OrderDate < '20050801'


17.  Tarih karşılaştırması yaparken izlenmesi gereken performanslı bir yol daha. 

SELECT * FROM Sales.SalesOrderHeader
WHERE CONVERT (varchar(10), OrderDate, 112) = '20040731'
ya da 
 SELECT *FROM Sales.SalesOrderHeader
WHERE OrderDate LIKE '31 Jul 2004%'
yerine  aşağıdaki kullanım daha hızlı.
SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN '31 Jul 2004 00:00:00' AND '31 Jul 2004 23:59:59:997'


18.  GROUP BY 'da gün ay yıla göre bir gruplama yapacaksak, yapmamamız gerekenler:

GROUP BY DATEPART(DAY, SomeDate), DATEPART(MONTH, SomeDate), DATEPART(YEAR, SomeDate)
GROUP BY SUBSTRING(CONVERT(varchar(20), SomeDate, xxx), xxx, xxx)
 daha performanslı olması için yapabileceğimiz yöntemler:
GROUP BY dateadd(month, datediff(month, 0, SomeDate),0)GROUP BY datediff(month,0,SomeDate)GROUP BY Year(SomeDate), Month(SomeDate),Day(SomeDate)


19.  Örneğin bir X tablosundan belirli where koşulları ile veri çekip bu sonuçların her bir satırına ihtiyaç duyan ve bu bilgilerle yeni işlemler yapacak olduğumuzu düşünelim (Update -Insert gibi).İlk olarak aklımıza CURSOR X tablosunu ilişkilendirip her satır verisi ile işlem yapmak ya da X tablosundan sorguyu çekip temp tabloya atıp while ile dönmek gelebilir. Oysaki X tablosundan istenilen sorguyu çekip diğer tablolar ile JOIN yapmak büyük ölçüde hızlı kazandıracaktır.


  Yazımızın sonuna gelmiş bulunmaktayız , okuduğunuz ilgilendiğiniz için teşekkürler ve son bir konu 'bonus' : Rollback yaptığımızda temp tablolar drop oluyor mu? Tekrar drop komutu mu yazmalıyız? 
İyi haber genellikle transaction rollback olduğunda temp tablolar silinir fakat run-time hatalarında temp tablolar silinmez bunu engellemek için defaultta OFF olan  özelliğini aşağıdaki gibi ON yapıp kullanabiliriz.

GO
SET XACT_ABORT ON;
GO


Ve tabiiki SQL server Profiler kullanmayı unutmayalım sorguları inceleyip sürelerine kullandığı kaynaklara bakabiliriz. Database Engine Service Tunning Advisor'den de tavsiye alabiliriz.Bu iki tool 'un kullanımına ilerleyen yazılarımda değinmeyi düşünüyorum.

Bu iki yazıyı yazarken kullandığım kaynaklar:
https://stackoverflow.com/questions/17354219/how-to-speed-up-sql-queries-indexes
https://dzone.com/articles/6-simple-performance-tips-sql
http://www.winwire.com/25-tips-to-improve-sql-query-performance/
https://sqlperformance.com/2014/09/sql-plan/rewriting-queries-improve-performance
https://www.datavail.com/blog/three-ideas-returning-microsoft-sql-queries-faster/
https://www.slideshare.net/BrianGallagher4/sql-joins-and-query-optimization
http://searchsqlserver.techtarget.com/tip/Avoid-cursors-in-SQL-Server-with-these-methods-to-loop-over-records
https://coderwall.com/p/jefi1q/basic-tips-on-tuning-sql-server-queries
https://www.apriorit.com/dev-blog/381-sql-query-optimization
https://stackify.com/performance-tuning-in-sql-server-find-slow-queries/
http://beginner-sql-tutorial.com/sql-tutorial-tips.htm
http://www.vertabelo.com/blog/technical-articles/5-tips-to-optimize-your-sql-queries
https://www.codeproject.com/Articles/22853/SQL-Server-Performance-Tips-and-Guidelines
http://info.110consulting.com/blog/bid/386688/5-Ways-to-Speed-Up-Your-SQL-Queries
http://www.sqlservercentral.com/articles/Performance+Tuning/67427/
https://www.catswhocode.com/blog/10-sql-tips-to-speed-up-your-database
http://www.monitis.com/blog/30-ms-sql-performance-tips/
https://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=131674
http://blog.sqlconcepts.co.nz/2012/07/cursors-and-while-loops-reply.html
https://www.red-gate.com/simple-talk/sql/performance/writing-efficient-sql-set-based-speed-phreakery/
http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search-arguments/
https://stackoverflow.com/questions/15344661/what-is-the-optimal-way-to-compare-dates-in-microsoft-sql-server
https://blogs.msdn.microsoft.com/arvindsh/2008/12/02/t-sql-anti-pattern-of-the-day-comparing-datetime-field-with-date-only-literal/
https://sqlperformance.com/2012/09/t-sql-queries/what-is-the-most-efficient-way-to-trim-time-from-datetime
https://stackoverflow.com/questions/133081/most-efficient-way-in-sql-server-to-get-date-from-datetime
http://diegworld.blogspot.com.tr/2010/09/sql-server-performance-querying-by-date.html
http://weblogs.sqlteam.com/jeffs/archive/2007/09/10/group-by-month-sql.aspx
https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/
http://www.sqlservercentral.com/blogs/sqlinthewild/2010/03/23/left-outer-join-vs-not-exists/
https://community.modeanalytics.com/sql/tutorial/sql-joins-where-vs-on/
https://stackoverflow.com/questions/30559591/what-is-the-difference-between-using-filter-condition-in-where-clause-and-join-c
https://stackoverflow.com/questions/14739380/does-it-drop-temp-table-created-in-transaction-if-rollback-transaction-in-sql
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql
https://stackoverflow.com/questions/8023183/how-to-set-set-xact-abort-on-in-a-sql-server-transaction

Sağlıkla kalın ,hoşça kalın.


1 yorum:

Bottom Ad [Post Page]