背景
我正在将 160gb 数据库从具有 48gb RAM 的 Win 2008 服务器上的 MSSQL 2008(标准)迁移到在具有 64gb RAM 的 Win 2012 上运行 MSSQL 2012(64 位网络版)的新服务器。旧服务器处于活动状态且负载不足;新服务器不在生产中。新服务器有 8 个 tempdb 文件(每个 4GB)。
问题
在新服务器上进行测试时,我看到许多查询中的步骤导致提到“操作员使用 tempdb 在执行期间溢出数据”的警报。我已经能够通过重写一些查询来避免排序,但这并没有真正解决这个问题。旧服务器上的相同查询不会导致溢出。我读过当 MSSQL 无法在内存中完成操作并且必须溢出/分页到 tempdb 时会发生溢出。我应该担心溢出吗?
例子
我已经在数据库上运行了 sp_updatestats,所以统计信息应该是最新的,但是您会注意到估计的行数和实际的行数之间存在一些差异。
内存问题
我为 64gb 中的 58 个 MSSQL 设置了最大内存设置。目前 MSSQL 已经消耗了大约 35gb 的内存,但工作集只有 682mb。旧服务器(尽管在生产中,处理负载)有 44gb 的内存提交给 MSSQL,其中 43.5gb 在其工作集中。

我不知道溢出是否与内存设置有关-有人有任何想法吗?MSSQL 目前有大量 RAM 可用,那么为什么它会溢出到 tempdb 以进行某些排序和哈希匹配?
我正在开发第三方数据库。
当我尝试通过右键单击查看视图的定义时,CREATE TO然后单击 ,NEW QUERY EDIT WINDOW出现错误:
此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。文本已加密。
统计IO:
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. …Run Code Online (Sandbox Code Playgroud) 我们正在讨论是否对 DW 表使用 SORT_IN_TEMPDB 选项。我的理解是,使用此选项时会有更多的写入,尽管它们更具顺序性。我们有一个 SAN(它有时非常慢),所以在我们的例子中,我们希望尽可能地限制写入次数。我相信 tempdb 位于单独的 LUN(磁盘集)上。
我们的数据文件和 tempdb 文件中有足够的磁盘空间。在这种情况下,我们会从使用 SORT_IN_TEMPDB 中受益吗?
让我印象深刻的一件事是对这个答案的评论
重建索引时,您需要两倍于索引的空间 + 20% 用于排序。因此,一般而言,要重建数据库中的每个索引,您只需要数据库中最大索引的 120%。如果你使用 SORT_IN_TEMPDB,你只赢了 20%,你的数据文件中仍然需要额外的 100%。此外,在 tempdb 中使用 sort 会大大增加您的 IO 负载,因为不是将索引一次写入数据文件,而是现在将其写入一次 tempdb,然后将其写入数据文件。所以这并不总是理想的。
我们绝对不想通过慢速/可能配置错误的 SAN 增加 IO 负载。
测试这个的最佳方法是什么?通过简单地重建带有和不带有选项的表并记录时间?
编辑:我们有 8 个 tempdb 文件,每个 15GB。我们确实设置了 TF 1117/1118 标志并启用了 IFI。我们目前混合使用 sort_in_tempdb 选项和不使用它进行重建。
谢谢!
SQL Server 2012 企业版
我有数百个(目前为 466 个,但在不断增加)表,我必须从一台服务器复制到另一台服务器。
我以前从未这样做过,所以我完全不确定如何处理它。所有表的格式相同:Cart<Eight character customer number>
这是一个更大项目的一部分,我正在将所有这些Cart<Number>表合并到一个Carts表中,但这完全是一个完全不同的问题。
有没有人有我可以用来复制所有这些表的最佳实践方法?如果有帮助,两台服务器上的数据库名称相同。正如我之前所说,我有这个sa帐户,所以我可以做任何必要的事情来将数据从 A 获取到 B。两台服务器也位于同一个服务器群中。
尝试使用Windows 身份验证通过 TCP 连接到 SQL Server 2012 实例时,我在 SQL Server Management Studio 2014 中遇到了极长的延迟(10~30 秒)。连接对象资源管理器或新的空白查询窗口时会发生这种情况。连接后,运行查询很快。当我使用 SQL Server 身份验证连接时,问题不会发生。
环境:
当我使用域帐户登录同事的 Windows 7 计算机,并通过同一个 VPN 连接到同一个 SQL Server 时,没有任何延迟。当同一位同事使用他自己的域帐户登录我的 PC 时,他遇到了延迟。这些测试表明该问题是我的 PC 独有的。另外,这个问题只有在连接到这个特定的 SQL Server 和 VPN 时才会出现;我可以毫不拖延地通过 Windows 身份验证连接到本地网络上的其他 SQL Server。
我尝试过但没有成功的事情:
<default>. 我也试过命名管道,但我的服务器没有为此设置。我最近开始使用 Management Studio 2012。使用 MySQL Workbench 时,一个方便的功能是我可以全部使用小写字母,任何保留字(如SELECT, INSERT)都会自动转换为大写字母。如何在 SSMS 中复制此行为?
我只剩下 2GB 了,所以我需要删除这个历史表。该表现在为空,但数据库磁盘空间未释放。并且数据库文件是320GB。
SQL Server 2012+ 中SEQUENCE声明的 usingNO CACHE和声明的 using之间有什么区别CACHE 1吗?
序列#1:
CREATE SEQUENCE dbo.MySeqCache1
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
CACHE 1;
GO
Run Code Online (Sandbox Code Playgroud)
序列#2:
CREATE SEQUENCE dbo.MySeqNoCache
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
NO CACHE;
GO
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别吗?在 SQL Server 2012+ 环境中使用时,它们的行为会有所不同吗?
sql-server ×10
sql-server-2012 ×10
ssms ×3
connections ×1
connectivity ×1
index ×1
sequence ×1
truncate ×1