2009-10-25

SQL Query –ны хурдыг сайжруулах (SARG-able operator)

Хөгжүүлэгчид query бичихдээ анх бичээд л ажиллаж байвал дараа нь мэдээллийн сангийн өгөгдлийн хэмжээ тодорхой хугацааны дараа томрохыг бодолцохгүй бичих тохиолдолууд их байдаг. Харин дараа нь оновчтой бус бичсэн маш олон query –нүүд маш удаан ажиллах, удаан хугацаагаар хүснэгтүүдийг түгжих (lock) зэргээр системийн хэвийн үйл ажиллагааг алдагдуулж, систем унаж эхэлдэг. 

SQL Server дээр query –ны хурдыг сайжруулах нэг гол зүйл SARG(Search ARGument) -able биш операторуудыг WHERE дээр ашиглахаас аль болох татгалзах явдал юм. Ялангуяа индекс тавигдсан багануудын хувьд SQL Server нь индексээ ашиглан хурдан ажиллах боломжийг Sargable биш оператор нь байхгүй болгодог.

Операторуудыг гүйцэтгэх хурдаар нь сайнаас муу хүртэл болон тэдгээрийг ашигласан жишээ query –г доор харуулав.


Sargable операторууд:
•    = (хамгийн гүйцэтгэл сайн sargable оператор)
•    >
•    <
•    >=
•    <=
•    EXIST
•    IS
•    BETWEEN
•    IN
•    LIKE 'abc%' (хамгийн гүйцэтгэл тааруу sargable оператор)

Sargable биш операторууд:
•    IS NULL
•    <>
•    !=
•    !>
•    !<
•    NOT
•    NOT EXIST
•    NOT LIKE
•    LIKE '%abc'
•    LIKE '%ABC%'
•    LIKE '%abc%'
•    Where нөхцөл дээр функц ашиглах
•    column1 = column1 (ижил багануудыг хооронд нь жиших)
•    column1 = column2 (өөр багануудыг хооронд нь жиших)

Sargable биш оператор ашиглан оновчгүй бичигдсэн query-ны жишээ:
1)  SELECT * FROM Customers WHERE Left(Name,4) = 'Jane'  / функц ашигласан /
2)  SELECT * FROM Customers WHERE Salary IS NULL
3)  SELECT * FROM Customers WHERE Name LIKE '%Jane%'
4)  SELECT * FROM Customers WHERE PersonID NOT IN (SELECT PersonID FROM Persons WHERE Gender = 'Male')

Sargable оператор ашиглан дээрх query –нуудыг илүү оновчтой байдлаар бичвэл:
1)  SELECT * FROM Customers WHERE Name LIKE 'Jane%'
2)  SELECT * FROM Customers WHERE Salary = 0
3)  сайжруулах боломжгүй
4)  SELECT * FROM Customers WHERE PersonID IN (SELECT PersonID FROM Persons WHERE Gender = 'Female')

1 comment:

  1. Баярлалаа. Хэрэгтэй мэдээлэл байна.

    ReplyDelete