小编Mic*_*art的帖子

如何以最少的停机时间将 rowversion 列添加到大表中

使用 SQL Server 2008 及更高版本,我想向大表添加一个 rowversion 列,但是当我只是

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL
Run Code Online (Sandbox Code Playgroud)

然后该表无法更新太长时间。

我可以使用哪些策略来减少这种停机时间?我会考虑任何事情。当然越简单越好,但我会考虑任何策略。

我的想法是,作为最后的手段,我可​​以维护一个由触发器维护的副本临时表,然后将临时表 sp_rename 到原始表中。但我希望有更简单/更容易的东西。

sql-server-2008 sql-server alter-table

23
推荐指数
2
解决办法
2万
查看次数

删除行时,为什么非聚集索引会占用更多空间?

我有一个包含 75 亿行和 5 个索引的大表。当我删除大约 1000 万行时,我注意到非聚集索引似乎增加了它们存储的页数。

我写了一个查询dm_db_partition_stats来报告页面中的差异(之后 - 之前):

dm_db_partition_stats 增量

索引1是聚集索引,索引2是主键。其他的都是非聚集的和非唯一的。

为什么那些非聚集索引上的页面会增加?
我预计这些数字在最坏的情况下会保持不变。
我确实看到性能计数器报告删除过程中页面拆分的增加。

删除时,ghost 记录是否必须移动到另一页?这与“唯一标识符”有关吗?

我们正在推出 RCSI,但现在,RCSI 已关闭。

它是可用性组中的主节点。我知道快照以某种方式在辅助节点上使用。如果这是相关的,我会感到惊讶。我打算深入研究这个(查看 dbcc 页面输出)以了解更多信息。希望有人看到过类似的东西。

sql-server nonclustered-index sql-server-2014

23
推荐指数
1
解决办法
1558
查看次数

列出给定登录的所有映射用户的查询

查看特定登录的属性时,可以看到映射到该登录的用户列表: 在此处输入图片说明

我分析了 SQL Server Management Studio (SSMS),我看到 SSMS 一次连接到每个数据库并从 sys.database_permissions 检索信息

是否可以编写一个查询来检索上面显示的用户映射信息,或者我是否被迫使用游标或 sp_MSforeachdb 或类似的东西?

sql-server-2008 security sql-server permissions logins

22
推荐指数
3
解决办法
8万
查看次数

转换为数字时奇怪的 SQL Server 实例崩溃

在使用 C# Entity Framework 时,我注意到我的 SQL Server 实例崩溃了。

我能够将其追溯到以下声明:

SELECT * FROM dbo.[TestTable]
where mpnr in (1099059904,
1038139906,
1048119902,
1045119902,
1002109903,
1117109910,
1111149902,
1063149902,
1117159902,
1116109904,
1105079905,
1012079906,
1129129904,
1103059905,
1065059905,
1091059906,
1110149904,
1129149903,
1083029905,
1080139904,
1076109903,
1010019902,
1058019902,
1060019903,
1053019902,
1030089902,
1018149902,
1077149902,
1010109901,
1011109901,
1000119902,
1023049903,
1107119909,
1108119909,
1106119909)
Run Code Online (Sandbox Code Playgroud)

该表如下所示:

CREATE TABLE dbo.[TestTable]([MPNR] [numeric](9, 0) NOT NULL)
Run Code Online (Sandbox Code Playgroud)

每次启动查询时都会发生崩溃。如果我减少IN子句中值的数量,它就会起作用。(当然,它不返回任何行。)

我知道IN子句中的值是 10 位数字,列只有 9 位数字,但这不应导致整个 SQL Server 实例崩溃。

我的 SQL Server 的版本是 Windows Server 2003 32 …

sql-server sql-server-2008-r2 crash

20
推荐指数
1
解决办法
520
查看次数

我可以创建用户定义的表类型并在同一个事务中使用它吗?

当我执行以下命令时(在管理工作室中,GO 会将命令分成批处理)

use tempdb

begin tran
go

CREATE TYPE dbo.IntIntSet AS TABLE(
    Value0 Int NOT NULL,
    Value1 Int NOT NULL
)
go

declare @myPK dbo.IntIntSet;
go

rollback
Run Code Online (Sandbox Code Playgroud)

我收到一条死锁错误消息。我的过程已经陷入僵局。我在 2008、2008R2 和 2012 中看到过这种行为。

有没有办法在它创建的同一个事务中使用我新创建的类型?

sql-server-2008 sql-server deadlock sql-server-2012

14
推荐指数
1
解决办法
1万
查看次数

SSIS 失败后如何继续

我想实现如下内容: 在此处输入图片说明

在这个包中,我想遍历数据库名称列表,动态修改连接管理器设置。

但是,“测试连接”上的第一次失败将停止并使包执行失败。

但我想继续我的 Foreach 循环。我觉得这应该是可能的(否则这些红色失败箭头的用例是什么?)

我尝试过的事情包括弄乱“MaximumErrorCount”。

ssis-2012

14
推荐指数
1
解决办法
2万
查看次数

如何演示事务日志活动?

假设我有以下设置:

use tempdb
go

set nocount on
go

create table MyTest
(
    Column1 varchar(100),
    Column2 text 
)
go

