- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些研究,我遇到了一个无法解释的异常情况(而且我在 Google 上找不到任何信息)。考虑以下 SQL:
CREATE TABLE MyGuid (
ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID()
)
GO
CREATE TABLE MyGuidSeq (
ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID()
)
GO
DECLARE @i INT, @noRecords INT
SET @noRecords = 1000000
-- MyGuid
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuid DEFAULT VALUES
SET @i = @i + 1
END
-- MyGuidSeq
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuidSeq DEFAULT VALUES
SET @i = @i + 1
END
exec sp_spaceused 'MyGuid', true
exec sp_spaceused 'MyGuidSeq', true
结果:
Table name No. Rows Reserved Space Actual space Index Size Unused Space
MyGuid 1,000,000 34,760 KB 34,552 KB 160 KB 48 KB
MyGuidSeq 1,000,000 24,968 KB 24,768 KB 176 KB 24 KB
问题
任何人都可以解释为什么使用 NEWSEQUENTIALID() 而不是 NEWID() 时保留/实际空间要小得多吗?
回应答案
我运行了以下测试来检查 Luaan 给出的答案:
CREATE TABLE MyGuid (
ID UNIQUEIDENTIFIER DEFAULT NEWID()
)
GO
CREATE TABLE MyGuidSeq (
ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID()
)
GO
DECLARE @i INT, @noRecords INT
SET @noRecords = 1000000
-- MyGuid
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuid DEFAULT VALUES
SET @i = @i + 1
END
-- MyGuidSeq
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuidSeq DEFAULT VALUES
SET @i = @i + 1
END
exec sp_spaceused 'MyGuid', true
exec sp_spaceused 'MyGuidSeq', true
不同之处在于我删除了主键(意味着该表现在是一个堆表)。现在这两个表的大小完全相同。这证明该表是通过其聚集索引进行物理组织的。
name rows reserved data index_size unused
MyGuid 1000000 25992 KB 25976 KB 8 KB 8 KB
MyGuidSeq 1000000 25992 KB 25976 KB 8 KB 8 KB
最佳答案
这与分区有关。基本上,newId()
将以随机顺序创建 GUID,这意味着您始终插入到表的中间。另一方面,顺序 ID 总是附加到表的末尾,这要简单得多。
如果你想了解更多,可以看看分页上的一些资料。一个好的开始可能是关于 MS SQL 分页的官方 MSDN 页面 - http://technet.microsoft.com/en-us/library/ms190969(v=sql.105).aspx
您还必须了解,行本质上是按存储数据库数据的物理文件中的 ID 组织的。 ID 之间没有空格的文件(例如使用标识列且不删除时)可以占用更少的空间来存储相同数量的数据。
我预计数据库的完全收缩将显着减少 MyGuid 表中因碎片而丢失的空间量,而对 MyGuidSeq 大小的影响很小。
如果您可以使用顺序 GUID,那就这样做 - 它们可以大大提高 INSERT 效率,并且通过扩展,索引也可以减少碎片,整体更小。
您没有显示“花费的时间”调试输出,但我希望这些输出也有显着不同(尽管这可能会被数据库可用的内存所抵消 - 它不需要改变立即数据文件;如果您想了解更多信息,请查找有关事务日志的内容)。
关于sql-server - 为什么使用 NEWID() 比 NEWSEQUENTIALID() 使用更多空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974062/
SELECT 是这样的: SELECT DISTINCT Header.EntryGUID, Header.ImportDate FROM table_Name Header
这个问题在这里已经有了答案: Entity Framework - default values doesn't set in sql server table (4 个答案) 关闭 8 年前。 我
SQL Server: 复制代码代码如下: Select TOP N * From TABLE Order By NewID() view pl
在一个表中,我创建了一个新列,它将保存一个随机的字母数字字符串。我一直在使用 NEWID() 函数。根据我的理解,NEWID 应该只为每行创建一个新的 guid,但我所有的行都以相同的 guid 结束
我有一个存储过程,它接受两个 UniqueIdentifier 类型的参数 当我通过显式调用 NewId() 来代替参数之一来调用此存储过程时: exec dbo.TestArgs newid, '3
使用 MSSQL Server 2008 Enterprise Edition,以及很可能的其他版本的 MSSQL,这里是一个概念证明,它根据您使用的是 JOIN 还是 LEFT JOIN 来创建临时
我不断收到此错误:有什么想法吗? Invalid use of side-effecting or time-dependent operator in 'newid' within a functi
我有一个 sql 查询,我正在使用 distinct 语句 CREATE proc SProc_SelectPhotographersByLocation @locationID
我想使用 newId 生成随机数。通常你只会使用它一次,但我可能会为每个 newId 生成多达 10 个随机数。 是否足够随机? 最佳答案 Usually you would use it just
我使用的是 sql server 2008。有没有办法生成唯一的序列号?它应该展示 NEWID() 和标识列的属性,这意味着它始终是唯一的,但每个后续值都大于前一个值。它不能是 datetime/da
摘要 类似的查询 SELECT * FROM elbat t CROSS JOIN (SELECT newid() guid) x; 在 SQL Server 中
我正在尝试生成一个新的 GUID 并将该值分配给 NewReportID .但是,我不确定是否替换 @NewReportID程序中随处可见 newid()它将为每一行生成一个新的 GUID。 我必须生
SQL Server 2000: 我有一个包含测试数据的表(大约 100000 行),我想使用另一个表中的一些随机数据更新另一个表中的列值。根据this question ,这就是我正在尝试的: UP
我知道如果我运行这个查询 select top 100 * from mytable order by newid() 它将从我的表中获取 100 条随机记录。 但是,我对它的工作原理有点困惑,因为我
目前,我们有许多在主键上使用 newid() 的表。这会导致大量碎片。所以我想更改列以使用 newsequentialid() 代替。 我想现有的数据将仍然非常碎片化,但新数据的碎片化程度会降低。这意
我偶然发现了一个随机代码 ID 生成器,但我不知道它是如何工作的。 SELECT TOP (5) c1 FROM ( VALUES ('A'), ('B'), ('C'), ('D'), ('
我知道 GUID 在理论上是唯一的,发生冲突的可能性非常低。但是,如果我理解得当,某些独特性是可用的,因为它是根据所使用的算法从用于生成它的计算机上的信息中播种的。 给定一个 GUID,用户猜出表中其
我需要在 SQL Server 2008 R2 中创建一个 GUID 列表,我正在使用 NEWID()功能。 这就是我正在尝试的,但我只得到一个 ID: SELECT TOP 100 NEWID()
您好,我想使用以下语句生成一个唯一随机数: Convert(int, (CHECKSUM(NEWID()))*100000) AS [ITEM] 因为当我在“from”上使用 joins 子句时,它会
在 fluentMigrator 中,是否可以将列默认设置为函数? 具体来说,我将向已包含数据的 SQL Server 2008 表添加一个 uniqueidentifier (Guid) 列,它将成
我是一名优秀的程序员,十分优秀!