powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / MSSQL и другие & клиентские курсоры
18 сообщений из 68, страница 3 из 3
MSSQL и другие & клиентские курсоры
    #33965206
Фотография Infernal V. Raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КСкажу так. мне просто не нравится идея качать весь запрос на клиента. Надеюсь, больше возражений не будет ?Заведомо неверно. Запрос должен ограничить набор данных по критериям, для этого и существует язык запросов. Другое дело как результат фетчить, сразу или порциями. Вообще вопрос для ветки Delphi. Там вам объяснят, если надо про асинхронные запросы и про нормальный фетчинг. Кстати нормально работают связки по ADO, а уж по SDAC тем более. СУБД тут не при чем, как уже говорилось.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33969579
Dmitriy Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello К,
"К" <nospam@sql.ru>; wrote:

К> А вообще-то изначально был вопрос "могут ли так другие сервера".
К> Вместо этого мне пытаются доказать что мне это не надо... это все
К> равно что я спрошу "как в плеере включить радио" а мне скажут
К> "запиши весь эфир на кассету и слушай"

Правильная терминология определена еще в ODBC. Сначала открываются
connection, затем на него вешаются statements.
MSSQL - только один statement per connection,
MS Access (если, конечно, ее можно считать сервером) - 256,
Oracle - несколько, точно не знаю.

Мысль о том, что дело не в сервере, а в интерфейсе доступа (ODBC, OCI и
т.п.), не лишена основания. Хотя возможности интерфейса завязаны на сервер.
Как MS не пыжится, выдумавая новые интерфейсы (OLEDB и проч.), но
ограничение, имеющееся при работе с ODBC драйвером, остается и для них.
Видимо, в сервере что-то жестко зашито.
--
Sincerely,
Dmitriy Ivanov


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970084
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitriy IvanovMSSQL - только один statement per connection,
MS Access (если, конечно, ее можно считать сервером) - 256,
Oracle - несколько, точно не знаю.
Не знаю, как ведет себя Oracle via ODBC, но думаю так же, как и в других случаях. Количество курсоров, которые могут быть одновременно открыты одной сессией, задается системным параметром open_cursors и относится ко всем видам курсоров (запросы с клиента, явные и неявные курсоры в выполняемых ХП и триггерах, динамическом SQL итд).

Оптимальное значение open_cursors зависит от приложения. В большинстве случаев я полагаю правильным ограничить этот параметр достаточно небольшим значением (20-40); это позволяет вовремя (на этапе разработки) отловить утечки в приложении.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970484
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitriy Ivanov
Правильная терминология определена еще в ODBC. Сначала открываются
connection, затем на него вешаются statements.
MSSQL - только один statement per connection ,

Для MS SQL информация не соответствует действительности. Ниже код, который явно содержит более одного statement per connection (если я конечно правильно понял, что Вы имеете ввиду под этим).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
BEGIN TRAN

DECLARE
    @ITEMNO VARCHAR( 24 ) -- код товара
    ,@_ITEMNO VARCHAR( 24 )-- текущая позиция
    ,@D DATETIME -- дата периода
    ,@OPENUM INT -- начальный остаток
    ,@_OPENUM INT -- расчетный остаток для след. периода
    ,@OPENCOST DECIMAL( 18 , 2 )-- начальная стоимость
    ,@_OPENCOST DECIMAL( 18 , 2 )-- расчетная стоимость для след. периода
    ,@INPUTUM INT -- поступление, кол-во
    ,@INPUTCOST DECIMAL( 18 , 2 )-- стоимость поступивщего
    ,@OUTUM INT -- выбытие, кол-во
    ,@OUTCOST DECIMAL( 18 , 2 )-- расчетная себестоимость
    ,@I INT -- номер периода

DECLARE C CURSOR FOR
SELECT TOP  100  PERCENT ITEMNO,PDATE,OH,AMOH,P,AMP,S
FROM INV01 WHERE PDATE >= :StartPeriod
ORDER BY ITEMNO,PDATE

