SQL 由于负载在同一服务器上不同的数据库但物理磁盘不同,服务器查询超时

SQL Server query timeout due to load in different DB on same server but different physical disk

我们在同一台物理服务器上有 2 个独立的数据库(一个用于大数据,一个用于 运行 时间数据),它们使用不同的一组物理磁盘,但相同的 SQL 服务器实例。

最近我们 运行 在 'big data' 数据库中进行大量查询(分析千兆字节的数据)和一个非常简单的查询(来自同一专用 LAN 上的远程 .net 客户端,网络 RT 时间顺序为纳秒;运行ning SP 验证单个位)超时:

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=0; handshake=15000;
---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)<br> at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions)<br> at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry)
at System.Data.SqlClient.SqlConnection.Open()

唯一的选择是如何将那些拖车数据库的资源分开以将它们分开到两个物理服务器?或者是否有可能以某种方式确保 'Runtime' 数据库始终有少量可用资源,以便简单查询不会超时?

在 SQL 服务器的单个实例中,您无能为力。但是,您可以在单个物理(或虚拟)机器上 运行 SQL 的多个实例。仅此一项就应该有所帮助-我想如果您有足够的内存。您可以设置每个实例将使用的最大内存,如果您有多个内核,则可以将每个实例限制为这些内核的子集。例如,您可以将实例 1(大数据)设置为使用 4 核机器的核心 0、1 和 2,而实例 2(小数据)可以使用核心 2 和 3。这仍然允许大数据使用 3 个核心时它需要,并且还允许小数据始终有至少 1 个核心可用。

设置最大值需要反复试验,真的。试试看。

除此之外,将第二个实例放在另一台更简单的机器上,我认为您无能为力。但是,当您遇到性能问题时,获取硬数据总是值得的。 PAL at CodePlex 有一组用于许多配置的性能计数器,包括 SQL 服务器机器。然后它会压缩记录的值并输出一些漂亮的 有用的报告,说明可能出现的问题。 (由于 PAL,我发现将 less 内存分配给 SQL 实例可以通过在一台机器上进行改进!OS 内存不足并换出放慢了很多事情。)