【问题标题】:How does the CACHE option of CREATE SEQUENCE work?CREATE SEQUENCE 的 CACHE 选项是如何工作的?
【发布时间】:2017-07-08 16:22:01
【问题描述】:

CREATE SEQUENCECACHE 选项

MSDN 定义为

[ CACHE [<constant> ] | NO CACHE ]

通过以下方式提高使用序列对象的应用程序的性能 最小化生成所需的磁盘 IO 数量 序号。默认为缓存。例如,如果缓存大小为 选择 50,SQL Server 不会缓存 50 个单独的值。它 只缓存当前值和剩余的值的数量 缓存。这意味着存储数据所需的内存量 缓存总是序列对象的数据类型的两个实例。

我知道它通过避免从磁盘 IO 读取并在内存中维护一些有助于可靠地生成序列中的下一个数字的信息来提高性能,但我无法想象缓存的简单内存表示会是什么样子MSDN 在示例中描述。

谁能解释一下缓存如何处理这个序列

CREATE SEQUENCE s
    AS INT
    START WITH 0  
    INCREMENT BY 25  
    CACHE 5

描述当以下每个语句独立执行时高速缓存将保存的内容:

SELECT NEXT VALUE FOR s -- returns 0
SELECT NEXT VALUE FOR s -- returns 25
SELECT NEXT VALUE FOR s -- returns 50
SELECT NEXT VALUE FOR s -- returns 75
SELECT NEXT VALUE FOR s -- returns 100
SELECT NEXT VALUE FOR s -- returns 125

【问题讨论】:

    标签: sql-server database tsql


    【解决方案1】:

    文档中的这一段非常有帮助:

    例如,创建一个新序列,其起始值为 1,缓存大小为 15。当需要第一个值时,值为 1 到 15 是从内存中提供的。最后缓存的值 (15) 写入磁盘上的系统表。当所有 15 个数字都 使用后,下一个请求(对于 16 号)将导致缓存 再次分配。新的最后缓存值 (30) 将被写入 系统表。

    所以,在你的场景中

    CREATE SEQUENCE s
        AS INT
        START WITH 0  
        INCREMENT BY 25  
        CACHE 5
    

    您将在内存中拥有0, 25, 50, 75 and 100,并且您只会在磁盘中获得一次 I/O 写入:100

    文档中解释说,您可能遇到的问题是,如果服务器出现故障并且您没有使用所有 5 个项目,那么下次您请求一个值时,您将获得 125

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2014-01-30
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多