- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将 NEWID() 与持久计算列结合使用时,我得到了奇怪的结果。我是否使用了一些错误的功能?
创建列时不使用持久化,因此在选择列时计算值将返回正确的值。更新列 (col1) 也将返回正确的值。
DECLARE @test TABLE (
Col1 INT,
Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED)
INSERT INTO @test (Col1) VALUES
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5))
SELECT * FROM @test
UPDATE @test SET Col1 = Col1*1
SELECT * FROM @test
/*
Col1 Contains2
2 0
2 0
0 1
4 0
3 0
Col1 Contains2
2 1
2 1
0 0
4 0
3 0
*/
最佳答案
显然,查询引擎为每行计算两次随机数。
第一次Col1
,第二次为CASE
持久化列的声明。
优化器不知道,或者在这种情况下不关心 NEWID
是一个非确定性函数并调用它两次。
事实上,它甚至可能别无选择。您是否希望优化器在幕后创建临时表并填充其 Col1
生成随机数的表达式的结果,然后读回该临时表并使用这些保存的中间结果来计算 CASE
的结果表达式,然后执行最后的INSERT
?在这种情况下,优化器计算表达式两次而不将中间结果写入磁盘会更便宜。在其他一些情况下(例如,当您没有 5 行,而是 50 亿行或额外的索引时),估计成本可能会有所不同,并且这种行为会发生变化。
我认为你对此无能为力。只要注意这种行为即可。始终将生成的随机数集显式保存到表中,然后根据它们执行进一步的计算。
我在 SQL Server 2008 和 2014 中重现了它。这是我在 SQL Server 2008 中得到的一个执行计划,但它并不是很有趣。 2014年的计划是一样的,只是没有Top
运算符。
Constant Scan
运算符输出 Union1009
列表,用于 Compute Scalar
之后。我想,这取决于 Constant Scan
的实现细节和/或 Compute Scalar
运营商。
观察到的行为告诉我们 newid()
这里每行被调用两次。
关于sql-server - NEWID() 和 PERSISTED 计算列的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38120684/
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) 列,它将成
我是一名优秀的程序员,十分优秀!