رفتن به مطلب

روشهاي بالا بردن Performance در Query ها


ملیساا

ارسال های توصیه شده

1-تا جائيكه امكان دارد سعي كنيد از عبارتWHERE در دستورات SELECT خود استفاده كنيد.

 

2- از Inner Join استفاده نكنيد.

 

3-تا حد امكان از بکارگيري Cursor اجتناب كنيد.

 

4-در مورد اينكه آيا SELECT شما واقعا به DISTINCT نياز دارد يا نه توجه كنيد . در جايي كه نياز نيست از آن به هيچ عنوان استفاده نكنيد.

 

5-در عبارت SELECT خود ، فقط اسامي فيلدهايي را ذكر كنيد كه استفاده مي كنيد. لذا از عبارت SELECT * تا حد امكان خودداري كنيد.

 

6-دستور SET ROWCOUNT همان كاري را انجام مي دهد كه گزينه TOP در دستور SELECT .اما گزينه TOP به مراتب كاراتر است.

 

7-تا حد امكان از EXISTS و IN به جاي EXISTS NOT و NOT IN استفاده كنيد زيرا Performance سيستم را افزايش مي دهند.

 

8-از Constraint ها استفاده كنيد.مانند گزينه هاي Constraint و يا Default ها.

 

9-از چند Constraint براي انجام يك كنترل استفاده نكنيد. مثلا اگر از محدوديتهاي Primary Key و Foreign Key براي كنترل جامعيت ارجاعيRefrentional Integrity)) استفاده مي كنيد، كنترل اين مطلب در Trigger نيز تنها يك بار اضافي به سيستم تحميل مي كند.

 

10-زماني كه براي انجام يك درخواست هم مي توان از Join استفاده كرد هم از SubQuery ، استفاده از Join توصيه مي شود چون سريعتر است.

 

11-اگر در عبارت خود هم مي توانيد از IN استفاده كنيد هم از EXISTS ، ترجيحا از EXISTS استفاده كنيد ؤ چون كارا تر و سريتر عمل مي كند.

 

12-وقتي هم امكان اينرا داريد كه از IN استفاده كنيد ، هم از BETWEEN ، از BETWEEN استفاده كنيد.

 

13-تا جائيكه امكان دارد ، سعي كنيد از SUBSTRING( ) در عبارت WHERE خود استفاده نكنيد.زيرا باعث مي شود كه جدول Scan شود به جاي اينكه از Index استفاده كند.

 

14-تا جائيكه امكان دارد از توابع تبديلي در شرط WHERE استفاده نكنيد.

 

15-با اينكه استفاده از View ها آسان است ، اما كارايي سيستم را كم مي كنند.به جاي استفاده از View از Stored Procedureها استفاده كنيد.

 

16-از View هاي تودر تو استفاده نكنيد.(در صورتيكه به توصيه 16 عمل نمي كنيد !!! )

 

17-تا زماني كه واقعا نيازي نداريد از DISTINCT يا ORDER BY استفاده نكنيد.

 

18-اگر در برنامه تان از جستجوي متني wildCardي روي CHAR يا VarCHARزياد استفاده مي شود (Like % ) ، از امكانات Full Text Search استفاده كنيد.

 

19-شما مي توانيد از GROUP BY با / بدون توابع Aggregation استفاده كنيد.اما اگر مي خواهيد بالاترين كارايي را داشته باشيد ، از GROUP BY بدون توابع Aggregation استفاده نكنيد.

 

20- تا آنجا كه امكان دارد از Derived Table ها به جاي Temporary Table ها استفاده كنيد.

 

21-اگر در شرط WHERE از توابعي روي فيلد ها ، استفاده شود كه Non-Sargable باشند ،باعث پايين آمدن كارايي مي شود.اگر بتوانيد به شكلي شرط WHERE را طوري بازنگري كنيد كه فيلد و تابع جدا گانه باشند،در اين صورت Query مي تواند از Index موجود استفاده كرده و كارايي را افزايش دهيد.

 

I)

 

 

کد:

 

SELECT ID,First_name,LastNameFrom MembersWHERE DATEDIFF(yy,DateOfBirth,GetDate())>21

 

 

II)

 

 

 

کد:

 

SELECT ID,First_Name,Last-NameFrom MembersWHERE DateofBirth

 

 

 

22-ايندكس بايد روي تمام فيلدهايي كه مرتب در WHERE ، ORDER BY ، GROUP BY ، TOP و DISTINCT استفاده مي شوند ، زده شود.

 

23-طبق قانون Thumb ،تمام جداول حداقل يك Clustered Index داشته باشند.عموما ، نه هميشه ، Clustered Index بايد روي فيلدهايي زده شوند كه مقاديرش به صورت يكنواخت افزايش پيدا مي كنند ، مانند فيلدهاي Identity و يا فيلدهايي كه مقاديرشان افزايش مي يابند و Unique هستند.در بسياري از شرايط Primary Key بهترين انتخاب براي Clustered Index است.

 

