Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
VadymA
Guest |
Есть view вида select * from server1.db.dbo.table_1 union all select * from server1.db.dbo.table_2 union all select * from table_3 Таблицы на сервере server1.db.dbo.table_1 и server1.db.dbo.table_2 не предполагают каких либо изменений (архивные). Есть процедура которая обновляет 1-ну строку данных посредством этой вью. Причем обновление касается только таблицы table_3 на локальном сервере. Проблема в том, что из QA выполнение процедуры занимает 1 сек. Из приложения 2 минуты. Профайлер говорит, что основное время выполнения этой процедуры из приложения занимает тысячи sp_cursorfetch. Из QA никаких sp_cursorfetch не наблюдаются. Пользователь sa на обоих серверах. Все сервера 2008 SP3 EE Linked Server настроен с провайдером SQLNCLI. Как избавится от этих sp_cursorfetch? |
6 янв 14, 17:09 [15381672] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Да... Имеет ли к этому непотребству то, что приложение использует DBLib (ntwdblib)? |
6 янв 14, 17:14 [15381699] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Как вы вызываете процедуру из вашего приложения ? |
||
6 янв 14, 17:16 [15381706] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Серверу по-барабану как называется приложение. Для началу приведите к единому знаменателю DBCC USEROPTIONS |
6 янв 14, 17:19 [15381720] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, профайлер говорит: exec dbo.sc_Modify @Kind=1, @Query1= 'DECLARE @@SysExpect int,@@SysError int, @@SysCount int,@@SysRowId int,@@SysResult int, @@UsrError int,@@UsrCount int,@@UsrResult int EXEC @@SysResult=dbo.sc_SetDocumentState @Id=1474692, @Stamp=0x000000000B317E3E ,@ProcessFlag=3 ,@ProcessMode=0 SELECT @@SysCount=@@ROWCOUNT,@@SysError=@@ERROR IF @@UsrCount IS NOT NULL SET @@SysCount=@@UsrCount IF @@UsrError IS NOT NULL SET @@SysError=@@UsrError IF @@UsrResult IS NOT NULL SET @@SysResult=@@UsrResult RAISERROR(66667,1,1,@@SysCount,@@SysError,@@SysResult)' dbo.sc_Modify выполняет dbo.sc_SetDocumentState который изменяет запись в ProcessFlag=3 и ProcessMode=0 |
6 янв 14, 17:28 [15381750] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
aleks2, идентично на обоих серверах |
6 янв 14, 17:28 [15381755] Ответить | Цитировать Сообщить модератору |
Sergey Sizov Member Откуда: Сообщений: 1558 |
|
||
6 янв 14, 17:34 [15381771] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А где же тут "Профайлер говорит, что основное время выполнения этой процедуры из приложения занимает тысячи sp_cursorfetch." ? |
||
6 янв 14, 17:39 [15381802] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Sergey Sizov, Аналогично и в приложениях |
6 янв 14, 17:49 [15381844] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что вот так прямо в тексте приложения нативный TSQL код ? И что же это за язык программирования, где можно писать на TSQL ? |
||
6 янв 14, 17:51 [15381857] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, Смотрю профайлером на линкованный сервер. При выполнении этого кода из QA никаких sp_cursorfetch. А если из приложения: В профайлере declare @p1 int set @p1=180150453 declare @p3 int set @p3=1 declare @p4 int set @p4=16388 declare @p5 int set @p5=470790 exec sp_cursoropen @p1 output,N'select * from server1.db.dbo.table_1',@p3 output,@p4 output,@p5 output select @p1, @p3, @p4, @p5 и более 5000 exec sp_cursorfetch 180150451,16,1,1 |
6 янв 14, 17:54 [15381866] Ответить | Цитировать Сообщить модератору |
Sergey Sizov Member Откуда: Сообщений: 1558 |
|
||
6 янв 14, 17:54 [15381873] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Еще раз вопрос - как вашем клиентском приложении организован вызов процедуры ? |
||
6 янв 14, 17:55 [15381875] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, В приложении есть возможность выполнить SQL код |
6 янв 14, 17:55 [15381880] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Да что вы говорите. Т.е. ваше приложение - это sql server ? |
||
6 янв 14, 17:57 [15381889] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, Если бы приложение было мое.... Попробую разобраться, но скорее всего ничего не получится. Это консольное вин32 приложение |
6 янв 14, 18:00 [15381895] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, Вы меня не правильно поняли:-) В приложении есть возможность отправить SQL Query на сервер и получить результат) |
6 янв 14, 18:02 [15381901] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Разумеется есть. Вот только делать это можно по-разному. Что ваше приложение отправляет на локальный сервер, а не на линкованный ? |
||
6 янв 14, 18:12 [15381931] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
Glory, Я наверное не совсем Вас понимаю. В профайлере вижу только SQL:BatchStarting DBCC USEROPTIONS SQL:BatchCompleted DBCC USEROPTIONS Если Вы про процедуру, то только то, что я привел выше. (это все на локальный сервер) Если Вы про что то другое, то у меня исходников приложения нет. Или же я не понимаю/не знаю как посмотреть. |
6 янв 14, 18:35 [15382001] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
VadymA, Ваша программа в состоянии послать на сервер UPDATE [View] SET ... или нет? Если не в состоянии, то при чём здесь сервер? Скрипты создания таблиц с констрейнтами можете показать? Может, VIEW и не секционированная вовсе? P.S. Вот когда-то мне пришлось иметь дело с ERP PeopleSoft (оно же J.D.Edwards) EnterpriseOne (не дай бог никому!). Это "чудо" ВСЕ запросы на MSSQL выполняло через sp_cursorfetch. И никакого выхода в этом случае не было. Так реализовывалась постраничная выборка... |
6 янв 14, 19:00 [15382086] Ответить | Цитировать Сообщить модератору |
VadymA
Guest |
VadymA, Всем спасибо за помощь, проблему решил ALTER DATABASE [DB] SET AUTO_CREATE_STATISTICS ON WITH NO_WAIT GO ALTER DATABASE [DB] SET AUTO_UPDATE_STATISTICS ON WITH NO_WAIT GO ALTER DATABASE [DB] SET AUTO_UPDATE_STATISTICS_ASYNC ON WITH NO_WAIT GO |
6 янв 14, 23:54 [15382946] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Шаман живет в глухой тайге!... ЗЫ. Бубен он знатный нашел. |
||
7 янв 14, 10:54 [15383465] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |