背景
我正在将 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 以进行某些排序和哈希匹配?
我有数百个(目前为 466 个,但在不断增加)表,我必须从一台服务器复制到另一台服务器。
我以前从未这样做过,所以我完全不确定如何处理它。所有表的格式相同:Cart<Eight character customer number>
这是一个更大项目的一部分,我正在将所有这些Cart<Number>表合并到一个Carts表中,但这完全是一个完全不同的问题。
有没有人有我可以用来复制所有这些表的最佳实践方法?如果有帮助,两台服务器上的数据库名称相同。正如我之前所说,我有这个sa帐户,所以我可以做任何必要的事情来将数据从 A 获取到 B。两台服务器也位于同一个服务器群中。
我有一个表,其中有一个 ID、一个值和一个日期。此表中有许多 ID、值和日期。
记录会定期插入到此表中。ID 将始终保持不变,但有时值会发生变化。
我如何编写一个查询,该查询将为我提供 ID 以及该值更改的最近时间?注意:该值将始终增加。
从这个样本数据:
Create Table Taco
( Taco_ID int,
Taco_value int,
Taco_date datetime)
Insert INTO Taco
Values (1, 1, '2012-07-01 00:00:01'),
(1, 1, '2012-07-01 00:00:02'),
(1, 1, '2012-07-01 00:00:03'),
(1, 1, '2012-07-01 00:00:04'),
(1, 2, '2012-07-01 00:00:05'),
(1, 2, '2012-07-01 00:00:06'),
(1, 2, '2012-07-01 00:00:07'),
(1, 2, '2012-07-01 00:00:08')
Run Code Online (Sandbox Code Playgroud)
结果应该是:
Taco_ID Taco_date
1 2012-07-01 00:00:05
Run Code Online (Sandbox Code Playgroud)
(因为 00:05 是最后一次Taco_Value更改。)
我有一个包含数据的现有表:
dbo.Test (col1,col2,col3....) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我需要将此表更改为这样分区:
dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)
Run Code Online (Sandbox Code Playgroud)
我怎样才能在不删除和重新创建表格的情况下实现这一目标?
我最近开始使用 Management Studio 2012。使用 MySQL Workbench 时,一个方便的功能是我可以全部使用小写字母,任何保留字(如SELECT, INSERT)都会自动转换为大写字母。如何在 SSMS 中复制此行为?
我想要一种一对多的关系,其中对于每个父母,一个或零个孩子被标记为“最喜欢的”。然而,并不是每个父母都会有孩子。(将家长视为本网站上的问题,将孩子视为答案,将最喜欢的视为已接受的答案。)例如,
TableA
Id INT PRIMARY KEY
TableB
Id INT PRIMARY KEY
Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id
Run Code Online (Sandbox Code Playgroud)
在我看来,我可以将以下列添加到 TableA:
FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id
Run Code Online (Sandbox Code Playgroud)
或 TableB 的以下列:
IsFavorite BIT NOT NULL
Run Code Online (Sandbox Code Playgroud)
第一种方法的问题在于它引入了一个可为空的外键,据我所知,它不是规范化形式。第二种方法的问题是需要做更多的工作来确保最多只有一个孩子是最喜欢的。
我应该使用什么样的标准来确定使用哪种方法?或者,还有其他我没有考虑的方法吗?
我正在使用 SQL Server 2012。
normalization foreign-key database-design sql-server relational-theory
我做得对吗……?
我有一个返回钱的函数...
CREATE FUNCTION functionName( @a_principal money, @a_from_date
datetime, @a_to_date datetime, @a_rate float ) RETURNS money AS BEGIN
DECLARE @v_dint money set @v_dint = computation_here
set @v_dint = round(@v_dint, 2)
RETURN @v_dint
END
GO
Grant execute on functionName to another_user
Go
Run Code Online (Sandbox Code Playgroud)
我只是想知道这是否可以转换为 iTVF?
我试过这样做,但出现错误:
CREATE FUNCTION functionName ( @a_principal money, @a_from_date
datetime, @a_to_date datetime, @a_rate float )
RETURNS TABLE AS
RETURN SELECT returnMoney = computation_here
GO
Grant execute on functionName to another_user Go
Run Code Online (Sandbox Code Playgroud)
错误:
消息 4606,级别 16,状态 1,第 2 行授予或撤销特权 …
这是很容易证明,许多日期/时间格式等比下面的两个很容易受到由于设置语言,SET DATEFORMAT,或登录的默认语言误解:
yyyyMMdd -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T
Run Code Online (Sandbox Code Playgroud)
即使这种没有 T 的格式也可能看起来像一个有效的 ISO 8601 格式,但它在多种语言中都失败了:
DECLARE @d varchar(32) = '2017-03-13 23:22:21.020';
SET LANGUAGE Deutsch;
SELECT CONVERT(datetime, @d);
SET LANGUAGE Français;
SELECT CONVERT(datetime, @d);
Run Code Online (Sandbox Code Playgroud)
结果:
Die Spracheneinstellung wurde auf Deutsch geändert。
Msg 242, Level 16, State 3
Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。
Le paramètre de langue est passé à Français。 …
受到 Django 建模问题的启发:Database Modeling with multiple many-to-many Relations in Django。db-design 是这样的:
CREATE TABLE Book
( BookID INT NOT NULL
, BookTitle VARCHAR(200) NOT NULL
, PRIMARY KEY (BookID)
) ;
CREATE TABLE Tag
( TagID INT NOT NULL
, TagName VARCHAR(50) NOT NULL
, PRIMARY KEY (TagID)
) ;
CREATE TABLE BookTag
( BookID INT NOT NULL
, TagID INT NOT NULL
, PRIMARY KEY (BookID, TagID)
, FOREIGN KEY (BookID) REFERENCES Book (BookID)
, FOREIGN KEY (TagID) …Run Code Online (Sandbox Code Playgroud) 问题定义
我们的数据库服务器需要转移到另一个数据中心。它运行在 Microsoft SQL Server 2012 Enterprise(64 位)上,包含两个大约 2TB 和 1TB 的数据库。
几乎没有停机时间将是理想的。
工作量
这些数据库用于 .NET 网站,并且会不断更新。
不过,周末不可用也是可以接受的。当前使用的数据库将一直是唯一使用的数据库,直到切换到新数据库。
理想情况下,只需将 DNS 条目更改为指向新的数据库服务器,同时确保数据库未更新,即可实现该切换。
此外,只要从一台服务器切换到另一台服务器(停机时间)保持在较低水平,此操作所花费的时间并不重要。
考虑的方法
备份还原
过去曾这样做过,但即使是通过内部网络完成的,停机时间也很长,因此比通过 Internet更有效
日志传送
据我所知,这种方法可以通过配置主/从并将主数据库的精确副本传输到其只读从属来最大限度地减少停机时间。如上所述,不需要访问从属数据库,我们只需要一种方法来拥有主数据库的副本而不会损坏数据。
它在资源利用方面似乎也非常有效,并且不会对主性能产生太大影响。
我可能对这种方法有误,因此请随时纠正我。
数据库镜像
我不太了解这种方法,但它似乎是一个有效的选择。不需要实时同步,主节点的性能非常重要,因此如果选择这种方法,异步将是可行的方法。
其他选择?
该服务器直接在裸机硬件上运行,因此不幸的是,不能选择较低级别的解决方案。也许有更好的方法来完成这项工作?
约束
如上所述,这些数据库非常大,以至于难以维护,但这是另一个问题。
SQL Server 的版本将相同(Microsoft SQL Server 2012 Enterprise 64 位)。
它必须在两个数据中心之间通过网络传输,因此很可能通过 Internet 传输。不幸的是,将磁盘从一个站点发送到另一个站点进行初始同步并不是一种选择。为转移提供某种安全性是理想的,但我们会在这种情况下做到最好。
这应该很好地概述了我们对这项任务的需求,希望你们中的一些人以前不得不面对这种情况。
sql-server ×9
foreign-key ×2
ssms ×2
t-sql ×2
date-format ×1
datetime ×1
functions ×1
log-shipping ×1
migration ×1
mirroring ×1
partitioning ×1
restore ×1