Microsoft SQL Server:排序解决方案

新的 Microsoft SQL Server 平台提供了排序功能,对于遍布全球的 SQL 管理员来说,应该是大有裨益。

Denny Cherry

没有欢迎的新添加到 Microsoft SQL Server,存在发行版中的第一个公用测试版的 SQL Server"Denali"。SQL Server 社区中的许多成员具有已请求排序功能,多年来,并且他们最后将可用。

序列从概念上来说就像 IDENTITY 属性,您可以将其放在表的列。 标识和序列之间最大的区别是序列不会绑定到特定的表。 事实上,您就不必在所有使用表。 一个数据库可以包含多个序列中,仅受数据库中对象的总数。

创建序列

当您创建一个序列时,您不必指定如何或数据库使用该序列的位置。 序列是完全独立的对象,从数据库中的其他对象。 有几个要指定,但是您需要的选项。

第一种是 MINVALUE 选项,这是序列可以颁发的最小值。 下一步是 MAXVALUE 选项,这是序列可以颁发的最高值。 下一个选项是开始与选项,它将发出的第一个值。 当省略开始选项时,它将使用 MINVALUE 的第一个值。 下面是一个基本的创建顺序语句中的 MINVALUE、 MAXVALUE 和开始选项:

CREATE SEQUENCE dbo.MySequence AS INT MINVALUE 1 MAXVALUE 100000 START WITH 1000

如果您不想指定 MINVALUE 或 MAXVALUE,可以忽略这些行从创建序列语句也可以使用无 MINVALUE 和无 MAXVALUE 关键字,如下所示:

CREATE SEQUENCE dbo.MySequence AS INT NO MINVALUE NO MAXVALUE START WITH 1000

这是创建序列语句,而没有指定最小值或最大值。 但是,您应该指定 MINVALUE 和开始使用值为几个不同的原因。

首先,没有任何指出序列必须前进或增加值与每个增量。 您可能需要开始于较高的数字,并获取低每次添加一个新的数字的序列。 这两个值存在的另一个原因是当数字用尽时序列可以循环回到序列的开头。

您可能希望创建序列取值范围为从 1 到 10000,但启动与 1000 和用尽了通过从一开始的数字。 若要使循环回到开始时耗尽了数字序列,周期关键字创建时指定序列,如下面的代码 (可以使用无周期关键字防止序列循环回到序列的开头) 中所示:

CREATE SEQUENCE dbo.MySequence AS INT MINVALUE 1 MAXVALUE 100000 CYCLE

下面是序列的另一个看这种类型,使用无周期关键字:

CREATE SEQUENCE dbo.MySequence AS INT MINVALUE 1 MAXVALUE 100000 NO CYCLE

正如您可以看到这些示例中,该序列将使用数据类型 AS 关键字,这是 INT 或整型数据类型后指定了。 其他数据类型值选项包括 TINYINT、 SMALLINT、 BIGINT 或任何基于可接受的数据类型的用户定义的数据类型。

除了这些整数数据类型,您还可以使用十进制和数值数据,提供它们所定义的比例为零。 如果不没有指定任何数据类型,该序列将默认为 BIGINT 数据类型,这可能导致问题,如果您的表具有的值的存储的一个整数数据类型列中。

下一个设置,这是一种最为重要的信息,是高速缓存。 高速缓存设置告诉 SQL Server — 当其使用序列 — — 多少个值加载到内存每次需要新值。 高速缓存的工作的方式是最大的区别之间序列和标识属性的工作方式。

使用标识属性中,SQL Server 维护 20 中的值不能调整的内存缓存。 标识属性的性能问题是每次表中插入新行,并标识属性发出一个值,这一事实已使用此值写入 SQL Server 数据库。 行插入表的加载速度越快,快 SQL Server 必须向数据库写入此元数据。

与标识属性中,不同序列仅写入数据库的元数据值时首先置于缓存颁发的。 例如,如果序列颁发 1000 元,批处理中的行,第一批发出 1000 的值时将写入到元数据。 当需要 1001 的值时,另一个 1000 个值加载到缓存和 2000 的值被写入元数据。 这极大地减少了元数据写入操作的数量,可以提高数据库性能。

