Published on

November 6, 2020

Понимание подсказки запроса READPAST в SQL Server

SQL Server предоставляет различные подсказки запросов, которые позволяют разработчикам переопределить стандартный план выполнения и оптимизировать свои запросы. Одна из таких подсказок запроса – подсказка READPAST, которая может использоваться для игнорирования строк, заблокированных другими транзакциями при чтении данных.

Когда транзакция блокирует определенные строки в таблице для обновления, другие транзакции могут быть заблокированы от доступа к этим строкам до освобождения блокировки. Однако, указав подсказку запроса READPAST в операторе SELECT, движок базы данных пропустит заблокированные строки и вернет оставшиеся строки, удовлетворяющие требованиям запроса.

Давайте рассмотрим пример, чтобы понять, как работает подсказка запроса READPAST. Предположим, у нас есть таблица с названием “Products” со следующими записями:

CREATE TABLE Products (
    ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    ProductName VARCHAR(20)
);

INSERT INTO Products (ProductName) VALUES ('Ноутбук');
INSERT INTO Products (ProductName) VALUES ('Мышь');
INSERT INTO Products (ProductName) VALUES ('Клавиатура');
INSERT INTO Products (ProductName) VALUES ('LAN-кабель');
INSERT INTO Products (ProductName) VALUES ('Беспроводной маршрутизатор');

Если мы выберем все записи из таблицы “Products” без использования подсказки запроса, будут возвращены все строки:

SELECT * FROM Products;

Теперь предположим, что мы начинаем явную транзакцию для обновления “ProductName” для строк с ID 1 и 2:

BEGIN TRANSACTION;
UPDATE Products SET ProductName = 'Mac' WHERE ID IN (1, 2);

Если мы попытаемся прочитать все строки из таблицы “Products” без какой-либо подсказки запроса, оператор SELECT будет заблокирован текущей обновляющей транзакцией:

SELECT * FROM Products;

Чтобы избежать проблем с блокировкой, мы можем использовать подсказку запроса NOLOCK, которая позволяет нам читать неподтвержденные данные. Однако это может привести к чтению некорректных или несогласованных данных.

В качестве альтернативы, мы можем использовать подсказку запроса READPAST, чтобы пропустить заблокированные строки и вернуть оставшиеся строки. Например:

SELECT * FROM Products WITH (READPAST);

В этом случае оператор SELECT вернет только строки, которые не заблокированы текущей обновляющей транзакцией.

Важно отметить, что использование подсказки запроса READPAST может привести к несогласованным данным, если заблокированные строки содержат важную информацию. Поэтому ее следует использовать осторожно и только в конкретных сценариях, где чтение заблокированных строк не является необходимым.

В заключение, подсказка запроса READPAST в SQL Server предоставляет возможность игнорировать заблокированные строки при чтении данных. Однако ее следует использовать с осторожностью, чтобы избежать несогласованных данных. Всегда тестируйте свои запросы и учитывайте последствия перед применением подсказки READPAST в рабочей среде.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.