Просмотры, соединения, блокировки и порядок по - PullRequest
0 голосов
/ 20 июня 2011

Я создал вид, используя

CREATE VIEW NewView AS
WITH TableA AS
(
    SELECT * FROM RealTableA WITH (ROWLOCK, UPDLOCK, READPAST) WHERE (Something1)
)
,
TableB AS
(
    SELECT * FROM RealTableB WITH (ROWLOCK, READPAST) WHERE (Something2)
)
SELECT * FROM TableA INNER JOIN TableB ON (TableA.ID = TableB.RefID)

и все работает гладко - два процесса, выполняющиеся одновременно, выбирая из представления, будут выбирать разные записи из него. Проблема в том, что теперь я хочу использовать предложение ORDER BY, и хотя я использовал

CREATE NONCLUSTERED INDEX IX_SOMEINDEX ON RealTableB ( Field1 ASC , Field2 ASC ) INCLUDE ( RefID )

все тормозит при использовании

SELECT TOP (@Something) * FROM NewView ORDER BY Field1 ASC , Field2 ASC

Я имею в виду, Process1 правильно выбирает первые @Something результаты, но Process2 ничего не возвращает, что указывает на возможную блокировку таблицы (но почему, если у меня есть индекс по полям, по которым я упорядочиваю?). Однако, если я уберу предложение ORDER BY, оно будет работать хорошо, но без желаемого порядка. Я попробовал WITH ( INDEX ( IX_SOMEINDEX ) ) в CTE, но это не сработало. Мне действительно нужно сделать эту работу как можно скорее. Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 20 июня 2011

Не используйте SELECT *.Если вы запросите все столбцы, произойдет сканирование таблицы (часто показывается как сканирование кластерного индекса).Из-за этого в одной из ваших таблиц заблокированы все строки.

Измените представление на это и оставьте подсказки снаружи.Затем индексируйте его.

CREATE VIEW NewView
WITH SCHEMABINDING
AS
SELECT
    --real column list
FROM 
   RealTableA
   INNER JOIN
    TableB ON (TableA.ID = TableB.RefID)
WHERE
   (Something1) AND  (Something2)

Если это не удастся (например, у вас есть столбец больших объектов на основе предыдущих вопросов), вам необходимо опубликовать 100% точный код и 100% точные данные и 100 & точных запросов.Обычно мы не можем помочь с обработанным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...