2013-11-11 4 views
2

Мы подключаемся к экземпляру 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) 

ответ

0

Я чувствую, что MARS использует курсор, в то время как результат по умолчанию наборы («шланговые курсоры») используются, когда MARS выключен; хотя в документации Microsoft утверждается, что результаты по умолчанию являются стандартными, когда включена MARS.

MARS обычно не изменяет действие базы данных на уровне TDS или выше уровня TDS, он функционирует как слой мультиплексирования между сокетом и TDS. Несмотря на то, что он не изменяет объем данных, возвращаемых в режиме только прямой выборки, для мультиплексирования и связанного с ним скользящего окна потребуется больше сетевых обходов, чтобы вернуть те же данные.

Возможно, вы можете использовать два соединения. один с включенным MARS, когда вам это нужно, а другой без него, когда вам нужна максимальная пропускная способность.

Смежные вопросы