小编Jos*_*gle的帖子

快速将 NULL 列更改为 NOT NULL

我有一个包含数百万行和一个允许 NULL 值的列的表。但是,当前没有一行具有该列的 NULL 值(我可以通过查询快速验证这一点)。但是当我执行命令时

ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
Run Code Online (Sandbox Code Playgroud)

相对而言,查询需要永远。它实际上需要 10 到 20 分钟,是添加检查约束的两倍多。有没有办法立即更新该列的表元数据,尤其是因为我知道该列没有任何行具有 NULL 值?

sql-server-2008 null alter-table

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

Sch-M WAIT 阻止 SQL Server 2014 中的 Sch-S 而不是 SQL Server 2008 R2?

我们最近将生产实例从 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)

sql-server service-broker locking

11
推荐指数
1
解决办法
2810
查看次数

使用析取有效过滤大集合

假设我有一张桌子

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是主键。

我希望用户能够针对该表创建“部分临时”查询。我说部分是因为查询的一些部分将始终固定:

  1. 查询将始终InsertDateTime
  2. 查询将始终 ORDER BY InsertDateTime DESC
  3. 查询将分页结果

用户可以选择过滤任何其他列。他们可以过滤无、一个或多个。对于每一列,用户可以从一组值中进行选择,这些值将作为析取应用。例如:

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)

index sql-server

9
推荐指数
1
解决办法
2055
查看次数

如何在线有效地创建新的 PRIMARY KEY CLUSTERED 定义

给定一个表具有主键定义(作为聚集索引),我想有效地更改定义(或者至少,刚刚聚集索引)的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 查询行。我们想在线有效地更改聚集索引。我们正在运行企业版。

如果条款“在线”操作;至少我们希望继续插入新行,但我们可以暂时挂起查询,直到操作完成。

如果无法在线使用现有表执行此操作,是否有一种方法(可能涉及新表并复制数据)可以在尽可能少的中断情况下工作?

schema sql-server primary-key clustered-index

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