Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) MSSQL: курсоры vs запросы для работы с ТП (число прочтений - 6168 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
MSSQL: курсоры vs запросы для работы с ТП
29. Октября 2007 :: 20:52
Печать  
Почитал тут про курсоры в MSSQL...
Получается, что курсоры - это всего лишь средство удобной работы с результатом выполнения запроса. Т.е. возможность делать частичные выборки из этого большого результата.

Первый абзац про курсоры из MSDN:
Цитата:
Operations in a relational database act on a complete set of rows. The set of rows returned by a SELECT statement consists of all the rows that satisfy the conditions in the WHERE clause of the statement. This complete set of rows returned by the statement is known as the result set. Applications, especially interactive online applications, cannot always work effectively with the entire result set as a unit. These applications need a mechanism to work with one row or a small block of rows at a time. Cursors are an extension to result sets that provide that mechanism.


Больше всего с точки зрения сабжа меня интересуют "динамические курсоры":
Цитата:
Dynamic cursors reflect all changes made to the rows in their result set when scrolling through the cursor. The data values, order, and membership of the rows in the result set can change on each fetch. All UPDATE, INSERT, and DELETE statements made by all users are visible through the cursor.


После прочтения мануала складывается следующее впечатление. ODBC-провайдер для ТП является рукопашной реализацией обычного динамического курсора MSSQL. Т.е. вместо того, чтобы использовать API сервера для получения небольшой порции данных одного большого запроса при помощи курсоров, в провайдере используется имитация этого API при помощи генерации отдельных запросов. Соответственно, вопрос: "зачем?" Т.е. чем использование запросов оказывается лучше для решения задачи?

Динамические курсоры не требуют больших затрат ресурсов сервера. Например, никак не задействуется tempdb, как это происходит в статических курсорах. Не происходит задействование больших объемов памяти на клиенте, как это происходит в случае клиентских курсоров. Динамические курсоры всегда получают обновленные данные, если данные поменялись другими пользователями.

"Нежелательные артефакты", которые некоторые получают при использовании курсоров, скорее всего, объясняются "неправильным приготовлением" курсоров, т.к. курсоры - всего лишь средство получить часть выборки большого запроса. Т.е. пока у меня возникает впечатление, что использование курсоров функционально эквивалентно ручному получению нужных частей большой выборки при помощи запросов.

Грубо говоря, получается, что в ODBC-провайдере "изобретен велосипед" вместо использования готовых средств сервера. Почему? Чем это вызвано? Я вижу только одну причину. Провайдер может работать с разными ODBC-драйверами. В том числе и для таких СУБД, которые не поддерживают серверные курсоры. Но эта причина не является аргументом против курсоров и эта причина не является аргументом в пользу превосходства "подхода запросов" над "подходом курсоров". Вывод: не получим ли мы какие-либо выгоды, создав провайдер, специально заточенный под курсоры MSSQL? Например, ускорение работы или упрощение организации провайдера?

Очень интересует мнение людей, имеющих хорошее представление о курсорах (как минимум, хорошо изучивших документацию Подмигивание) Интересует, насколько хорошо работают курсоры. Какую нагрузку создают на сервер? Удобнее ли они запросов? Удобны ли они вообще в использовании? Может, их использовать настолько сложно, что лучше использовать запросы? Вообще, интересен любой практический опыт работы с курсорами.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #1 - 30. Октября 2007 :: 03:27
Печать  
Изучение возможностей OLE DB для работы с курсорами показывает, что работа с курсорами очень слабо отличается от простого выполнения запросов и простой выборки результата. Достаточно правильно установить нужные свойства OLE DB провайдера.

А это значит, что мой статический провайдер для Фокспро легким движением руки превращается в элегантный динамический провайдер для MSSQL Улыбка Ура, товарищи!  Очень довольный
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #2 - 30. Октября 2007 :: 03:50
Печать  
Uzhast писал(а) 29. Октября 2007 :: 20:52:
Почитал тут про курсоры в MSSQL...
Интересует, насколько хорошо работают курсоры. Какую нагрузку создают на сервер? Удобнее ли они запросов? Удобны ли они вообще в использовании? Может, их использовать настолько сложно, что лучше использовать запросы? Вообще, интересен любой практический опыт работы с курсорами.


Читал Хендерсона по поводу использования курсоров MSSQL в коде TSQL, он пишет в чем заключается "правильное использование курсоров - это динамические запросы, операции ориентированные на запись, и прокручивание формы". Причем прокручивание формы разработчику удобно реализовать с использованием прокручиваемых курсоров (DINAMIC, SCROLL). STATIC курсоры не всегда удобны, т.к. если исходные данные изменились, то в курсоре изменений не увидим, динамический  курсор видит изменения только когда обращается к записи, т.е. при использовании FETCH, к тому же при больших объёмах данных это сильная нагрузка на скуль, тоже самое относится и к KEYSET курсорам. В 1С наверное журналы документов и формы справочников, самое место для применения динамических курсоров.
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #3 - 30. Октября 2007 :: 04:28
Печать  
ev-kov писал(а) 30. Октября 2007 :: 03:50:
Читал Хендерсона по поводу использования курсоров MSSQL в коде TSQL

Это вот этот имеется в виду? http://www.knigka.info/2007/09/07/professionalnoe_rukovodstvo_po_transactsql.htm...

ev-kov писал(а) 30. Октября 2007 :: 03:50:
динамический  курсор видит изменения только когда обращается к записи, т.е. при использовании FETCH, к тому же при больших объёмах данных это сильная нагрузка на скуль

А не зависит ли это от запроса? Например, если запрос на индексы ложится плохо, то нагрузка будет здоровая. А если хорошо (например, постраничная выборка из журнала документов), то, может, нормально будет?

ev-kov писал(а) 30. Октября 2007 :: 03:50:
В 1С наверное журналы документов и формы справочников, самое место для применения динамических курсоров.

Согласен. Правда, таки осознал проблему курсора - не понятно, как перейти на произвольную строку курсора по значению ключа. Т.е. не понятно, как, например, в ТП выделить произвольный документ. Или как организовать быстрый поиск по наименованию элемента справочника. Или я еще просто не все возможности курсоров знаю...
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #4 - 30. Октября 2007 :: 06:57
Печать  
Uzhast писал(а) 30. Октября 2007 :: 04:28:
Да

Uzhast писал(а) 30. Октября 2007 :: 04:28:
А не зависит ли это от запроса? Например, если запрос на индексы ложится плохо, то нагрузка будет здоровая. А если хорошо (например, постраничная выборка из журнала документов), то, может, нормально будет?
Нет, индексы и tempdb это параллельные вещи, просто серверу ворочаться с тяжелой временной таблицей нелегко.

Uzhast писал(а) 30. Октября 2007 :: 04:28:
как перейти на произвольную строку курсора по значению ключа. Т.е. не понятно, как, например, в ТП выделить произвольный документ. Или как организовать быстрый поиск по наименованию элемента справочника.
Средствами курсора похоже никак, у динамического курсора (DYNAMIC SCROLL), поддерживают все параметры инструкции FETCH, за исключением параметра ABSOLUTE. Это означает что нельзя делать текущей строку отстоящую на n записей от той которая в данный момент является текущей. А для журнала доков или справочника нужен курсор именно  DYNAMIC SCROLL

  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #5 - 30. Октября 2007 :: 07:14
Печать  
ev-kov писал(а) 30. Октября 2007 :: 06:57:
Нет, индексы и tempdb это параллельные вещи, просто серверу ворочаться с тяжелой временной таблицей нелегко.

Стоп. Не понял. Вроде по МСДН в tempdb складываются статические курсоры и "Keyset-driven". Или, вернее, динамические курсоры создают наименьшую нагрузку:
Цитата:
Dynamic cursors detect all changes but consume more resources while scrolling, although they make the lightest use of tempdb.


ev-kov писал(а) 30. Октября 2007 :: 06:57:
Uzhast писал(а) 30. Октября 2007 :: 04:28:
как перейти на произвольную строку курсора по значению ключа. Т.е. не понятно, как, например, в ТП выделить произвольный документ. Или как организовать быстрый поиск по наименованию элемента справочника.
Средствами курсора похоже никак, у динамического курсора (DYNAMIC SCROLL), поддерживают все параметры инструкции FETCH, за исключением параметра ABSOLUTE. Это означает что нельзя делать текущей строку отстоящую на n записей от той которая в данный момент является текущей. А для журнала доков или справочника нужен курсор именно  DYNAMIC SCROLL

А fetch relative? В тандеме с fetch first? Правда, индекс записи еще узнать надо...
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #6 - 30. Октября 2007 :: 07:26
Печать  
Uzhast писал(а) 30. Октября 2007 :: 07:14:
Стоп. Не понял. Вроде по МСДН в tempdb складываются статические курсоры и "Keyset-driven". Или, вернее, динамические курсоры создают наименьшую нагрузку:
да, похоже непоняли друг друга, так и есть динамические курсоры меньше грузят sql сервер.

Uzhast писал(а) 30. Октября 2007 :: 04:28:
А fetch relative? В тандеме с fetch first? Правда, индекс записи еще узнать надо...
Это не проверял, но допустим что возможно, что это даст ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #7 - 30. Октября 2007 :: 07:30
Печать  
ev-kov писал(а) 30. Октября 2007 :: 07:26:
Это не проверял, но допустим что возможно, что это даст ?

Ну, допустим, вдруг есть возможность узнать индекс записи по ключу каким-нибудь хитрозадым запросом. Тогда получается возможность напрямую позиционировать курсор на нужную запись по ключу или по частичному совпадению наименования. Соответственно, появляется возможность сделать полноценный провайдер для ТП на курсорах.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #8 - 30. Октября 2007 :: 07:37
Печать  
Uzhast писал(а) 30. Октября 2007 :: 07:30:
появляется возможность сделать полноценный провайдер для ТП на курсорах.

Немного ОФФ: бросаешь ДБФников?  Плачущий
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #9 - 30. Октября 2007 :: 07:39
Печать  
JohnyDeath писал(а) 30. Октября 2007 :: 07:37:
Uzhast писал(а) 30. Октября 2007 :: 07:30:
появляется возможность сделать полноценный провайдер для ТП на курсорах.

Немного ОФФ: бросаешь ДБФников?  Плачущий

Нет Улыбка Просто не хочу всю жисть просидеть на ДБФ Улыбка
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #10 - 30. Октября 2007 :: 10:43
Печать  
Uzhast писал(а) 30. Октября 2007 :: 07:30:
ev-kov писал(а) 30. Октября 2007 :: 07:26:
Это не проверял, но допустим что возможно, что это даст ?

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


Нет, к сожалению нельзя этого сделать (напрямую позиционировать курсор на нужную запись по ключу), т.к.  количество строк в курсоре тоже нельзя определить - строки могут "попадать в курсор" по мере необходимости, и исчезать кстати тоже могут.
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: MSSQL: курсоры vs запросы для работы с ТП
Ответ #11 - 05. Ноября 2007 :: 21:28
Печать  
ev-kov писал(а) 30. Октября 2007 :: 10:43:
Нет, к сожалению нельзя этого сделать (напрямую позиционировать курсор на нужную запись по ключу), т.к.  количество строк в курсоре тоже нельзя определить - строки могут "попадать в курсор" по мере необходимости, и исчезать кстати тоже могут.

Вообще-то, есть один изуверский метод, на мой взгляд Улыбка Допустим записи нашего курсора упорядочены по выражению orderdescr. Тогда можно было бы получить приблизительную позицию нужной записи таким образом:

1. SELECT orderdescr FROM ... WHERE ID = OurID

2. SELECT COUNT (*) FROM ... WHERE orderdescr <= orderdescr_from_step1

Ну и далее переходим по результату из этого COUNT. Но способ этот явно попахивает маразмом. Хотя, если по orderdescr есть кластеризованный индекс, то SELECT COUNT () очень походит на получение физического номера записи - как dBase Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать