我有一个包含数百万行和一个允许 NULL 值的列的表。但是,当前没有一行具有该列的 NULL 值(我可以通过查询快速验证这一点)。但是当我执行命令时
ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
Run Code Online (Sandbox Code Playgroud)
相对而言,查询需要永远。它实际上需要 10 到 20 分钟,是添加检查约束的两倍多。有没有办法立即更新该列的表元数据,尤其是因为我知道该列没有任何行具有 NULL 值?
我们最近将生产实例从 SQL 2008 R2 迁移到全新的 SQL 2014 服务器。这是我们在使用 Service Broker 时发现的一个有趣场景。考虑一个Broker Enabled = true
带有MyService
和的数据库MyQueue
。此队列上禁用了毒物消息处理。队列中至少有 2 个与消息的活动对话。
在一个进程 (SPID 100) 中执行:
BEGIN TRANSACTION;
DECLARE @conversation_group_id UNIQUEIDENTIFIER;
RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue;
Run Code Online (Sandbox Code Playgroud)
请注意,我们将事务保持打开状态。假设它是一个 .NET 程序,它在某些外部资源上等待了很长时间。通过sys.dm_tran_locks
我们看到该 SPID 已被授予对队列的 IX 锁。
| type | resource_id | mode | status | spid |
| OBJECT | 277576027 | IX | GRANT | 100 |
Run Code Online (Sandbox Code Playgroud)
在单独的进程 (SPID 101) 中执行五次:
BEGIN TRANSACTION;
DECLARE @conversation_group_id …
Run Code Online (Sandbox Code Playgroud) 假设我有一张桌子
CREATE TABLE Ticket (
TicketId int NOT NULL,
InsertDateTime datetime NOT NULL,
SiteId int NOT NULL,
StatusId tinyint NOT NULL,
AssignedId int NULL,
ReportedById int NOT NULL,
CategoryId int NULL
);
Run Code Online (Sandbox Code Playgroud)
在这个例子中TicketId
是主键。
我希望用户能够针对该表创建“部分临时”查询。我说部分是因为查询的一些部分将始终固定:
InsertDateTime
ORDER BY InsertDateTime DESC
用户可以选择过滤任何其他列。他们可以过滤无、一个或多个。对于每一列,用户可以从一组值中进行选择,这些值将作为析取应用。例如:
SELECT
TicketId
FROM (
SELECT
TicketId,
ROW_NUMBER() OVER(ORDER BY InsertDateTime DESC) as RowNum
FROM Ticket
WHERE InsertDateTime >= '2013-01-01' AND InsertDateTime < '2013-02-01'
AND StatusId IN (1,2,3)
AND (CategoryId IN (10,11) OR …
Run Code Online (Sandbox Code Playgroud) 给定一个表具有主键定义(作为聚集索引),我想有效地更改定义(或者至少,刚刚聚集索引)的PRIMARY KEY的网络。
我想简单地执行以下操作:
CREATE UNIQUE CLUSTERED INDEX PK_MyTable ON dbo.MyTable
(
[Col2] ASC
) WITH (DROP_EXISTING = ON, ONLINE = ON);
Run Code Online (Sandbox Code Playgroud)
但是,这会导致错误:Cannot recreate index 'PK_MyTable'. The new index definition does not match the constraint being enforced by the existing index.
. 我明白为什么。
有没有另一种方法来实现这一点?
对于背景:我们有一个只能通过非聚集索引查询的表。该索引的特性非常适合作为表的聚集索引(即唯一且不变的窄键,插入主要在“末尾”)。当前的 PRIMARY KEY(聚集索引)只是一个代理键。该表不是任何 FK 关系的目标,并且从不通过当前 PRIMARY KEY 查询行。我们想在线有效地更改聚集索引。我们正在运行企业版。
如果条款“在线”操作;至少我们希望继续插入新行,但我们可以暂时挂起查询,直到操作完成。
如果无法在线使用现有表执行此操作,是否有一种方法(可能涉及新表并复制数据)可以在尽可能少的中断情况下工作?