这样的一个缺点是会有颁发的序列,每次重新启动 SQL Server 值中的差距。 当数据库关闭时,它不会写入实际使用元数据的最后一个值。 因此,如果使用关闭前的最后一个值是 1,005 (并且我们有相同的设置,如先前所述),时下, 一步的行插入数据库后恢复在线后,所使用的下一个值将为 2000。

这可能导致耗尽数字标识值比快得多的序列。 它还可能导致存储经理能够变得心情沮丧值丢失了,在这种情况下他们需要简单地通过它获取并接受会有丢失的数字。

如果您需要使用每个可能的值的 SQL Server,配置缓存设置为无缓存。 这将导致要更像用于标识属性的序列。 但是,它会影响其他元数据写入由于序列性能。

若要控制要跳过的数字的数量,请使用序列的增量设置。 尽管之一的值可能是最常见的增量,递增的值可以是正数或负数,任何整数。 这将创建序列语句中使用增量通过关键字:

CREATE SEQUENCE dbo.MySequence AS INT MINVALUE 1 MAXVALUE 100000 INCREMENT BY 3 CYCLE

使用的序列

有几种不同的方式来使用序列。 您可以将它们留作表的默认值,以便在表中插入行时自动指定列的值。 这得就象是一个表与配置的标识属性。

另一个选项是拉内存储的过程 (或其他 T/SQL 代码) 从序列中的下一个值。 这种方式,您可以使用它在存储的过程处理 (或其他 T/SQL 代码) 的过程中。

当指定哪个序列将自动添加为某列的值向表中添加新行时,设置要拉下一个序列中,从值的列的默认值如下所示:

CREATE TABLE dbo.YourTable (YourTableId INT NOT NULL, AnotherColumn VARCHAR(10)) GO ALTER TABLE dbo.YourTable ADD DEFAULT NEXT VALUE FOR dbo.MySequence FOR YourTableId GO

当行插入到表中标识属性的方式相同,这可以将值分配从约束。

您可以执行具有不能标识属性与一系列巧妙操作之一是将值追加到从序列中获取其值的前面。 如果您需要将放在您收到来自该序列的值的前面的字母"A",您很容易地做到这一点并进行类型转换为字符值序列的输出。 然后将值添加到前面,如下所示:

CREATE TABLE dbo.YourTable (YourTableId INT NOT NULL, AnotherColumn VARCHAR(10)) GO ALTER TABLE dbo.YourTable ADD DEFAULT ‘A’ + CAST(NEXT VALUE FOR dbo.MySequence as VARCHAR(10)) FOR YourTableId GO

行插入到表中以相同的方式为 IDENTITY 属性,但同时将字符值附加到开始处检索到的值时,这可以将值分配从约束。

调用序列中正常 T/SQL 代码中的值 (是否从存储过程内或不) 完成中大致相同的方式。 使用下一个值的语法,并指定要从中检索下一个值序列的名称。 这将拉序列中的下一个可用值:

DECLARE @YourId INT SET @YourId = NEXT VALUE FOR dbo.MySequence

若要使用一系列的另一个途径是将其分配到行集中的行的行号。 使用下一个值语法作为您的 select 语句的一部分,如本示例所示:

SELECT NEXT VALUE FOR dbo.MySequence, * FROM sys.objects

此赋值序列从记录集中的每一行。

正如您所见,这一新排序功能是一个功能强大的工具。 数量和多种用途的 SQL Server 中的序列仅受您的想象力。

Denny Cherry

**Denny Cherry**已超过十年的经验管理 SQL Server。 他擅长的领域包括系统体系结构、 性能调节、 复制和故障排除。 他拥有几个 SQL Server,SQL Server 2008 包括 Microsoft 认证的主控形状与相关的认证。 他 Microsoft SQL Server MVP 了几年中,并编写了大量技术文章和书籍上 SQL Server 管理和 SQL Server 如何与各种其他技术集成。

相关内容