insert mytest (Column1, Column2)
select REPLICATE('a', 100), REPLICATE('a', 100)
from sys.syscolumns a, sys.syscolumns b
Run Code Online (Sandbox Code Playgroud)

我想将每一列转换为 varchar(max) ,如下所示:

-- processes every page:
alter table mytest
alter column Column1 varchar(max)

-- processes only metadata:
alter table mytest
alter column Column2 varchar(max)
Run Code Online (Sandbox Code Playgroud)

我如何证明第一个命令处理整个表而第二个命令只处理元数据。我正在考虑使用 SET STATISTICS IO,它报告第一个命令的数千个逻辑读取,而另一个没有报告。我也在考虑使用 DBCC LOG 或 fn_dblog。但我不确定如何解释或将结果与我发出的查询联系起来。

sql-server

6
推荐指数
2
解决办法
361
查看次数

如何解决错误 26:“Error Locating Server/Instance Specified”

我正在尝试配置对我的 SQL Server 命名实例(名为 SQL2012)的 TCP 访问。我使用管理工作室连接到数据库引擎。我输入服务器名称:“tcp:localhost\SQL2012”,然后收到此错误消息:

(提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例)

SQL Server 团队的这篇文章似乎非常有用,他们建议使用 PortQry 测试 SqlBrowser 服务。当我这样做时,我会得到以下信息:

Querying target system called:

 localhost

Attempting to resolve name to IP address...


Name resolved to 127.0.0.1

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

Server's response:

ServerName MSWART7
InstanceName SQL2012
IsClustered No
Version 11.0.5058.0
tcp 52329

   ?K   K P?K 5 - 2 1 qK 1 4  rK 8 7 0?    1 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 connectivity

6
推荐指数
1
解决办法
3万
查看次数

是否有可用性组故障转移触发器之类的东西?

是否存在可用性组故障转移的触发器?

我希望在 AG 故障转移时发生某些操作。具体来说,我想打开一个数据库设置(打开 RCSI)。我想在故障转移时执行此操作,以最大限度地减少对 24/7 工作负载的中断,并且很难获得计划的维护窗口。

我知道sp_procoption可以用来标记程序为启动程序。这似乎适用于故障转移集群,但不适用于可用性组。

我确实考虑过sp_add_alert在 message_id=26069 上添加警报 ( ),以便使用 sql 代理作业响应故障转移操作。但这似乎不那么直接,在实践中似乎很慢

sql-server

6
推荐指数
1
解决办法
808
查看次数

如何查找正在进行的查询的 IO 统计信息(按索引)

通过在运行 SQL 查询之前运行 SET STATISTICS IO ON,我可以了解查询完成后对每个索引执行的逻辑读取次数。

通过查看视图 sys.dm_exec_requests,我可以了解迄今为止针对任何正在进行的查询执行的逻辑读取数(总计)。

我怎样才能知道到目前为止对每个索引执行了多少逻辑读取以进行查询?

sql-server-2008 sql-server

5
推荐指数
1
解决办法
500
查看次数

我可以在不扫描表的情况下在大型表上启用系统版本控制(临时表)吗?

Microsoft 文档当前在 ALTER TABLE 系统版本控制示例中给出了如何在现有表上启用临时表的示例:A. 将系统版本控制添加到现有表

使用那里的语法但指定一个常量默认值,我有:

ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
--    DEFAULT SYSUTCDATETIME(), /* default specified in the docs */
    DEFAULT CONVERT(DATETIME2, '2023-08-14') /* use a constant default */
ValidTo datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999') ;
Run Code Online (Sandbox Code Playgroud)

当我运行此语句时,我可以SP:StatementStarting使用 TextData 观察一个事件:SELECT [ValidFrom],[ValidTo] FROM [dbo].[InsurancePolicy]

这告诉我 SQL Server 正在查看该数据(可能是为了确定 ValidTo 和 ValidFrom 符合某些约束)。

模式修改锁+表扫描让我很伤心。

理论上,扫描是不必要的,因为这些值是恒定的。在 …

sql-server temporal-tables

5
推荐指数
1
解决办法
463
查看次数

重新启动后,我的 tempdb 数据文件的初始大小是多少?

sys.database_filessys.sysfiles报告大小,但这只是文件的当前大小。有没有办法找出 tempdb 数据文件在系统重新启动期间重新创建后的初始大小?

sql-server-2008 sql-server

4
推荐指数
1
解决办法
8155
查看次数

我可以创建一个带有默认值和外键的新列作为仅元数据操作吗?

可以使用默认值创建一个新列作为仅元数据操作(不是数据大小操作):

ALTER TABLE dbo.MyReallyBigTable
ADD MyThingId INT NOT NULL 
    DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)

但是是否也可以创建这样一个引用另一个表作为仅元数据操作的列?

ALTER TABLE dbo.MyReallyBigTable
ADD MyThingId INT NOT NULL 
    DEFAULT 0 
    REFERENCES dbo.MyThing(MyThingId);
Run Code Online (Sandbox Code Playgroud)

理论上这是可能的,因为在引用的表中应该只有一个值要检查。但是,在我的示例中,外键创建似乎是一个数据大小操作。

sql-server

4
推荐指数
1
解决办法
336
查看次数