【发布时间】:2017-05-08 14:18:44
【问题描述】:
我正在尝试使用快速方法从一个大表(超过 100 万行)中获取 5 个随机行数。
到目前为止,我使用这些 SQL 查询进行了测试:
方法一
Select top 5 customer_id, customer_name
from Customer TABLESAMPLE(1000 rows)
order by newid()
此方法估计 I/O 成本为 0.0127546,因此速度非常快(索引扫描非集群)
方法二
select top 5 customer_id, customer_name
from Customer
order by newid()
此方法的排序估计 I/O 成本为117.21189,索引扫描非集群估计 I/O 成本为2.8735,所以这会影响性能
方法3
select top 5 customer_id, customer_name
from Customer
order by rand(checksum(*))
此方法的排序估计 I/O 成本为 117.212,索引扫描非聚集估计 I/O 成本为 213.149,此查询比所有查询都慢,因为估计子树成本为 213.228,因此非常慢。
更新:
方法四
select top 5 customer_id, customer_name, product_id
from Customer
Join Product on product_id = product_id
where (customer_active = 'TRUE')
order by checksum(newid())
这种方法更好,速度也很快。所有的基准测试都很好。
问题
如何将方法 4 转换为 LINQ-to-SQL?谢谢
【问题讨论】:
-
您是在询问提高随机查询性能还是将查询转换为 LINQ?
-
您希望结果有多随机?
TABLESAMPLE并不是真正随机的(除非您的行太大以至于只有一个适合页面)。 -
@JuanCarlosOropeza 是的,首先,如果不可能,我希望将方法 1 转换为 LINQ,然后我正在寻找更好的方法。
-
@GordonLinoff:实际上客户只是想填满空间,所以我只需要显示 5 个随机行而不影响性能。
-
如果你想填满空间,为什么不只显示前 5 名?
标签: sql-server entity-framework linq random guid