OPEN C

FETCH NEXT FROM C INTO @ITEMNO,@D,@OPENUM,@OPENCOST,@INPUTUM,@INPUTCOST,@OUTUM
SET @_ITEMNO = @ITEMNO
SET @I =  0 
SET @_OPENUM = @OPENUM
SET @_OPENCOST = @OPENCOST

WHILE @@FETCH_STATUS =  0 
BEGIN
SET @OUTCOST =  0 
IF (@_OPENUM + @INPUTUM) >  0 
    SET @OUTCOST = (@_OPENCOST + @INPUTCOST)/(@_OPENUM + @INPUTUM)*@OUTUM

-- Обновление расчетной таблицы
IF @I >  0 
    UPDATE INV01 SET
    OH = @_OPENUM
    ,AMOH = @_OPENCOST
    ,CMS = @OUTCOST
    WHERE ITEMNO = @ITEMNO AND PDATE = @D
ELSE
    UPDATE INV01 SET CMS = @OUTCOST
    WHERE ITEMNO = @ITEMNO AND PDATE = @D
-- Расчет остатков для следующего периода
SET @_OPENUM = @_OPENUM + @INPUTUM - @OUTUM
SET @_OPENCOST = (@_OPENCOST + @INPUTCOST) - @OUTCOST


FETCH NEXT FROM C INTO @ITEMNO,@D,@OPENUM,@OPENCOST,@INPUTUM,@INPUTCOST,@OUTUM
SET @I = @I +  1 

IF @ITEMNO <> @_ITEMNO
BEGIN
        SET @_ITEMNO = @ITEMNO
        SET @I =  0 
        SET @_OPENUM = @OPENUM
        SET @_OPENCOST = @OPENCOST
END -- новая позиция

END -- все позиции обработаны

CLOSE C
DEALLOCATE C

IF @@ERROR <>  0 
ROLLBACK TRAN
ELSE
COMMIT TRAN;
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970580
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm, и что это демонстрирует?
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970653
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это демонстрирует то, что в драйверах доступа к MS SQL нет ограничения на statements, о котором сказал Dmitriy Ivanov, ничего больше. Приведенный код не исполняется как ХП на сервере.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970668
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm
Ниже код, который явно содержит более одного statement per connection
(если я
конечно правильно понял, что Вы имеете ввиду под этим).

Судя по всему - неправильно. Имелось ввиду, конечно не SQL statement
вообще, а открытый недофетченный курсор. Т.е. если бы в Вашем примере
было так:
Код: plaintext
1.
2.
3.
4.
5.
6.
DECLARE CURSOR C...
DECLARE CURSOR D...
OPEN C
OPEN D
FETCH C
FETCH D
было бы гораздо интереснее.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970695
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, такое тоже вне сервера MS SQL работает.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33970723
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
-- Курсор Потребности
DECLARE MS CURSOR FOR
select
d.itemid, -- Продукт
d.id, -- Запись BOM
d.trlineid, -- Строка заявки
d.nodelevel, -- уровень вложенности
d.custid,
d.whid,
d.parentid,
d.btype, -- тип накладной
d.margin as margin,
d.pqty, -- число заявок
t.vatprc, -- ндс (тип реализации)
c.postcode
from invtrbom d
inner join org c on c.id = d.custid
inner join invtrline t on t.id = d.trlineid
where
d.batchid = :pBatchId
.....

OPEN MS

FETCH NEXT FROM MS INTO @mitemid,@qty,@lineid,@trlineid,@nodelevel,@custid,@whid,@parentid,@btype,@margin,@pqty,@pvatprc,@postgrp
WHILE @@FETCH_STATUS =  0 
BEGIN

    DECLARE C CURSOR FOR
    select
    d.id, -- складская запись
    d.itemid, -- продукт
    round(d.qty, 3 ) as oh, -- в наличии
    d.price, -- учетная цена
    d.sertnum,
    d.rdate,
    case when isnull(@pvatprc, 0 ) =  18  then @pvatprc else isnull(d.vatprc, 0 ) end as vat
    from ##invtmp d
    where ((d.itemid = @mitemid) or (d.parentid is not null and d.parentid = ...

    OPEN C
....

Иногда приходится выносить такие расчеты на сервер приложений. Правда получается только в MS SQL.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33971055
Dmitriy Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello Dimitry,
"Dimitry Sibiryakov" <nospam@sql.ru>; wrote:

DS> Ниже код, который явно содержит более одного statement per
DS> connection (если я
DS> конечно правильно понял, что Вы имеете ввиду под этим).
DS>
DS>
DS> Судя по всему - неправильно. Имелось ввиду, конечно не SQL
DS> statement вообще, а открытый недофетченный курсор. Т.е. если бы в
DS> Вашем примере было так:
DS>
DS> DECLARE CURSOR C...
DS> DECLARE CURSOR D...
DS> OPEN C
DS> OPEN D
DS> FETCH C
DS> FETCH D
DS>
DS> было бы гораздо интереснее.

Да, именно такое я имел в виду. Просто statement в терминологии ODBC - это
структура для выполнения SQL-предложения, ссылка на которую осуществляется
через указатель (handle). Предложение может быть не обязательно типа DQL,
т.е. SELECT, как для курсора, но и DML (UPDATE, INSERT и т.п.) или DDL
(CREATE ...).

Выражаясь более низко, в MSSQL на один открытый хэндл коннекта может
приходиться не более одного открытого хэндла предложения.
--
Sincerely,
Dmitriy Ivanov


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972530
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm-- Курсор Потребности
Хм. Может быть, я ошибаюсь, но как мне представляется, тот скрипт, который Вы привели, весь целиком является единственным statement-ом.

Насколько я понимаю, Дмитрий имеет в виду примерно следующее. Фрагмент кода

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  Query1.SQL.Text := 'select * from таблица_на_миллиард_строк' ;
  Query2.SQL.Text := 'select * from другая_таблица_на_миллиард_строк' ;
  Query1.Open ;
  Query2.Open ;
  Query1.Next ;
  Query2.Next ;
  Query1.Next ;
  Query2.Next ;
  Query1.Close ;
  Query2.Close ;
end ;

в случае MSSQL не имеет шанса на быстрое выполнение.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972568
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer iscrafm-- Курсор Потребности
Хм. Может быть, я ошибаюсь, но как мне представляется, тот скрипт, который Вы привели, весь целиком является единственным statement-ом.

там их несколько на самом деле, это попался первый в точности как Дмитрий описал. Причем такие фишки проходят только с MS SQL, остальные принимают только по одному. Тот примерчик что Вы привели конечно клиентский курсор не потянет. Вернее потянет но не "на_миллиард_строк". Хотя кто его знает что каждый понимает под "statement" :)
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972574
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer iscrafm-- Курсор Потребности
Хм. Может быть, я ошибаюсь, но как мне представляется, тот скрипт, который Вы привели, весь целиком является единственным statement-ом.

Насколько я понимаю, Дмитрий имеет в виду примерно следующее. Фрагмент кода

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  Query1.SQL.Text := 'select * from таблица_на_миллиард_строк' ;
  Query2.SQL.Text := 'select * from другая_таблица_на_миллиард_строк' ;
  Query1.Open ;
  Query2.Open ;
  Query1.Next ;
  Query2.Next ;
  Query1.Next ;
  Query2.Next ;
  Query1.Close ;
  Query2.Close ;
end ;

в случае MSSQL не имеет шанса на быстрое выполнение.Всё зависит от того, чем являются Query1 и Query2 :
В случае с BDE строка Query2.Open вызовет неявно Query1.FetchAll.
В случае с ADO строка Query2.Open вызовет неявно новый коннект, в котором и будут производится действия с Query2
За остальные компоненты не скажу.

Как уже упоминалось выше, в MSSQL 2005 ввели Multiple Active Result Sets (MARS)
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972575
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmПричем такие фишки проходят только с MS SQL, остальные принимают только по одномуГм. Вы уверены ? Можно огласить список остальных ? :)
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972586
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, может я конечно чего-то не понимаю, но мы в этом топике обсуждаем клиентские курсоры, а MARS расширяет возможности серверных. Или мы о разных курсорах общаемся? Клиентский курсор никаких неявных коннектов не создает. Почти уверен в этом, т.к. у нас работает возможность ограничивать количество подключений к СУБД, т.е. сервер приложений держит столько коннектов к БД, сколько ему указано и на это количество выстраивает пул запросов. Думаю что если бы создавались неявные, то они бы блокировались... С серверными курсами да, похоже на действительность. Могу ошибаться :)
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972590
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm softwarerХм. Может быть, я ошибаюсь, но как мне представляется, тот скрипт, который Вы привели, весь целиком является единственным statement-ом.
там их несколько на самом деле,
Не думаю. Если грубо и на пальцах, Statement - это объект, обладающий свойствами Connection (соединение, к которому относится), Text (собственно текст команды), а также методами Prepare и Execute. То, что Вы написали - это Text одного-единственного statement-а. MSSQL, в отличие допустим от Oracle, умеет воспринимать и выполнять подобные скрипты, но из этого никак не следует, что в этом участвует несколько statement-ов (напомню, statement именно в том смысле, который употребил Дмитрий. В дельфе это понятие представлено различными наследниками TDataSet).