24-روي جداول OLTP ، ايندكس نزنيد.چون هر ايندكس زمان اجراي دستورات DML را افزايش مي دهد.

 

25-دقت كنيد كه به طور تصادفي ، ايندكس مشابه روي جداول نزنيد . اين اتفاق ممكن است به سادگي اتفاق بيافتد.براي مثال ، شما يك Unique يا Primary Key روي يك فيلد تعريف مي كنيد، در اينصورت اتوماتيك ايندكس هايي روي اين فيلد زده مي شود .اما اگر شما به اين مسئله توجه نكنيد و جداگانه روي اين فيلد اينكدس بزنيد، دچار مشكل ايندكس هاي تكراري مي شويد.

 

26-عموما در موارد زير ايندكس زده نمي شود:

• اگر Query Optimizer از ايندكس استفاده نكند.مثلا اگر جدول كوچك باشد، اكثرا از ايندكس استفاده نمي شود.

• فيلد يا فيلدهايي كه قرار است در ايندكس باشند ،عريض باشند.

• اگر فيلدها از نوع Text يا Ntext يا Image باشند.

• اگر از جدول به ندرت استفاده شود.

 

27-گاهي اوقات ايده خوبي است كه يك ايندكس مركب را به چندين ايندكس تك فيلدي تجزيه كنيد.چون عملا فيلد اول توسط Query Optimizer استفاده مي شود.البته اين بدين معنا نيست كه هميشه Single Index از Composite Index ها بهتر عمل مي كنند.فقط با تست كردن مي توانيد بفهميد كه كداميك براي جدول شما كارايي بيشتري دارد.

 

28-اگر دو يا چند جدول داريد كه مرتبا آنها را به يكديگر Join مي كنيد ، بهتر است روي فيلدهايي كه در Join شركت دارند ايندكس بزنيد.

 

29-تا جائيكه امكان دارد ايندكس Unique ايجاد كنيد. زيرا SQL Server روي ايندكسهاي Unique سريعتر از ايندسهاي غير Unique مي تواند جستجو كند.

 

30-از فيلدهاي Float و Real براي Primary Key استفاده نكنيد.زيرا يك OverHead غير ضروري به سيستم تحميل مي كند كه كارايي سيستم را مي كاهد.

 

31-هيچگاه روي فيلدهايي كه روي آنها Non-Clustered Index زده شده است ، Clustered Index نزنيد.

 

32-از Clustered Index زدن روي فيلدهايي كه مرتب Update مي شود خودداري كنيد.زيرا هروقت فيلدي كه در يك Clustered Index استفاده شده تغيير مي كند، تمام Non-Clustered Index ها هم بايد Update شوند.

 

33- فيلد يا فيلدهايي را براي Clustered Index انتخاب مي كنيد كه شامل اطلاعاتي هست كه در Query ها بيشتر Search مي شوند.

 

Primary Key -34 ي كه شما روي جداولتان استفاده مي كنيد ، حتما نبايد هميشه Clustered Index باشند. زماني Primary Key را Clustered Index كنيد كه مرتبا ٌ Range Query روي Primary Key انجام مي دهيد يا مي خواهيد خروجيتان بر اساس Primary Key مرتب شود.

 

35-تا جاييكه امكان دارد از ايندكس زدن روي فيلد GUID خودداري كنيد.

 

36-دراول تمام Stored Procedure هاي خود از دستور SET NOCOUNT ON استفاده كنيد.

 

37-اگر Stored Procedure شما به صورت ديناميك باشد و يا شرايط WHERE آن در هر بار اجرا تغيير مي كند، از With Recompile در Stored Procedure خود استفاده كنيد.

 

38-اگر مي خواهيد اطلاعات را به صورت رشته اي در جدول ذخيره كنيد ، و طول آن كمتر از 8000 است ، از نوع Char يا VarChar به جاي Text استفاده كنيد.

 

39-اگر در برنامه تان از Temporary Table زياد استفاده مي كنيد، به جاي آن سعي كنيد از متغيرهايي از جنس Table استفاده كنيد.

 

DateTime -40 را هيچگاه به عنوان Primary Key در نظر نگيريد.

 

41-اگر اين انتخاب را داريد كه براي ملزم كردن Rules و Default ها از Trigger يا CHECK Constarin استفاده كنيد.ترجيحا از CHECK Constarin استفاده كنيد.

 

42- براي كاهش Overhead ، كمترين كد ممكن را در Trigger بنويسيد.

 

43- تا جاييكه ممكن است از Roll Back كردن تا حد امكان در Trigger خودداري كنيد.سعي كنيد قبل از اينكه ‏Trigger اجرا شود ، مشكل را برطرف كنيد.

 

44- براي ايجـاد جـداول موقت ( در صورتيكه چاره اي جز استفـاده از آنها نداريد ) ، از SELECT INTO استفاده نكنيد.

لینک به دیدگاه
×
×
  • اضافه کردن...