sql - SQL Server 的奇怪行为 - 随机选择

标签 sql sql-server

我已经调试下面的语句几个小时了:

SELECT 
(
SELECT  t1.anotherColumn
FROM table1 t1
WHERE t1.aColumn=(1+ABS(Checksum(NewId()))%54)
) res, *
FROM 
(
SELECT TOP 200 * --PLEASE NOTICE HERE
FROM table2
)RESULT

问题是 res 每行始终包含相同的值。现在,如果我将查询语句中突出显示的 200 更改为 176 以下的任何数字,它会显示 table1 的随机行,这是所需的结果!
请注意,54 对结果没有影响,它之所以存在只是因为我的表中 aColumn 有 54 个从 1 到 54 的不同值。
我在不同的表上尝试过这个查询,并且这种奇怪的行为重复了!

最佳答案

结果的差异可能是由查询计划的差异造成的。

SQL优化器可以选择使用Table Spool/Lazy Spool操作符。在这种情况下,NEWID() 被调用一次,GUID 存储在临时表中并用于所有其他行。

https://technet.microsoft.com/en-us/library/ms191221(v=sql.105).aspx

... 更新: 可以通过在底部添加以下行来修复查询计划:

option(use plan 
N'
<your XML plan>
')

要捕获“好的”XML 计划,请运行

SET SHOWPLAN_XML ON

并执行显示预期结果的查询。将其复制粘贴到选项(使用计划...)

此解决方案适用于大量行(数百万)

关于sql - SQL Server 的奇怪行为 - 随机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39324055/

相关文章:

sql - 引导为PK低性能

SQL Server 查询 : Adjust money column

MySQL 错误 : Cannot add foreign key constraint?

mysql - 使用 LEFT JOIN、SUM() 和 HAVING() 选择 COUNT()

php - 使用 codeigniter 的事件记录在 SQL 语句末尾放置 where 子句

mysql - SQL 查询 nvarchar 至今

sql - 多个表中的多个更新和删除 SQL Server

php - MySQL查询 - 一个表中的单行,另一个表中的多行

sql - 在 SQL Server 2008 中计算表行数的有效查询是什么?

sql-server - SQL Server 2012 创建具有可变数量属性的 xml