我有几个表,行数在 5M 到 1.5G 之间
每个表都有其 BLOB 字段,其大小从 100 字节到 30 兆字节不等,并存储为“行外大值类型”= ON
表存储在不同的文件组中,每个文件组有 3-4 个文件@不同的 LUN@非常快的 SAN
这些表每天增长 5-100 Gb 和 600k - 1.5M 行
经过一段时间后,从 2 周到 6 个月不等,一些行被删除或移动到存档数据库,因此 - 工作表中没有任何超过 6 个月的行。
服务器当前配置:
-T 3640; (消除了为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。这类似于 SET NOCOUNT ON 的会话设置,但是当设置为跟踪标志时,每个客户端会话都以这种方式处理)
-T 1118;(将 tempDB 中的分配从一次 1pg(对于前 8 页)切换到一个范围。)
-T 2301;(启用特定于决策支持查询的高级优化。此选项适用于大型数据集的决策支持处理)
-T 1117;(一次增长所有数据文件,否则依次增长。)
-E; (增加为文件组中每个文件分配的区数。此选项对于运行索引或数据扫描的用户数量有限的数据仓库应用程序可能有用)
-T 834; (导致 SQL Server 对为缓冲池分配的内存使用 Windows …
我需要将数据库(作为一个整体)传输到另一台服务器,以制作一个重复的数据库来设置另一个测试环境。
我有两个选择:
根据我的要求,这两种解决方案的优缺点是什么?
我正在使用 SQL Server 2008 企业版。
我有一个大型(约 6700 万行)名称-值表,该表在DataValue列上具有全文索引。
如果我尝试运行以下命令:
ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)
它运行了 1 小时 10 分钟,但仍然无法在VisitorData包含约 6700 万行的表上完成。
以下是有关该表的更多详细信息:
CREATE TABLE [dbo].[VisitorData](
[VisitorID] [int] NOT NULL,
[DataName] [varchar](80) NOT NULL,
[DataValue] [nvarchar](3800) NOT NULL,
[EncryptedDataValue] [varbinary](max) NULL,
[VisitorDataID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_VisitorData_VisitorDataID] PRIMARY KEY CLUSTERED (
[VisitorDataID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [UNQ_VisitorData_VisitorId_DataName] …Run Code Online (Sandbox Code Playgroud) 我听说它说您不想使用动态 SQL。你能给我一些具体的或现实生活中的例子吗?
就个人而言,我在我的数据库中多次使用它进行编码。我认为这是可以的,因为它的灵活性。
我的猜测是关于 SQL 注入或性能。还要别的吗?
假设我有表 A:BookingsPerPerson
Person_Id ArrivalDate DepartureDate
123456 2012-01-01 2012-01-04
213415 2012-01-02 2012-01-07
Run Code Online (Sandbox Code Playgroud)
我需要通过视图实现以下目标:
Person_Id ArrivalDate DepartureDate Jan-01 Jan-02 Jan-03 Jan-04 Jan-05 Jan-06 Jan-07
123456 2012-01-01 2012-01-04 1 1 1 1
213415 2012-01-02 2012-01-07 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
该系统用于活动,因此每次酒店预订可能需要 1 到 15 天的时间,但不会超过此时间。任何想法将不胜感激。
我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,压缩row和page压缩没有预期的影响(对于 20 GB 表仅节省了大约 100/200 MB)。此外,我无法应用列存储和列存储归档压缩,因为它们不支持NVARCHAR(MAX)字段压缩。
谁能告诉我这里是否有其他选择?
我也猜测row和page压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。
我有一个旧表,其名称包含不可打印的字符(CHAR(31),具体来说)。
不可打印的字符位于下划线旁边,我发现快捷方式CTRL+SHIFT+_创建了该CHAR(31)字符(这意味着“美国” - 单位分隔符)。以前的开发人员可能会错误地使用这个组合,并创建了包含这个奇怪字符的表格。
当我们SELECT对表发出命令时,它会返回结果。但是,当我们试图发出反对任何DDL( ,DROP,sp_rename等),字符会导致一个问题。
例子:
DROP TABLE Table_Name;
Run Code Online (Sandbox Code Playgroud)
提高:
消息 15225 - 在当前数据库 'MyDB' 中找不到名为 'Table_Name' 的项目,因为@itemtype 被输入为 '(null)'。
EXEC sp_rename N'Table_Name', N'NewTableName';
Run Code Online (Sandbox Code Playgroud)
提高:
消息 102 - '_Name' 附近的语法不正确。
我已经用正确的名称复制了表,并在相关对象上更正了它。剩下的步骤就是将它从数据库中删除。
只是一个见解:当我们从 SQL Server 复制+粘贴到 Notepad++ 时,它会在表名中间显示隐藏字符(“US”),在下划线旁边:
我遇到了大量阻止我的 SELECT 操作的 INSERT 的问题。
我有一张这样的表:
CREATE TABLE [InverterData](
[InverterID] [bigint] NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[ValueA] [decimal](18, 2) NULL,
[ValueB] [decimal](18, 2) NULL
CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED
(
[TimeStamp] DESC,
[InverterID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)
我还有这个小助手程序,它允许我使用 MERGE 命令插入或更新(冲突时更新):
CREATE PROCEDURE [InsertOrUpdateInverterData]
@InverterID bigint, @TimeStamp datetime
, @ValueA decimal(18,2), @ValueB decimal(18,2)
AS
BEGIN
MERGE [InverterData] AS TARGET
USING (VALUES (@InverterID, …Run Code Online (Sandbox Code Playgroud) 存储过程的缓存中缺少计划的原因是什么?
WITH RECOMPILE我最近在 2 台服务器(SQL Server 2008 R2 和 SQL Server 2012)上工作,它们在缓存中没有计划用于非常消耗资源的存储过程。存储过程中的许多(也许是全部)语句在缓存中也没有计划。一些存储过程非常频繁地执行,例如每秒执行几次。
没有任何内存压力。其中一台服务器的硬件远远超过所需。
我认为丢失的计划是由于在存储过程中间创建了临时表,但这似乎是来自 SQL Server 2000 或更早版本的旧信息。从 SQL Server 2005 开始,重新编译发生在 DDL 之后的语句的语句级别。在所有情况下都是如此还是在较新的版本上仍然会发生?
还有什么可能是导致计划缺失的罪魁祸首?我已经浏览了一些关于这个主题的文章,但似乎没有什么合适的。
在我本周查看的服务器上启用了针对临时工作负载的优化。其中一个存储过程每天只执行一次。我确实有那个代码。我没有每分钟执行超过 100 次的代码,但我可以得到它。我将无法发布代码,但我可以根据我的问题来描述它。
我不相信有人会释放过程缓存或丢弃干净的缓冲区。该客户使用 Solarwinds DPA 作为其监控工具之一。DPA 确实捕获了每天调用一次的存储过程中语句的执行计划之一。由于 non-sargableWHERE子句,该语句有大量读取。如果 DPA 捕获了该语句,则它是一个估计计划,并且曾经在计划缓存中。只是在我们进行故障排除时不在那里。我会让他们开始记录sp_WhoIsActive到一个表。
我正在使用sp_BlitzCache. (我为 Brent Ozar Unlimited 工作)这将显示整个存储过程的计划以及单个语句的计划(如果存在)。如果它们不存在,它会发出警告“我们找不到此查询的计划。可能的原因包括动态 SQL、RECOMPILE提示和加密代码。” 该警告也出现在声明中。
TF 2371 没有到位。我正在查看等待统计数据。服务器很无聊。PLE 超过 130,000。
我现在有 2 个存储过程的代码。其中之一是使用动态 SQLexec (@sql)以便我们知道为什么没有计划。但另一个,也就是每分钟运行超过 100 次的那个,没有任何异常。唯一突出的是临时表是在 1000 多行代码的中间创建的。它也调用了一堆子存储过程。
我正在考虑为我们的 SQL Server 集群之一使用 RAID0 设置。我将概述情况并寻找为什么这可能是一个坏主意。此外,如果您有用例、白皮书或其他文档,您可以就这个主题向我指出,那就太好了。
我们在 2 个数据中心有 3 台服务器,它们是 SQL 集群的一部分。它们都在一个可用性组中运行 SQL Server。主节点旁边有一个副本,另一个位于另一个数据中心。他们正在运行具有自动故障转移功能的同步复制。所有驱动器都是企业级 SSD。他们将运行 SQL Server 2017 或 2019。
我认为与其他方法相比,在 RAID0 阵列上运行它们会有很多好处,而且几乎没有真正的缺点。我目前看到的唯一负面影响是主服务器上缺乏冗余,因此失败率增加。作为优点:
如果驱动器发生故障,而不是在有人收到通知并对其进行手动操作之前以缓慢、降级的状态运行,则服务器将立即无法保持完整的操作能力。这将有一个额外的好处,即通知我们故障转移,因此我们可以更快地调查原因。
它降低了每 TB 容量的整体故障几率。由于我们不需要奇偶校验或镜像驱动器,因此我们减少了每个阵列的驱动器数量。驱动器越少,驱动器故障的总机会就越小。
这更便宜。为我们所需的容量需要更少的驱动器显然成本更低。
我知道这不是传统的商业思维,但有什么我没有考虑的吗?我喜欢任何赞成或反对的意见。
我不是为了提高查询性能而尝试这样做,但如果有有意义的,请随时指出它们。我主要担心的是没有考虑或解决我没有想到的可靠性或冗余问题。
操作系统位于单独的镜像驱动器上,因此服务器本身应该保持正常运行。这些驱动器之一可以更换并再次镜像。它很小,除了系统数据库之外没有任何数据库文件。我无法想象这需要超过几分钟。如果其中一个数据阵列出现故障,我们会更换驱动器、重建阵列、恢复并与 AG 重新同步。根据我的个人经验,恢复比 RAID5 驱动器重建快得多。我从来没有遇到过 RAID1 故障,所以我不知道重建是否会更快。恢复将来自备份并前滚以匹配主服务器,因此主服务器上的负载增加应该非常小,仅将日志的最后几分钟与恢复的副本同步。
sql-server ×10
alter-table ×1
backup ×1
compression ×1
ddl ×1
dynamic-sql ×1
locking ×1
pivot ×1
plan-cache ×1
raid ×1
restore ×1