В чем преимущество использования FAST_FORWARD для определения курсора?

В чем преимущество использования FAST_FORWARD для определения курсора? Это лучше для производительности? почему?

Ответы

Ответ 1

Определение MSDN:

Указывает FORWARD_ONLY, READ_ONLY курсор с оптимизацией производительности включен. FAST_FORWARD не может быть если SCROLL или FOR_UPDATE также указано. FAST_FORWARD и FORWARD_ONLY являются взаимоисключающими; если один указан, другой не может указывается.

Я смело сказал ключ. Он может поддерживать эти "оптимизации производительности", потому что ему не нужно поддерживать многонаправленную итерацию с помощью курсора (FORWARD_ONLY) и не поддерживает модификации (READ_ONLY).

Конечно, если вам вообще не нужно использовать курсор, то использование курсора даже с этой опцией также не будет выполнено. Если вы можете сделать одну и ту же задачу, используя подход на основе набора, сделайте это вместо этого - это тот бит, который я действительно хотел подчеркнуть.

Ответ 2

FAST_FORWARD - указывает, что курсор будет FORWARD_ONLY и READ_ONLY курсором. Курсоры FAST_FORWARD обеспечивают наименьшее количество накладных расходов на SQL Server.

Источник: Нажмите здесь

Ответ 3

FAST_FORWARD указывает, что он FORWARD_ONLY и READ_ONLY, то есть он использует наименьшее количество ресурсов сервера для его обработки... так что да, для производительности.

MSDN имеет полное описание вариантов курсора здесь.

FAST_FORWARD

  • Указывает курсор FORWARD_ONLY, READ_ONLY с включенной оптимизацией производительности. FAST_FORWARD не может быть указан, если также указывается SCROLL или FOR_UPDATE.

Ответ 4

(Я знаю, что это старо, но для потомков)

Чтобы развернуть курсоры "fast_forward" и "forward_only/read_only", разница заключается в использовании плана курсора.

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

FF курсоры будут использовать статический план, если это будет лучше, и никогда не будут понижать рейтинги планов курсоров (в основном, что касается "... с оптимизацией производительности".)

В целом динамические планы более оптимальны для небольших результирующих ( "низкие цели" ) курсоров и наоборот для статического.

Ответ 5

Просто имейте в виду, что FAST_FORWARD DYNAMIC... FORWARD_ONLY вы можете использовать с курсором STATIC.

Попробуйте использовать его в проблеме Хэллоуина, чтобы узнать, что произойдет!!!

IF OBJECT_ID('Funcionarios') IS NOT NULL
DROP TABLE Funcionarios
GO

CREATE TABLE Funcionarios(ID          Int IDENTITY(1,1) PRIMARY KEY,
                          ContactName Char(7000),
                          Salario     Numeric(18,2));
GO

INSERT INTO Funcionarios(ContactName, Salario) VALUES('Fabiano', 1900)
INSERT INTO Funcionarios(ContactName, Salario) VALUES('Luciano',2050)
INSERT INTO Funcionarios(ContactName, Salario) VALUES('Gilberto', 2070)
INSERT INTO Funcionarios(ContactName, Salario) VALUES('Ivan', 2090)
GO

CREATE NONCLUSTERED INDEX ix_Salario ON Funcionarios(Salario)
GO

-- Halloween problem, will update all rows until then reach 3000 !!!
UPDATE Funcionarios SET Salario = Salario * 1.1
  FROM Funcionarios WITH(index=ix_Salario)
 WHERE Salario < 3000
GO

-- Simulate here with all different CURSOR declarations
-- DYNAMIC update the rows until all of then reach 3000
-- FAST_FORWARD update the rows until all of then reach 3000
-- STATIC update the rows only one time. 

BEGIN TRAN
DECLARE @ID INT
DECLARE TMP_Cursor CURSOR DYNAMIC 
--DECLARE TMP_Cursor CURSOR FAST_FORWARD
--DECLARE TMP_Cursor CURSOR STATIC READ_ONLY FORWARD_ONLY
    FOR SELECT ID 
          FROM Funcionarios WITH(index=ix_Salario)
         WHERE Salario < 3000

OPEN TMP_Cursor

FETCH NEXT FROM TMP_Cursor INTO @ID

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT * FROM Funcionarios WITH(index=ix_Salario)

  UPDATE Funcionarios SET Salario = Salario * 1.1 
   WHERE ID = @ID

  FETCH NEXT FROM TMP_Cursor INTO @ID
END

CLOSE TMP_Cursor
DEALLOCATE TMP_Cursor

SELECT * FROM Funcionarios

ROLLBACK TRAN
GO

Ответ 6

Меня зовут Амана Хассан Бадави Мне 22 года. Я женат. Мой муж суданский. Я живу в Катаре. Я не работаю. Я не учусь. Мой муж - инженер-электронщик. Я хочу жить в Канаде, и я служу Канаде. Я очень хорошая девочка. Мне нравится учиться.