热点
站长优化建站效能:高效工具链与全链路数据规划方案,reasoning_content:我们要求以网站站长的口吻,写一个与技术、科技相关,关于[优化建站效能:打造高效工具链与全链路数据规划方案]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以提炼核心:优化建站效能,高效工具链,全链路数据规划站长口吻,可以加一些动词或感叹例如:站长必看:高效工具链+全链路数据规划,建站效能翻倍 但可能超30字数一下:站长必看:高效工具链+全链路数据规划,建站效能翻倍(共20字?站长必看4字,冒号1,高效工具链5,加号1,全链路数据规划7,逗号1,建站效能翻倍6,总4+1+5+1+7+1+6=25字,可以)但更简洁:优化建站效能:工具链与数据规划全链路方案(14字?优化建站效能6,冒号1,工具链3,与1,数据规划4,全链路方案5,总6+1+3+1+4+5=20字)但需要站长口吻,可以加“站长”二字比如“站长优化建站:工具链+全链路数据规划方案”(17字)或者更直接:打造高效工具链与全链路数据规划,提升建站效能(16字)但题目要求是标题,可以更吸引人参考常见标题风格:从0到1,站长如何用工具链与数据规划提升建站效能?但问号可能不算30字内nn我选:站长必看:高效工具链+全链路数据规划,建站效能翻倍(25字)或者:优化建站效能:站长必备工具链与全链路数据规划(20字)更简洁:建站效能翻倍!工具链+全链路数据规划方案(18字?建站效能翻倍6,感叹号1,工具链3,加号1,全链路数据规划7,方案2,总6+1+3+1+7+2=20字)但需要明确“优化建站效能”主题最好包含“优化”或“提升”nn考虑题目给出的主题是[优化建站效能:打造高效工具链与全链路数据规划方案],所以标题可以摘取:优化建站效能:打造高效工具链与全链路数据规划方案(这个本身就是21字?优化建站效能6,冒号1,打造2,高效工具链5,与1,全链路数据规划7,方案2,总6+1+2+5+1+7+2=24字,直接作为标题也可以,但不够站长口吻可以加“站长”变成“站长优化建站效能:打造高效工具链与全链路数据规划方案”29字,刚好或者去掉“打造”变成“优化建站效能:高效工具链与全链路数据规划方案”20字加上“站长”变“站长优化建站效能:高效工具链与全链路数据规划方案”23字这样的标题直接明了nn我最终选择:站长优化建站效能:高效工具链与全链路数据规划方案(23字)
边缘运维精选工具链:数据整合驱动建站效能优化,reasoning_content:我们要求以边缘计算运维工程师的口吻,写一个与技术、科技相关,关于[精选工具链:驱动数据整合,优化建站效能]的标题直接输出一个标题,不要加说明,简短精炼,30字以内nn需要体现边缘计算运维工程师的身份特点,比如强调边缘、运维、工具链、数据整合、建站效能等可以结合边缘计算的特点:低延迟、分布式、实时处理标题风格可以技术化、有力nn可能的边缘工具链实战:数据整合加速建站效能或者:精选工具链驱动数据整合,优化边缘建站效能(这个可能超过30字?数一下:精选工具链驱动数据整合,优化边缘建站效能 - 共18个字,可以)但注意要体现边缘计算运维工程师的口吻,所以可以加入运维或边缘nn另一种:边缘运维工具链:数据整合提升建站效能或者:边缘数据整合利器,工具链优化建站太短不够完整nn考虑一个直接有力的:边缘运维精选工具链:数据整合驱动建站效能优化这个字数:边缘运维精选工具链:数据整合驱动建站效能优化 - 共16个字,可以nn更简洁:边缘工具链:数据整合优化建站效能14字nn但要求包含精选工具链:驱动数据整合,优化建站效能这个核心最好直接引用但稍作调整例如:精选工具链驱动数据整合,优化边缘建站效能18字nn注意精选工具链是固定的,那么标题可以是:精选工具链:驱动数据整合,优化建站效能这个正好是原句,但缺少边缘计算运维工程师的口吻可以加在开头:边缘运维:精选工具链驱动数据整合,优化建站效能这个也是18字,但冒号用法或者:边缘运维 | 精选工具链:驱动数据整合,优化建站效能带竖线也可nn为了更符合工程师口吻,可以写成:边缘运维实战:精选工具链驱动数据整合,优化建站效能20字nn或者:边缘计算运维:精选工具链驱动数据整合建站13字,但少了优化效能nn最终决定一个最合适:边缘运维精选工具链:数据整合驱动建站效能优化正好16字,精炼
性能工程师:全链路工具链整合提升建站效能,reasoning_content:我们要求以性能工程师的口吻,写一个与技术、科技相关,关于[优化导向工具链整合:全链路提升建站效能方案]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn关键词:性能工程师、技术、科技、优化导向工具链整合、全链路、提升建站效能方案可以组合成类似:全链路工具链整合:性能工程师的建站效能提升方案 但需要更简洁nn可能的全链路工具链整合:性能工程师的建站效能提升 还是有点长或者:性能工程师打造全链路工具链,极致建站效能 但字数nn更精炼:全链路工具链整合:性能工程师的建站效能方案 (18字) 但方案重复了原文或者全链路工具链整合:性能优化提升建站效能 (18字) 但缺少性能工程师口吻nn要求以性能工程师口吻,可以写成:性能工程师:全链路工具链整合提升建站效能 (20字)或者工具链全链路整合:性能工程师的建站效能方案 (20字)注意不要超过30nn我想到:全链路工具链整合:性能工程师的效能提升方案 (19字)或者更技术:优化导向工具链全链路:性能工程师建站效能方案 (21字)nn最好包含科技或技术?题目说与'技术、科技'相关,可以加入一点科技感比如科技赋能:性能工程师全链路工具链整合方案 (20字)但方案可能多余直接科技赋能:性能工程师打造全链路工具链 (19字) 但缺少提升建站效能nn再考虑:性能工程师:全链路工具链整合,科技提升建站效能 (22字)有点长nn最简洁:全链路工具链整合:科技赋能建站效能 (16字) 但缺少性能工程师口吻可以在前面加性能工程师:变成性能工程师:全链路工具链整合科技赋能 (19字) 不太通顺nn更好的:性能工程师的科技利器:全链路工具链整合 (19字) 然后提升建站效能放后面?但字数可能超nn我决定采用:全链路工具链整合:性能工程师的建站效能科技方案 (21字) 有点啰嗦nn标准答案应简短有力参考类似标题常见格式:全链路工具链整合:性能工程师的效能提升之道 (19字)或者性能工程师:全链路工具链整合,建站效能最大化 (21字)nn个人偏好:性能工程师:全链路工具链整合提升建站效能 (20字) 很直接符合要求
17 9 月 2026, 周四

sql-server – 为什么在我的测试用例中,顺序GUID键的执行速度比

在询问
this问题比较顺序和非顺序GUID之后,我尝试比较INSERT性能:1)一个表与GUID主键顺序初始化newsequentialid(),和2)一个表,INT主键按顺序初始化(1,1).我希望后者最快,因为整数宽度较小,生成顺序整数似乎比顺序GUID更简单.但令我惊讶的是,带有整数键的表上的INSERT明显慢于顺序GUID表.

这显示了测试运行的平均时间使用(ms):

NEWSEQUENTIALID()  1977
IDENTITY()         2223

有谁能解释一下?

使用以下实验:

SET NOCOUNT ON

CREATE TABLE TestGuid2 (Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY,SomeDate DATETIME,batchNumber BIGINT,FILLER CHAR(100))

CREATE TABLE TestInt (Id Int NOT NULL identity(1,1) PRIMARY KEY,FILLER CHAR(100))

DECLARE @BatchCounter INT = 1
DECLARE @Numrows INT = 100000


WHILE (@BatchCounter <= 20)
BEGIN 
BEGIN TRAN

DECLARE @LocalCounter INT = 0

    WHILE (@LocalCounter <= @NumRows)
    BEGIN
    INSERT TestGuid2 (SomeDate,batchNumber) VALUES (GETDATE(),@BatchCounter)
    SET @LocalCounter +=1
    END

SET @LocalCounter = 0

    WHILE (@LocalCounter <= @NumRows)
    BEGIN
    INSERT TestInt (SomeDate,@BatchCounter)
    SET @LocalCounter +=1
    END

SET @BatchCounter +=1
COMMIT 
END

DBCC showcontig ('TestGuid2')  WITH tableresults
DBCC showcontig ('TestInt')  WITH tableresults

SELECT batchNumber,DATEDIFF(ms,MIN(SomeDate),MAX(SomeDate)) AS [NEWSEQUENTIALID()]
FROM TestGuid2
GROUP BY batchNumber

SELECT batchNumber,MAX(SomeDate)) AS [IDENTITY()]
FROM TestInt
GROUP BY batchNumber

