ExecuteReader намного медленнее, чем SSMS - PullRequest
2 голосов
/ 03 июня 2019

Моя проблема началась с Entity Framework запроса, выполняемого очень медленно (~ 2 минуты).Поэтому я начал исследовать

Между тем, похоже, проблема также в стандартном SqlConnection

У меня довольно простой запрос

SELECT 1 AS [C1], [Extent1].[OldReleaseID] AS [OldReleaseID], [Extent1].[ProductName] AS [ProductName], [Extent1].[Price] AS [Price], [Extent1].[DiscountAmount] AS [DiscountAmount], [Extent1].[DiscountRate] AS [DiscountRate], [Extent1].[AbsorbVat] AS [AbsorbVat], [Extent1].[SerialCode] AS [SerialCode], [Extent1].[BrandName] AS [BrandName] FROM [dbo].[LocalSaleProductExts]() AS [Extent1]

Когда я запускаю его в SSMS он выполняется за 0-1 секунду и возвращает около 30 тыс. строк

Тот же самый точный запрос выполняется в .net ExecuteReader около 100 секунд!

Онлайн-исследование указывает в основном на 2 решения: ARITHABORT исниффинг параметров, так что для ударов я добавил все это в SSMS

DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
SET ARITHABORT OFF

Еще 0-1 секунд.

И в своем коде я добавил SET ARITHABORT ON.Вот мой простой код

Using sc = New SqlClient.SqlConnection("data source=MYHOST;initial catalog=MYDB;persist security info=True;user id=MYUSER;password=MYPASS;MultipleActiveResultSets=True;")
       Dim txt = "SELECT 1 AS [C1], [Extent1].[OldReleaseID] AS [OldReleaseID], [Extent1].[ProductName] AS [ProductName], [Extent1].[Price] AS [Price], [Extent1].[DiscountAmount] AS [DiscountAmount], [Extent1].[DiscountRate] AS [DiscountRate], [Extent1].[AbsorbVat] AS [AbsorbVat], [Extent1].[SerialCode] AS [SerialCode], [Extent1].[BrandName] AS [BrandName] FROM [dbo].[LocalSaleProductExts]() AS [Extent1] OPTION (RECOMPILE)"
        sc.Execute("SET ARITHABORT ON")
        sc.TryOpen()
        Dim ret As List(Of Common.DbDataRecord)
        Using cmd = sc.CreateCommand(txt)
            Using dr = cmd.ExecuteReader
                ret = dr.Cast(Of Common.DbDataRecord).ToList
                dr.Close()
            End Using
        End Using
        Dim a = ret
    End Using

Обнаружение параметров. Я считаю, что здесь не имеет значения, поскольку я не отправляю никаких параметров

Также это не проблема блокировки, так как я тестирую их нав то же время (насколько это возможно по-человечески ...), поэтому, если это проблема синхронизации, оба должны быть медленными

Так что еще может быть проблемой?

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...