Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Самый быстрый курсор (опять)  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
BOL говорить что для FAST_FORWARD делается какая то внутренняя оптимизация, но умалчивает какая именно.
Пользовался, а теперь вдруг решил проверить и получается странное:

Таблица 60000 записей порядка 100 байт.
Выборка для курсора TOP 1000 WHERE по одному полю, ORDER BY по другому.
Замеряется отдельно время открытия курсора и возврата первого значения.
Возврат первого значения мгновенный для всех интересующих случаев,
а вот открытие курсора различается по длительности, причем самый медленный FAST_FORWARD примерно в два раза по сравнению с открытием по умолчанию.
Опция READ_ONLY так же дает сокращение времени в два раза.

Получается, что ресурсы тратятся на эту самую оптимизацию, чтобы потом записи возвращались быстрее?

Однако если обработать нужно небольшое количество записей скажем около 1000, то затраты на открытие могут перевесить выйгрыш от прокрутки.

Вопрос в каких условиях проявляются приемущества FAST_FORWARD если двигаемся только вперед, курсор только читаем и опция KEYSET вполне
устраивает?
25 апр 05, 12:10    [1494122]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
а вот открытие курсора различается по длительности, причем самый медленный FAST_FORWARD примерно в два раза по сравнению с открытием по умолчанию.


Может у Вас курсор конверитруется в static, что приводит к созданию копии в tempdb?

Fast forward-only cursors are implicitly converted to other cursor types when:

If the SELECT statement joins one or more tables with triggers to tables without triggers, the cursor is converted to a static cursor.
25 апр 05, 13:27    [1494506]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Не подходит, в запросе курсора только одна таблица SELECT TOP 1000 ....
Курсор объявляется в процедуре (во всех вариантах одна и та же процедура).
Процедура вызывается из одного окна QA по нескольку раз.
MSSQL 2000 sp3
Вот полученные результаты:

CURSOR READ_ONLY FOR .. Открытие: 400мс, Прокрутка: 40мс
CURSOR LOCAL FAST_FORWARD READ_ONLY .. Открытие: 600мс, Прокрутка: 30мс
CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC.. Открытие: 600мс, Прокрутка: 13мс

Собственно я о чем, получается что при 1000 строк в курсоре FAST_FORWARD не оправдывает своего названия?

Что делать, проверять все типы курсоров на различных объемах данных, чтобы выбрать оптимальный?
Почему BOL умалчивает?
25 апр 05, 15:43    [1495233]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
На прокрутке в курсоре 60000 зап все равно лидирует
CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
На MSSQL 7.00.699 та же ботва.

Никто не сталкивался?
Кто-нибудь замерте разницу у себя.
26 апр 05, 10:39    [1497094]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
USE master
GO
SET NOCOUNT ON
DECLARE @id int
DECLARE @CurTime datetime

DECLARE Cur CURSOR LOCAL READ_ONLY FOR
SELECT TOP 1000 id FROM sysobjects
SET @CurTime = GETDATE()
OPEN Cur
SELECT 'Open READ_ONLY', DATEDIFF(ms, @CurTime, GETDATE())
SET @CurTime = GETDATE()
FETCH NEXT FROM Cur INTO @id
WHILE @@FETCH_STATUS = 0 
  FETCH NEXT FROM Cur INTO @id
SELECT 'Fetch READ_ONLY', DATEDIFF(ms, @CurTime, GETDATE()) / 1000.0

CLOSE Cur
DEALLOCATE Cur

DECLARE Cur CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT TOP 1000 id FROM sysobjects
SET @CurTime = GETDATE()
OPEN Cur
SELECT 'Open FAST_FORWARD READ_ONLY', DATEDIFF(ms, @CurTime, GETDATE())
SET @CurTime = GETDATE()
FETCH NEXT FROM Cur INTO @id
WHILE @@FETCH_STATUS = 0 
  FETCH NEXT FROM Cur INTO @id
SELECT 'Fetch FAST_FORWARD READ_ONLY', DATEDIFF(ms, @CurTime, GETDATE()) / 1000.0
CLOSE Cur
DEALLOCATE Cur