DROP TABLE TestGuid2
DROP TABLE TestInt

更新:
修改脚本以执行基于TEMP表的插入,如下面的Phil Sandler,Mitch Wheat和Martin的示例,我也发现IDENTITY应该更快.但这不是传统的插入行的方式,我仍然不明白为什么实验最初会出错:
即使我从原始示例中省略了GETDATE(),IDENTITY()仍然会慢一些.因此,似乎使IDENTITY()的性能优于NEWSEQUENTIALID()的唯一方法是准备要插入临时表的行,并使用此临时表执行多次插入作为批量插入.总而言之,我认为我们没有找到对这种现象的解释,对于大多数实际用法而言,IDENTITY()似乎仍然较慢.有谁能解释一下?

解决方法

我修改了@Phil Sandler的代码,以消除调用GETDATE()的影响(可能涉及硬件效果/中断??),并使行长度相同.

[自SQL Server 2000以来,有几篇文章涉及时序问题和高分辨率计时器,所以我想尽量减少这种影响.]

在简单的恢复模型中,数据和日志文件的大小都超过了所需的大小,这里是时间(以秒为单位):(根据下面的确切代码更新了新结果)

Identity(s)  Guid(s)
       ---------    -----
       2.876        4.060    
       2.570        4.116    
       2.513        3.786   
       2.517        4.173    
       2.410        3.610    
       2.566        3.726
       2.376        3.740
       2.333        3.833
       2.416        3.700
       2.413        3.603
       2.910        4.126
       2.403        3.973
       2.423        3.653
    -----------------------
Avg    2.650        3.857
StdDev 0.227        0.204

使用的代码:

SET NOCOUNT ON

CREATE TABLE TestGuid2 (Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY,FILLER CHAR(88))

CREATE TABLE TestInt (Id Int NOT NULL identity(1,FILLER CHAR(100))

DECLARE @Numrows INT = 1000000

CREATE TABLE #temp (Id int NOT NULL Identity(1,rowNum int,adate datetime)

DECLARE @LocalCounter INT = 0

--put rows into temp table
WHILE (@LocalCounter < @NumRows)
BEGIN
    INSERT INTO #temp(rowNum,adate) VALUES (@LocalCounter,GETDATE())
    SET @LocalCounter += 1
END

--Do inserts using GUIDs
DECLARE @GUIDTimeStart DateTime = GETDATE()
INSERT INTO TestGuid2 (SomeDate,batchNumber) 
SELECT adate,rowNum FROM #temp
DECLARE @GUIDTimeEnd  DateTime = GETDATE()

--Do inserts using IDENTITY
DECLARE @IdTimeStart DateTime = GETDATE()
INSERT INTO TestInt (SomeDate,rowNum FROM #temp
DECLARE @IdTimeEnd DateTime = GETDATE()

SELECT DATEDIFF(ms,@IdTimeStart,@IdTimeEnd) AS IdTime,@GUIDTimeStart,@GUIDTimeEnd) AS GuidTime

DROP TABLE TestGuid2
DROP TABLE TestInt
DROP TABLE #temp
GO

在阅读@ Martin的调查后,我在两种情况下都重新使用了建议的TOP(@num),即

...
--Do inserts using GUIDs
DECLARE @num INT = 2147483647; 
DECLARE @GUIDTimeStart DATETIME = GETDATE(); 
INSERT INTO TestGuid2 (SomeDate,batchNumber) 
SELECT TOP(@num) adate,rowNum FROM #temp; 
DECLARE @GUIDTimeEnd DATETIME = GETDATE();

--Do inserts using IDENTITY
DECLARE @IdTimeStart DateTime = GETDATE()
INSERT INTO TestInt (SomeDate,rowNum FROM #temp;
DECLARE @IdTimeEnd DateTime = GETDATE()
...

以下是时间结果:

Identity(s)  Guid(s)
       ---------    -----
       2.436        2.656
       2.940        2.716
       2.506        2.633
       2.380        2.643
       2.476        2.656
       2.846        2.670
       2.940        2.913
       2.453        2.653
       2.446        2.616
       2.986        2.683
       2.406        2.640
       2.460        2.650
       2.416        2.720

    -----------------------
Avg    2.426        2.688
StdDev 0.010        0.032

我无法获得实际的执行计划,因为查询永远不会返回!这似乎是一个bug. (运行Microsoft SQL Server 2008 R2(RTM) – 10.50.1600.1(X64))

dawei

【声明】:乐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了