Sorgu Yazarken Dikkat Edilmesi Gereken Hususlar


  1. Veritabanı nesneleri, tam bir açıklıkla ifade edilmelidir.
    FROM [BS112INTERFACEDB].[call].[CallAgent]?
  2. SELECT ifadelerinde * kullanılmamalıdır. Kolonlar belirtilmelidir.
     
  3. Tüm sorgular (SELECT,INSERT,UPDATE,DELETE), parametrik şekilde tasarlanmalıdır.

    Sorgu içinde, “Değer” gönderilmemelidir. Değerler, parametre olarak gönderilmelidir.
     
  4. Direkt olarak tablo üzerinden bilgi alınmaya çalışılmalıdır. “View” kullanımına dikkat edilmelidir.

    “View” nesnesinin bulunması için, ilave işlemler yapılmaktadır.

    http://www.sql-server-performance.com/2007/views-general/

    Duruma göre, “IndexedView” tercih edilebilir.

    http://www.techrepublic.com/article/see-performance-gains-by-using-indexed-views-in-sql-server/6160148
  5. View ‘ler üzerinden join kesinlikle yapılmamalıdır. Çünkü view’ler  sanal tablodur. Bu yüzden join işlemi esnasında index kullanılmaz.
     
  6. NOT IN” kullanılmamalıdır.
    Aşağıdaki yapıların hepsi, daha iyi bir performans sunar.
    • EXISTS veya  NOT EXISTS
    • IN
    • LEFT OUTER JOIN ve “NULL” koşulunun kontrol edilmesi
  7. LIKE kullanımında, baş tarafta karakter olmasına dikkat edilmelidir.

    Örnek : LIKE 'm%' şeklinde yazılmalıdır. (LIKE ‘%m’ kullanılamamalıdır.) Yoksa ilgili kolon için sorgu çekilmesi esnasında index kullanılmaz.
     
  8. Where ifadelerinde, kolon üzerinde fonksiyon kullanılmamalıdır.
    SELECT * FROM Orders WHERE LEFT(CustomerID,1) ='V' ---Yanlış olan
    SELECT * FROM Orders WHERE CustomerID LIKE 'V%'  --- Doğru olan

    Sorgu performansı için :

    http://sqlservercode.blogspot.com/2005/12/sql-query-optimizations.html

  9. Where ifadelerinde, kolon üzerinde aritmetik işlem yapılmamalıdır.
    SELECT * FROM Orders WHERE OrderID*3 = 33000
    SELECT * FROM Orders WHERE OrderID = 33000/3

    Sorgu performansı için :

    http://sqlservercode.blogspot.com/2005/12/sql-query-optimizations.html

  10. Where ifadelerinde, Tarih kolonu üzerinde Dönüştürme yapılmamalıdır.
    SELECT * FROM Orders WHERE OrderDate = '1996-07-04'
    SELECT * FROM Orders WHERE CONVERT(CHAR(10),OrderDate,120) = '1996-07-04'?

    Sorgu performansı için :

    http://sqlservercode.blogspot.com/2005/12/sql-query-optimizations.html

  11. Select ifadesinde kullanılacak tüm alanların indeks (Non-Clustured) içinde olması performansı arttırır. (Covering Index) (Az sayıda alan işlem üzerinde işlem yapan sorgularda, düşünülebilir.)

    Bütün işlemler, İndeks üzerinde halledilecektir. Tabloya gitmeye gerek kalmayacaktır.

    SELECT ORDER_DATE, SUM(AMOUNT) FROM ORDERS GROUP BY ORDER_DATE

    (ORDER_DATE, AMOUNT) kolonları üzerinde indeks oluşturulmalıdır.

    http://www.devx.com/dbzone/Article/29530

  12. WHERE ifadesinde kullanılan operatörlerin performana göre sıralanışı aşağıdaki gibidir :

    =  (En hızlı)

    >, >=, <, <=

    LIKE

    <> (En yavaş)

    “=” kullanılamalı münkün olduğu kadar. Mümkün değilse “<>” yazılmalıdır.

    http://www.sql-server-performance.com/2007/t-sql-where/

     

Share This Article

Comments (0)

Leave a Comment