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

ПОРЪЧАЙТЕ ПО и С(ROWLOCK, UPDLOCK, READPAST)

Както се очакваше

  • SELECT с ORDER BY, без ROWLOCK, без индекс ще има заключване на таблица поради сканиране/междинно сортиране, за да изработи TOP 2. Така че втората сесия пропуска цялата таблица поради READPAST

  • SELECT без ORDER BY просто избира всеки 2 реда, които случайно са в реда на вмъкване (чисто съвпадение, няма подразбиращ се ред). Фактът, че тези 2 реда са заключени, кара втората сесия да прескочи до следващите незаключени редове.

SQL Server се опитва да поддържа заключванията възможно най-подробни, но сканирането означава заключване на таблица. Сега, това обикновено не би имало значение (ще бъде споделена ключалка за четене), но имате и UPDLOCK, което означава изключително заключена таблица

И така, имате нужда и от двете

  • 3 подсказки в заявките SELECT (ROWLOCK, UPDLOCK, READPAST) за контрол на детайлността, изолацията и паралелността.
    Използването само на ROWLOCK пак ще доведе до изключително заключване на всеки ред за сканиране/сортиране.
  • индекс на Value ВКЛЮЧЕТЕ TestID за да направите SELECT ефективен. Само индекс вероятно ще коригира паралелността, но няма да е гарантирано.

В един от предишните ви въпроси направих връзка към моя отговор (в коментар) към Условие за надпревара на опашка за процес на SQL Server където имам всичките 3 съвета за заключване




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-бързият начин за прехвърляне на данни от таблици на Excel към SQL 2008R2

  2. Как да задам променлива от SQL заявка?

  3. Често срещани грешки на DBA в MS SQL Server

  4. Прехвърляне на научна нотация (от varchar -> numeric) в изглед

  5. INSERT INTO @TABLE EXEC @query със SQL Server 2000