DECLARE Cur CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC FOR
SELECT TOP 1000 id FROM sysobjects
SET @CurTime = GETDATE()
OPEN Cur
SELECT 'Open FORWARD_ONLY READ_ONLY STATIC', DATEDIFF(ms, @CurTime, GETDATE())
SET @CurTime = GETDATE()
FETCH NEXT FROM Cur INTO @id
WHILE @@FETCH_STATUS = 0 
  FETCH NEXT FROM Cur INTO @id
SELECT 'Fetch FORWARD_ONLY READ_ONLY STATIC', DATEDIFF(ms, @CurTime, GETDATE()) / 1000.0

CLOSE Cur
DEALLOCATE Cur


-------------- ----------- 
Open READ_ONLY 30

                                    
--------------- ------------------- 
Fetch READ_ONLY .060000

                                        
--------------------------- ----------- 
Open FAST_FORWARD READ_ONLY 10

                                                 
---------------------------- ------------------- 
Fetch FAST_FORWARD READ_ONLY .040000

                                               
---------------------------------- ----------- 
Open FORWARD_ONLY READ_ONLY STATIC 10

                                                        
----------------------------------- ------------------- 
Fetch FORWARD_ONLY READ_ONLY STATIC .030000

Microsoft SQL Server  2000 - 8.00.760 (Intel X86)   Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 1) 
26 апр 05, 10:49    [1497137]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
На приведенном pkarklin'ым скрипте у меня результаты такие:

для первого запуска:
-------------- ----------- 
Open READ_ONLY 70
                                    
--------------- ------------------- 
Fetch READ_ONLY .190000
                                        
--------------------------- ----------- 
Open FAST_FORWARD READ_ONLY 130
                                                 
---------------------------- ------------------- 
Fetch FAST_FORWARD READ_ONLY .020000
                                               
---------------------------------- ----------- 
Open FORWARD_ONLY READ_ONLY STATIC 0
                                                        
----------------------------------- ------------------- 
Fetch FORWARD_ONLY READ_ONLY STATIC .010000

для последующих запусков примерно такая средняя картина:
-------------- ----------- 
Open READ_ONLY 0
                                    
--------------- ------------------- 
Fetch READ_ONLY .030000
                                        
--------------------------- ----------- 
Open FAST_FORWARD READ_ONLY 0
                                                 
---------------------------- ------------------- 
Fetch FAST_FORWARD READ_ONLY .020000
                                               
---------------------------------- ----------- 
Open FORWARD_ONLY READ_ONLY STATIC 0

----------------------------------- ------------------- 
Fetch FORWARD_ONLY READ_ONLY STATIC .010000
26 апр 05, 10:58    [1497168]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Спасибо за сочуствие.

Аднака, общая тенденция наблюдается.

При данных начальных условиях я для себя выбираю
CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
Но на будущее все же интересно для каких - таких задач заточен FAST_FORWARD.

В копилку разработчика:
Кто - нибудь замечал его эффективнось и главное на каких задачах?
26 апр 05, 11:46    [1497484]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
ChA
Member

Откуда: Москва
Сообщений: 11316
Чуть подробнее о FAST_FORWARD в
BOL
Accessing and Changing Relational Data
Cursors
Cursor Types
Forward-only Cursors
Fast Forward-only Cursors
26 апр 05, 14:41    [1498524]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Т.е. FAST_FORWARD выигрывает только при вычитке данных внешним приложением и уменьшает производительность при использовании внутри хранимой процедуры, вопреки написанному в BOL DECLARE CURSOR.

Ладно, будем считать закрыто..
3 май 05, 15:42    [1513667]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Самый быстрый курсор (опять)  [new]
ic3b3rg
Member

Откуда:
Сообщений: 3
Если в операторе определения SELECT курсора использовать фразу TOP,то он преобразуется в ключевой тип. Так как ключевой курсор работает медленее чем статический, то и показало такое время.
14 июл 11, 14:15    [10973755]     Ответить | Цитировать Сообщить модератору
 Re: Самый быстрый курсор (опять)  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
ic3b3rg,

Озарение спусят 6 лет ?
14 июл 11, 14:48    [10974086]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить