Мы подключаемся к экземпляру SQL Server 2008 R2 с использованием ODBC, а производительность запроса SELECT значительно медленнее, когда MARS включен в соединении. Я пробовал разные версии драйверов (собственный клиент SQL Server 10.0, собственный клиент SQL Server 11.0), но соединение MARS всегда значительно медленнее. Я ожидаю, что время, затраченное на запрос в соединении MARS, будет совпадать с временем, затраченным MARS, так как я выполняю только один запрос за один раз без какого-либо чередования.ODBC вызывает SQLFetch медленнее при включенном MARS
О SELECT, запроса: Я еще посмотреть на другие запросы, но это один запрос, который имеет несколько присоединяется медленнее с Марсом на. Запрос возвращает 600K + строк. Я вставил запрос ниже.
Simplistic поток работы: а) Подключение к SQL Server 2008 экземпляра R2 с использованием ODBC б) SQLPrepare на запрос гр) SQLExecute г) SQLFetch несколько раз, пока он не возвращает SQL_NO_DATA
Когда Марс OFF: SQLExecute занимает около 7 секунд Когда для SQL_ATTR_ROW_ARRAY_SIZE установлено значение 100, SQLFetch называется 6000+ раз, а общее время выборки (через 6000+ вызовов SQLFetch) составляет менее 300 миллисекунд . Мое приложение обычно получает co mplete result (600K + rows) в течение 7,5 секунд (т. от выдачи запроса до получения последней строки).
Когда Марс включен: SQLExecute занимает около 7 секунд Когда SQL_ATTR_ROW_ARRAY_SIZE установлен в положение 100, SQLFetch называется 6000+ раз, а общее время выборки составляет более 30 секунд. Я экспериментировал с разными размерами строк, но общее время выборки обычно составляет 30+ секунд, так как время, затрачиваемое на каждый вызов SQLFetch, увеличивается, когда размер строки устанавливается на большее число. Мое приложение обычно получает полный набор результатов (600K + строк) примерно через 40 секунд (т. Е. От запроса запроса до получения последней строки).
Я экспериментировал с разными типами курсоров (включая курсор FAST FORWARD-ONLY только для SQL Server с и без автозапуска), SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_SCROLLABLE и SQL_ATTR_CURSOR_SENSITIVITY. Я также экспериментировал с разными размерами выборки строк. Но я не смог улучшить производительность запроса с включенной MARS.
Я чувствую, что MARS использует курсор, в то время как набор результатов по умолчанию («firehose cursors») используется, когда MARS выключен; хотя в документации Microsoft утверждается, что результаты по умолчанию являются стандартными, когда включена MARS.
Ниже приведен запрос, который я использую. Я не указывал типы данных каждого столбца, используемые в запросе, но сейчас я пропущу это. Я определенно могу сказать, что если эта информация необходима для решения этой проблемы.
Возможно, мой запрос имеет некоторые характеристики, которые заставляют MARS не использовать набор результатов по умолчанию? Что-нибудь, что я могу попытаться ускорить мой запрос под MARS? Нам необходимо включить MARS в наше приложение.
SELECT [G].[iteration] AS [iter],
[A].[area] AS [area],
[B].[status] AS [status],
DATEADD(minute, DATEDIFF(minute, 0, [B].[dt]), 0) AS [mydate],
MAX([Z].[title]) AS [title1],
MIN([Z].[title]) AS [title2],
MAX((CASE
WHEN 0 = ISNUMERIC(CAST([G].[estimate] AS VARCHAR)) THEN NULL
ELSE CAST(CAST([G].[estimate] AS VARCHAR) as float) END)) AS [calculation]
FROM [dbo].[Z] [Z]
INNER JOIN [dbo].[A] [A] ON ([Z].[idA] = [A].[idA])
INNER JOIN [dbo].[B] [B] ON ([Z].[idB] = [B].[idB])
INNER JOIN [dbo].[C] [C] ON ([Z].[idC] = [C].[idC])
INNER JOIN [dbo].[D] [D] ON ([Z].[idFF] = [D].[idFF])
INNER JOIN [dbo].[E] [E] ON ([Z].[idP] = [E].[idP])
LEFT JOIN [dbo].[F] [F] ON ([Z].[idB] = [F].[idB])
LEFT JOIN [dbo].[G] [G] ON ([Z].[idB] = [G].[idB])
LEFT JOIN [dbo].[H] [H] ON ([B].[idQ] = [H].[idQ])
INNER JOIN [dbo].[J] [J] ON ([Z].[idB] = [J].[idJ])
WHERE (([A].[area] >= 'AA') AND ([A].[area] <= 'ZZ'))
GROUP BY [G].[iteration],
[A].[area],
[B].[status],
DATEADD(minute, DATEDIFF(minute, 0, [B].[dt]), 0)