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

Откуда:
Сообщений: 8
Добрый день.
Есть табличка и хранимая процедура, вставляющая строки.
CREATE TABLE [dbo].[tbTest](
	[Id] [UNIQUEIDENTIFIER] NOT NULL,
	[Param1] [UNIQUEIDENTIFIER] NULL,
	[Param2] [UNIQUEIDENTIFIER] NULL,
	[Param3] [UNIQUEIDENTIFIER] NULL,
 CONSTRAINT [PK_tbTest] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE PROCEDURE [dbo].[spData_I]
    (
      @Param1 UNIQUEIDENTIFIER ,
      @Param2 UNIQUEIDENTIFIER ,
      @Param3 UNIQUEIDENTIFIER
    )
AS
    BEGIN
        SET NOCOUNT ON;

        INSERT  dbo.tbTest WITH ( TABLOCK )
                ( Id, Param1, Param2, Param3 )
        VALUES  ( NEWID(), @Param1, @Param2, @Param3 );
    END;


Вставка 10000 строк из клиентского приложения, вызывая SP, длится 36 сек

using (SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=True"))
 {
     try
     {
         connection.Open();

         System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

         using (SqlCommand cmd = new SqlCommand("spData_I", connection))
         {
             SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
             cmd.Transaction = transaction;

             cmd.CommandType = CommandType.StoredProcedure;
             cmd.Parameters.Add("@Param1", SqlDbType.UniqueIdentifier);
             cmd.Parameters.Add("@Param2", SqlDbType.UniqueIdentifier);
             cmd.Parameters.Add("@Param3", SqlDbType.UniqueIdentifier);

             Guid guid1 = new Guid("11111111-1111-1111-1111-111111111111");
             Guid guid2 = new Guid("22222222-2222-2222-2222-222222222222");
             Guid guid3 = new Guid("33333333-3333-3333-3333-333333333333");

             sw.Start();
             for (int i = 0; i < 10000; i++)
             {
                 cmd.Parameters["@Param1"].Value = guid1;
                 cmd.Parameters["@Param2"].Value = guid2;
                 cmd.Parameters["@Param3"].Value = guid3;

                 cmd.ExecuteNonQuery();
             }

             transaction.Commit();
             sw.Stop();
         }

         MessageBox.Show(sw.Elapsed.TotalSeconds.ToString("N3"));

     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }


Если тот же самый скрипт перехватить в профайлере и потом запустить в SQL Management Studio,то время выполнения 3-4 сек

exec spData_I @Param1='11111111-1111-1111-1111-111111111111',@Param2='22222222-2222-2222-2222-222222222222',@Param3='33333333-3333-3333-3333-333333333333'
go
exec spData_I @Param1='11111111-1111-1111-1111-111111111111',@Param2='22222222-2222-2222-2222-222222222222',@Param3='33333333-3333-3333-3333-333333333333'
go
...


В чем причина долгой отработки через клиентское приложение (в 9-10 раз!!) ?
И можно ли ускорить?
15 апр 15, 10:07    [17516695]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13147
профайлер вам в руки. при выполнении из студии поставьте те же connection settings и того же пользователя. после - сравнивайте
15 апр 15, 10:38    [17516864]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2491
>Crimean, сегодня, 10:38 [17516864]
>Если тот же самый скрипт ...

Попробуйте перенести цикл for в хранимую процедуру

С уважением,
Владимир.
15 апр 15, 11:17    [17517154]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
а зачем транзакцию навесили в коде вокруг цикла своего? уберите. да и вообще странный код какой-то.
15 апр 15, 12:16    [17517528]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
memcpy,

а на беса вам вам таблок при вставке гарантированно 1 записи то ?
Да и посмотрите статью - Быстро в ССМС и медленно из приложения
15 апр 15, 12:52    [17517822]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31785
Konst_One
да и вообще странный код какой-то.
ИМХО нормальный код, всё по правилам.

Я бы проверил вариант с транзакцией, может, банально блокировки держат.

Второе, посмотрел бы профайлером, сравнил с запуском из SSMS, может что то можно понять по временам

Ну и подразумевается, что SSMS и прога работают на одном компе? Иначе может объясняется разницей компов (может, SSMS запущена на сервере, и работает не через сеть?)
15 апр 15, 12:59    [17517904]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
memcpy
Member

Откуда:
Сообщений: 8
Crimean
профайлер вам в руки. при выполнении из студии поставьте те же connection settings и того же пользователя. после - сравнивайте

параметры коннекта одинаковые

Konst_One
а зачем транзакцию навесили в коде вокруг цикла своего? уберите. да и вообще странный код какой-то.

без транзакции еще дольше 44 сек. Код - чисто тестовый, чтоб выяснить как оптимизировать боевую программу
15 апр 15, 12:59    [17517906]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
o-o
Guest
memcpy
параметры коннекта одинаковые

все так говорят.
вы свое ARITHABORT из приложения проверяли?

And when it comes to SQL Server Management Studio, you might want do yourself a favour, and open this dialog and uncheck SET ARITHABORT.
This will change your default setting for ARITHABORT when you connect with SSMS.
It will not help you to make your application to run faster,
but you will not at least have to be perplexed by getting different performance in SQL Server Management Studio.


К сообщению приложен файл. Размер - 27Kb
15 апр 15, 13:44    [17518293]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а у меня 0,6 секунды вашим же "приложением" и по 10 000 записей вставляется - проверил
15 апр 15, 14:33    [17518635]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31785
memcpy
В чем причина долгой отработки через клиентское приложение (в 9-10 раз!!) ?
И можно ли ускорить?
Кстати, скорость будет сильно зависеть от напоненности таблицы, так что нужно аккуратно мерить.
У вас же кластерный индекс по GUID
15 апр 15, 15:59    [17519273]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
memcpy
Member

Откуда:
Сообщений: 8
Пробовал ARITHABORT включать для клиентской части, а также выключать для SSMS.
На время почти не влияет. Так что дело не в нем.
Crimean
а у меня 0,6 секунды вашим же "приложением" и по 10 000 записей вставляется - проверил

непонятно почему у меня так долго
15 апр 15, 16:16    [17519398]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
Crimean
Member

Откуда:
Сообщений: 13147
memcpy,

трас покажите. зазипьте и приатачьте. из приложения и из студии.
15 апр 15, 16:46    [17519626]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
memcpy
Member

Откуда:
Сообщений: 8
Нашел в чем проблема. Нельзя было под отладкой запускать, без отладки 0,6 сек
Всем спасибо за помощь.
15 апр 15, 16:54    [17519669]     Ответить | Цитировать Сообщить модератору
 Re: Долгий вызов хранимой процедуры  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4805
memcpy,

я думаю проблема в этом

WITH ( TABLOCK )
15 апр 15, 20:06    [17520483]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить