我有一台连接到 SAN 的合理服务器,它将为同一应用程序的多个运行 SQL 服务器。一个应用程序能够读取另一个应用程序的数据库不会带来任何安全问题。
不幸的是我们也使用 32 位 Windows。
我认为最好在服务器上使用一个实例,启用 AWE,以便服务器实例可以使用我们拥有的几乎所有 RAM,然后在一个实例中运行每个数据库。
然而,我的意见被 IT 部门的神灵否决了,所以我真的很想听听你对此的看法。从性能的角度来看,我说一个 SQL 实例比两个好,是不是错了?
我知道我们可以做一些故障转移的事情,但在一个刀片上这样做对我来说似乎有点小题大做。
答案1
SQL Server 2000 和 2005 Workgroup 和 Standard(32 位,我不确定 64 位)最多只能使用 2GB 内存,因此拥有两个实例将允许您使用全部 4GB。即使您在 x64 Windows 上运行 32 位 SQL Standard,情况也是如此,事实上更是如此,因为您希望每 2GB 内存有一个实例。
原则上,使用一个实例和两个数据库要比使用两个实例各一个数据库要快,尽管我并不认为这两者之间有太大区别。拥有单独的实例对管理很有用。例如,如果您使用 SQL 登录名,并且不同的数据库有不同的登录名集,那么使用单独的实例可以更轻松地跟踪登录名。
因此,你的问题的答案是“视情况而定”:-)
JR
回复 Spence 的评论:32 位 Windows 上的 SQL Server Standard 最多可使用 2GB 内存。如果使用 /3GB 开关,SQL Server Enterprise 可使用 3GB。在具有 AWE 的 Windows 2003 Enterprise 上,最多可使用 16GB 内存(可能更多),因此您可以通过运行多个 SQL Server 实例来更好地利用内存。
恐怕答案仍然是“视情况而定”。如果您有大量内存,即 8GB 或 16GB,那么您需要将最大的数据库放在单独的实例中,以便每个实例可以有 2GB(或 3GB,带 /3GB)。如果您只有 4GB,那么我可能会使用单个实例和 /3GB 开关,因为拥有两个实例所用的少量额外内存不值得付出这样的开销。
正如其他人在下面评论的那样,可能还有其他考虑因素。如果您同时引用两个数据库,例如在选择查询中,或者如果您从一个数据库插入另一个数据库,那么您希望它们在同一个实例中以提高速度。
答案2
32 位是死路一条。
在 SQL2K5 中,计划编译、计划大小本身以及 proc 缓存等内存消耗已显著超过 2k。此外,如果您有许多用户(即大型组织和中层模拟),权限令牌缓存等其他组件也趋于增长。由于所有这些都无法从 AWE 中受益,因此您很难将繁忙的系统装入 32 位内存空间。如果您有复杂的查询和计划,聚合实例可能会导致很大比例的缓冲池被盗用到这些缓存中,从而将较小的缓冲池留给数据,导致编译计划的缓存不断被驱逐,页面预期寿命较低。
另一方面,同一台机器上的多个 SQL 实例往往会互相干扰,从而相互触发内存压力。由于实例的内存管理器彼此不通信,因此与单个实例相比,找到平衡要困难得多。此外,多个实例的处理器调度也会遇到类似的问题,因为操作系统会在实例之间抢占 SQL 调度程序,从而导致 CPU 缓存崩溃。
答案3
恕我直言,我认为你们这些 IT 大神在这一点上是错的。只要在同一个实例中运行多个数据库不会带来安全问题,那就应该这么做。多实例总会引入一些开销,这实际上会使您的服务器性能不佳。从管理角度来看,最好还是坚持使用一个实例。
答案4
与往常一样,这取决于:数据库是否需要彼此“对话”?
如果是针对同一个应用程序,您经常会遇到希望一个数据库读取或写入另一个数据库的情况。如果是这种情况,最好在单个实例上使用两个数据库。(没有链接服务器、共享登录、共享 tempdb 都是优点。)
但是,如果两个数据库完全隔离,永远不会相互通信,而且实际上彼此之间没有任何关系(即 SharePoint 和 SAP),那么两个实例可能更可取。(能够以不同的 Service Pack 级别运行,或限制一个实例使用的内存是我首先想到的两个优点。)