Задать вопрос
2ord
@2ord

Почему работа с SQL Server через gem activerecord-sqlserver-adapter такая медленная?

Для проекта на Ruby необходимо использовать SQL Server 2008 :-/
Используется адаптер activerecord-sqlserver-adapter версии 4.1.4 (можно сказать относительно новый).
В отличие от драйвера mysql2 всё работает жутко медленно, хотя SQL Server находится в той же подсети. Где это видано, чтобы обычный INSERT выполнялся итого за 600мс?

Хотя у меня есть некоторое подозрение. Кто-нибудь знает почему каждый INSERT выполняется через "EXEC sp_executesql", да ещё и обворачивается в транзакцию, хотя в коде я этого не просил?

Может, по умолчанию включен какой-то флаг для отладки, который замедляет работу?

D, [2016-12-01T17:08:02.700498 #10570] DEBUG -- :   SQL (202.0ms)  BEGIN TRANSACTION
D, [2016-12-01T17:08:02.903759 #10570] DEBUG -- :   SQL (200.8ms)  EXEC sp_executesql N'INSERT INTO [dbo].[channels_mappings] ([channel_id], [project_id], [site_id]) OUTPUT inserted.id VALUES (@0, @1, @2)', N'@0 nvarchar(30), @1 nvarchar(30), @2 nvarchar(30)', @0 = N'212', @1 = N'34', @2 = N'97'  [["channel_id", 212], ["project_id", 34], ["site_id", 97]]
D, [2016-12-01T17:08:03.106695 #10570] DEBUG -- :   SQL (202.1ms)  COMMIT TRANSACTION
D, [2016-12-01T17:08:03.206572 #10570] DEBUG -- :   ChannelsMapping Load (98.2ms)  EXEC sp_executesql N'SELECT TOP (1) [dbo].[channels_mappings].* FROM [dbo].[channels_mappings] WHERE [dbo].[channels_mappings].[channel_id] = 213'
D, [2016-12-01T17:08:03.309404 #10570] DEBUG -- :   SQL (101.8ms)  BEGIN TRANSACTION
D, [2016-12-01T17:08:03.457383 #10570] DEBUG -- :   SQL (147.1ms)  EXEC sp_executesql N'INSERT INTO [dbo].[channels_mappings] ([channel_id], [project_id], [site_id]) OUTPUT inserted.id VALUES (@0, @1, @2)', N'@0 nvarchar(30), @1 nvarchar(30), @2 nvarchar(30)', @0 = N'213', @1 = N'34', @2 = N'97'  [["channel_id", 213], ["project_id", 34], ["site_id", 97]]
D, [2016-12-01T17:08:03.519507 #10570] DEBUG -- :   SQL (61.3ms)  COMMIT TRANSACTION
D, [2016-12-01T17:08:03.730075 #10570] DEBUG -- :   ChannelsMapping Load (209.3ms)  EXEC sp_executesql N'SELECT TOP (1) [dbo].[channels_mappings].* FROM [dbo].[channels_mappings] WHERE [dbo].[channels_mappings].[channel_id] = 214'
D, [2016-12-01T17:08:03.933089 #10570] DEBUG -- :   SQL (201.8ms)  BEGIN TRANSACTION
D, [2016-12-01T17:08:04.136342 #10570] DEBUG -- :   SQL (200.7ms)  EXEC sp_executesql N'INSERT INTO [dbo].[channels_mappings] ([channel_id], [project_id], [site_id]) OUTPUT inserted.id VALUES (@0, @1, @2)', N'@0 nvarchar(30), @1 nvarchar(30), @2 nvarchar(30)', @0 = N'214', @1 = N'34', @2 = N'97'  [["channel_id", 214], ["project_id", 34], ["site_id", 97]]
D, [2016-12-01T17:08:04.350719 #10570] DEBUG -- :   SQL (213.5ms)  COMMIT TRANSACTION


Добавлено
require 'tiny_tds'

c = TinyTds::Client.new(
 # ...
)

t = DateTime.now
puts "Started at #{t.to_s}"
puts c.execute("SELECT 1 AS [one]").each
puts "Ended in #{ (DateTime.now - t)*1000.0 }"
c.close

Ended in 0.002353889513888889
  • Вопрос задан
  • 253 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@edb
SQL
sp_executesql нужен для использрвания параметров в запросе. таким образом для каждого запроса не будет генерироваться новый план, а будет использоваться существующий. Но в любом случае начало транзакции не может длится 200мс
попробуйте зайти на сервер и из management studio выполнить следующее:
set statistics io, time on;
begin transaction

посмотрите, на вкладке messages сколько времени это заняло. Это должно помочь идентифицировать проблему.
Ответ написан
@vsuhachev
у них в TODO что-то написано про это

Еще как вариант посмотрите на sequel
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы