Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Клиентское приложение на Delphi, через ADO подключаемся к MS SQL (сейчас 2012, но все относится и к 2005).

В профайлере много лет мы видели вызовы SET FMTONLY (которые приводят к рекомпиляции процедур) в SQL:BatchCompleted.
Пару дней назад что трассил и случайно заметил, что в трассе нет SET FMTONLY и нет рекомпиляций под мои логином.

Начал разбираться и вот что выяснил:
1. Чудо случилось в Win7, под WinXP все также есть вызовы SET FMTONLY.
2. В Win7 драйвера DAC 6.1, в WinXP MDAC 2.81
3. SET FMTONLY всегда посылается при втором открытии датасета при третьем и последующих такого вызова нет.
4. При первом вызове SET FMTONLY может зваться, а может не зваться.
5. Это пример для OLEDB , с нативклиент аналогично, только set fmtonly в нижнем регистре (и иногда к запросу добавляет что-нить вроде where 1=2)

Кто-нибудь может высказать идеи или рецепт как сделать, чтобы SET FMTONLY не звался в WinXP?
Т.е. поведение было бы аналогично Win7


Пример кода:
procedure TForm1.Button5Click(Sender: TObject);
begin
  con1.ConnectionString := 'Provider=SQLOLEDB.1;'+
                           'User ID=***;'+
                           'Initial Catalog=***;'+
                           'Data Source=***;'+
                           'Password=***;';
  con1.Open();

  ADODataSet2.CommandText := 'select getdate() as ServerTime';
  ADODataSet2.CommandType := cmdText;

  ADODataSet2.Open;

  ADODataSet2.Close;
  ADODataSet2.Open;

  ADODataSet2.Close;
  ADODataSet2.Open;

  ADODataSet2.Close;
  ADODataSet2.Open;
end;


пример трассы, тут в первом вызове тоже есть SET FMTONLY:
SET NO_BROWSETABLE ON
SET FMTONLY ON select getdate() as ServerTime SET FMTONLY OFF
select getdate() as ServerTime
SET FMTONLY ON select getdate() as ServerTime SET FMTONLY OFF
select getdate() as ServerTime
select getdate() as ServerTime
select getdate() as ServerTime


во вложении скриншот профайлера, где при первом вызове не было SET FMTONLY

К сообщению приложен файл. Размер - 40Kb
9 сен 14, 15:21    [16554841]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
этот же вопрос в ветке Delphi:
https://www.sql.ru/forum/1114876/propal-set-fmtonly-v-win7-chto-sdelat-chtoby-propal-i-v-winxp
9 сен 14, 15:22    [16554850]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bator
Кто-нибудь может высказать идеи или рецепт как сделать, чтобы SET FMTONLY не звался в WinXP?

Сервер никак не может повлиять на то, какие команды клиентский код отсылает серверу для реализации своего функционала.
9 сен 14, 15:23    [16554862]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Glory
Bator
Кто-нибудь может высказать идеи или рецепт как сделать, чтобы SET FMTONLY не звался в WinXP?

Сервер никак не может повлиять на то, какие команды клиентский код отсылает серверу для реализации своего функционала.

Это понятно. Не понятно почему одно и тоже клиентское приложение в WinXP отправляет на сервер больше команд, чем в Win7.
9 сен 14, 15:30    [16554915]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bator
Не понятно почему одно и тоже клиентское приложение в WinXP отправляет на сервер больше команд, чем в Win7.

Потому что
- разные драйвера
- на разных оп.системах
9 сен 14, 15:32    [16554925]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Glory
Bator
Не понятно почему одно и тоже клиентское приложение в WinXP отправляет на сервер больше команд, чем в Win7.

Потому что
- разные драйвера
- на разных оп.системах

еще раз спасибо, кэп. я об этом тоже написал.
9 сен 14, 15:34    [16554935]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bator
еще раз спасибо, кэп. я об этом тоже написал.

И что вы тогда хотите то ?
Чтобы на сервере была опция "все работают одинаково" ?
Хотите однообразия - делайте все однообразным
9 сен 14, 15:36    [16554954]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Glory
Bator
еще раз спасибо, кэп. я об этом тоже написал.

И что вы тогда хотите то ?
Чтобы на сервере была опция "все работают одинаково" ?
Хотите однообразия - делайте все однообразным

спасибо, кэп, вы сегодня в ударе.
предвосхищу следующий ваш комментарий: нет, winxp на win7 везде поменять не можем.
9 сен 14, 15:42    [16555019]     Ответить | Цитировать Сообщить модератору
 Re: Пропал SET FMTONLY в Win7, что сделать, чтобы пропал и в WinXP ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Note the FMTONLY statements will be generated by the ADO client cursor code when it is trying to create the client side cursor.

Switch CursorLocation to clUseServer, CursorType to ctOpenForwardOnly and LockType to ltReadOnly
This should avoid it.


Due to your suggestions a got hold of the ADOQuery’s ParamCheck property. By disabling this, I got rid of the FMTONLY statements which increased the performance by almost 100 % – the number of round trips really is significant!
10 сен 14, 11:35    [16558179]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить