【问题标题】:inserting 1 million records with sequence and select max用序列插入 100 万条记录并选择最大值
【发布时间】:2014-06-27 21:16:47
【问题描述】:

我尝试使用序列并使用我在下面发布的查询(使用 select max)在测试表中插入 100 万行。令人惊讶的是,带有 select max 的查询在 11:11(11 分 11 秒)内创建了 100 万行

带有序列的查询在 19:34(19 分 11 秒)内创建了 100 万行。现在我不确定哪个好

表:站点页面

CREATE TABLE [dbo].[SitePage](
    [PageID] [bigint] NOT NULL,
    [PageName] [nchar](50) NOT NULL,
 CONSTRAINT [PK_SitePage] PRIMARY KEY CLUSTERED 
(
    [PageID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这里是查询

  1. 查询创建序列

    create Sequence PageTableSequence
    START WITH 1
    INCREMENT BY 1
    NO CYCLE
    NO CACHE
    ;
    
  2. 使用 Select max(id) 查询以创建 100 万条记录

    DECLARE @intFlag INT
    SET @intFlag = 0
    Declare @maxrecords bigint
    set @maxrecords = 0
    while(@maxrecords<1000000)
    
    BEGIN
    WHILE (@intFlag =0)
    BEGIN
      BEGIN TRY
      Insert into SitePage (PageID, PageName) values ((Select max(PageID)+1  from SitePage),'Some Page Name');
      set @intFlag = @@rowcount
    
      END TRY
      BEGIN CATCH
      SET @intFlag=0
      END CATCH
    
    END
    set @maxrecords = @maxrecords+1
    set @intFlag=0
    END
    
    GO
    
  3. 使用Sequence查询插入100万条记录

    Declare @maxrecords bigint
    set @maxrecords = 0    
    
    while(@maxrecords<1000000)    
    
    BEGIN      
    
      Insert into SitePage (PageID, PageName) values (next value for PageTableSequence, 'some page name');
    
      set @maxrecords = @maxrecords+1
    
    END
    
    GO
    

为什么sequence和select max会有这么大的差别

【问题讨论】:

  • 还有……有什么问题?
  • 这很奇怪,我希望序列比使用 max(PageId) 快很多。
  • 嗨。看起来你被卡住了,因为你害怕开销问题。有没有办法可以复制你的表,以便你有一个测试表可以使用?这样你就可以亲眼看到。接下来...您熟悉堆栈交换代码审查网站吗?对于那个网站来说,这将是一个很好的问题。考虑你的问题,(哪个更好?)我们不能很好地处理这些类型的开放式问题。 Stack Overflow 主要用于解决问题,发现问题为次要。
  • @FrankTudor 我不认为这是一个“哪个更好”的问题。这是“为什么序列表现如此糟糕”。我想它的措辞可以更好。
  • 所以您在一项测试中有所不同。很多事情都在服务器中进行。运行 1000 次。您已经创建了测试表。有什么问题?

标签: sql sql-server tsql


【解决方案1】:

尽量不要使用“NO CACHE”,而是使用“CACHE 100”,甚至是 1000。这应该可以减少 IO 并提高性能。见http://msdn.microsoft.com/en-us/library/ff878091.aspx

【讨论】:

  • +1 先生回答他的问题...我和其他人一样继续前进,因为我觉得这更像是一个意见问题。
  • 测试是生成连续的主键值而不会中断,即使在服务器重新启动后也是如此。目前,当服务器重启时,sql server 2012 将为 bigint 数据类型创建 10000 的间隙。即使有缓存。目标是针对无缓存进行测试
  • 如果有帮助,有一些处理identity gaps in Sql Server 2012的技巧
猜你喜欢
  • 2019-06-19
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多