iscrafmТот примерчик что Вы привели конечно клиентский курсор не потянет.
Если так, то Дмитрий видимо прав в своем исходном утверждении. Не знаю как другие, а Oracle такой пример выполнит без малейших проблем. То есть расхождение реально есть, и именно в случае гридов оно "стрельнет" при попытке переноса приложения.
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33972613
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmhvlad, может я конечно чего-то не понимаю, но мы в этом топике обсуждаем клиентские курсорыДа, конечно клиентские

iscrafmа MARS расширяет возможности серверныхКак раз клиентских :)
Во-первых, это из "Features of SQL Native Client",
во-вторых, из вышеупомянутой ссылки
BOLSQL Server 2005 provides support for multiple active result sets (MARS) in applications accessing the Database Engine. In earlier versions of SQL Server, database applications could not maintain multiple active statements on a connection. When using SQL Server default result sets, the application had to process or cancel all result sets from one batch before it could execute any other batch on that connection. SQL Server 2005 introduces a new connection attribute that allows applications to have more than one pending request per connection, and in particular, to have more than one active default result set per connection.

MARS simplifies application design with the following new capabilities:

Applications can have multiple default result sets open and can interleave reading from them.

Applications can execute other statements (for example, INSERT, UPDATE, DELETE, and stored procedure calls) while default result sets are open.

iscrafmИли мы о разных курсорах общаемся? Клиентский курсор никаких неявных коннектов не создает. Почти уверен в этом, т.к. у нас работает возможность ограничивать количество подключений к СУБД, т.е. сервер приложений держит столько коннектов к БД, сколько ему указано и на это количество выстраивает пул запросов. Думаю что если бы создавались неявные, то они бы блокировались... С серверными курсами да, похоже на действительность. Могу ошибаться :)Пул запросов или пул коннектов ? :)
Возможно в вашем сервере приложений просто нет ситуации когда в одном коннекте нужно иметь открытыми более одного клиентского курсора - например вы используете серверные курсоры, или сразу кешируете на клиенте всю выборку
...
Рейтинг: 0 / 0
MSSQL и другие & клиентские курсоры
    #33973076
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladПул запросов или пул коннектов ? :)

и пул коннектов и пул запросов, если Вы уж так ставите вопрос.
...
Рейтинг: 0 / 0
18 сообщений из 68, страница 3 из 3
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / MSSQL и другие & клиентские курсоры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]