我们正在使用ODBC连接到Server 2008 R2实例,当在连接上启用MARS时,SELECT查询的性能要慢得多。我尝试了不同的驱动程序版本( Server本机客户端10.0,Server本机客户端11.0),但是MARS连接总是要慢得多。我希望查询在火星连接中所花费的时间与关闭火星的时间相同,因为我一次只运行一个查询,没有任何交错。
关于SELECT查询的:--我还没有研究其他查询,但是这个具有多个连接的查询在MARS打开时要慢一些。查询返回600K+行。我在下面进一步粘贴了查询。
简化工作流程: a)连接到Server 2008 R2实例,使用ODBC b) SQLPrepare查询c) SQLExecute d) SQLFetch多次,直到返回SQL_NO_DATA为止
当火星关闭:当设置为100时, SQLExecute大约需要7秒,SQLFetch被称为6000+次数,总提取时间(跨6000+ SQLFetch调用)在300毫秒以下,我的应用程序通常在7.5秒内获得完整的结果集(600K+行)(即从发出查询到接收最后一行)。
火星运行时的:当 SQLExecute被设置为100时,SQL_ATTR_ROW_ARRAY_SIZE大约需要7秒,SQLFetch被称为6000+时间,总提取时间是30+秒。我试验了不同的行大小,但是总提取时间通常是30+秒,因为当行大小设置为较高的数时,在每个SQLFetch调用中花费的时间会增加。我的应用程序通常在40秒内获得完整的结果集(600K+行)(即从发出查询到接收最后一行)。
我试验了不同的游标类型(包括Server特定的带有和不带自动获取的快速前向游标)、SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_SCROLLABLE和SQL_ATTR_CURSOR_SENSITIVITY。我也试验了不同的取行尺寸。但是,在启用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)发布于 2014-04-23 13:12:26
我觉得火星在使用游标,而默认的结果集(“火管游标”)是在火星关闭时使用的;尽管微软文档声称默认结果是启用MARS时的默认结果。
MARS通常不会在TDS级别或以上更改数据库的操作,它充当套接字和TDS之间的多路复用层。虽然它不会改变仅在前向获取中返回的数据量,但多工性质和相关的滑动窗口将需要更多的网络往返才能获得相同的数据。
也许你需要两个连接。一种是在您需要时启用了MARS,另一种则是在需要最大吞吐量时不启用它。
https://stackoverflow.com/questions/19901421
复制相似问题