Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
профайлер вам в руки. при выполнении из студии поставьте те же connection settings и того же пользователя. после - сравнивайте |
15 апр 15, 10:38 [17516864] Ответить | Цитировать Сообщить модератору |
ВМоисеев Member Откуда: Редкино Сообщений: 2491 |
>Crimean, сегодня, 10:38 [17516864] >Если тот же самый скрипт ... Попробуйте перенести цикл for в хранимую процедуру С уважением, Владимир. |
15 апр 15, 11:17 [17517154] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11568 |
а зачем транзакцию навесили в коде вокруг цикла своего? уберите. да и вообще странный код какой-то. |
15 апр 15, 12:16 [17517528] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
memcpy, а на беса вам вам таблок при вставке гарантированно 1 записи то ? Да и посмотрите статью - Быстро в ССМС и медленно из приложения |
15 апр 15, 12:52 [17517822] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
Я бы проверил вариант с транзакцией, может, банально блокировки держат. Второе, посмотрел бы профайлером, сравнил с запуском из SSMS, может что то можно понять по временам Ну и подразумевается, что SSMS и прога работают на одном компе? Иначе может объясняется разницей компов (может, SSMS запущена на сервере, и работает не через сеть?) |
||
15 апр 15, 12:59 [17517904] Ответить | Цитировать Сообщить модератору |
memcpy Member Откуда: Сообщений: 8 |
параметры коннекта одинаковые
без транзакции еще дольше 44 сек. Код - чисто тестовый, чтоб выяснить как оптимизировать боевую программу |
||||
15 апр 15, 12:59 [17517906] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
все так говорят. вы свое 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] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
а у меня 0,6 секунды вашим же "приложением" и по 10 000 записей вставляется - проверил |
15 апр 15, 14:33 [17518635] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
У вас же кластерный индекс по GUID |
||
15 апр 15, 15:59 [17519273] Ответить | Цитировать Сообщить модератору |
memcpy Member Откуда: Сообщений: 8 |
Пробовал ARITHABORT включать для клиентской части, а также выключать для SSMS. На время почти не влияет. Так что дело не в нем.
непонятно почему у меня так долго |
||
15 апр 15, 16:16 [17519398] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
memcpy, трас покажите. зазипьте и приатачьте. из приложения и из студии. |
15 апр 15, 16:46 [17519626] Ответить | Цитировать Сообщить модератору |
memcpy Member Откуда: Сообщений: 8 |
Нашел в чем проблема. Нельзя было под отладкой запускать, без отладки 0,6 сек Всем спасибо за помощь. |
15 апр 15, 16:54 [17519669] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
memcpy, я думаю проблема в этом WITH ( TABLOCK ) |
15 апр 15, 20:06 [17520483] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |