Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Оптимизиране на SQL заявки чрез премахване на оператора за сортиране в плана за изпълнение

Първо, трябва да проверите дали сортирането всъщност е тясно място на производителността. Продължителността на сортирането ще зависи от броя на елементите, които трябва да бъдат сортирани, а броят на магазините за конкретен родителски магазин вероятно ще бъде малък. (Това предполага, че операторът за сортиране се прилага след прилагане на клаузата where).

Това е прекомерно обобщение. Често операторът за сортиране може тривиално да бъде преместен в индекса и, ако се извлекат само първите няколко реда от набора с резултати, може значително да намали цената на заявката, тъй като базата данни вече не трябва да извлича всички съответстващи редове (и да ги сортира всички), за да намерите първите, но може да чете записите в реда на набора от резултати и да спре, след като бъдат намерени достатъчно записи.

Във вашия случай изглежда, че извличате целия набор от резултати, така че сортирането, което е малко вероятно да влоши нещата много (освен ако наборът от резултати не е огромен). Освен това във вашия случай може да не е тривиално да се изгради полезен сортиран индекс, тъй като клаузата where съдържа или.

Сега, ако все още искате да се отървете от този оператор за сортиране, можете да опитате:

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] in (0, 1)
ORDER BY [Phone]    

Като алтернатива можете да опитате следния индекс:

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Phone], [Type])

за да опитате да накарате оптимизатора на заявки да извърши сканиране на диапазон на индекс на ParentStoreId само след това сканирайте всички съвпадащи редове в индекса, извеждайки ги, ако Type мачове. Това обаче вероятно ще причини повече I/O на диска и следователно ще забави вашата заявка, вместо да я ускори.

Редактиране :В краен случай можете да използвате

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 0
ORDER BY [Phone]

UNION ALL

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 1
ORDER BY [Phone]

с

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])

и сортирайте двата списъка на сървъра на приложения, където можете да обедините (както при сортиране чрез сливане) предварително сортираните списъци, като по този начин избягвате пълно сортиране. Но това наистина е микрооптимизация, която, въпреки че ускорява самото сортиране с порядък, е малко вероятно да повлияе много на общото време за изпълнение на заявката, тъй като бих очаквал тясното място да бъде мрежата и дисковият I/O, особено в светлината на факта, че дискът ще извършва много произволен достъп, тъй като индексът не е групиран.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Pivot с множество колони

  2. Има ли вградена функция, която може да конвертира числата в думи в sql сървъра

  3. Как да създадете материализирани изгледи в SQL Server?

  4. ADO .NET срещу SQL Server Management Studio - ADO се представя по-зле

  5. Грешка при влизане в SQL Server:Неуспешно влизане за потребител 'NT AUTHORITY\SYSTEM'