gpt4 book ai didi

sql-server - 从 SQL Server 表中获取随机行数

转载 作者:行者123 更新时间:2023-12-02 23:08:58 24 4
gpt4 key购买 nike

我正在尝试使用快速方法从一个大表(超过 100 万行)中获取 5 个随机行数。

到目前为止,我已经使用这些 SQL 查询进行了测试:

方法一

Select top 5 customer_id, customer_name 
from Customer TABLESAMPLE(1000 rows)
order by newid()

此方法估计 I/O 成本为 0.0127546,因此速度非常快(索引扫描非聚集)

方法2

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 所以速度非常慢。

更新:

方法4

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?谢谢

最佳答案

如果您想将方法 2 转换为 Linq To Entities,只需使用 jitender 回答的解决方案,如下所示:

var randomCoustmers = context.Customers.OrderBy(x => Guid.NewGuid()).Take(5);

但是对于非常快地遵循基准测试的方法 1,您需要执行以下 C# 代码,因为 Linq To Entities 没有此 SQL 语句的 LINQ 等效项 TABLESAMPLE( 1000 行)

var randomCoustmers = context.Customers.SqlQuery("Select TOP 5 customer_id, customer_name from Customer TABLESAMPLE(1000 rows) order by newid()").ToList();

您可以将 SQL 语句移至 SQL View 或存储过程中,该 View 或存储过程将接收要获取的客户数量。

更新

对于似乎非常快的方法 4(始终遵循您的基准),您可以执行以下 Linq To Entities:

var randomCoustmers = context.Customers.OrderBy(c => SqlFunctions.Checksum(Guid.NewGuid()).Take(5);

Entity Framework 可以将 SqlFunctions 中定义的所有函数转换为 SQL类(class)。在这些函数中,我们有 Checksum 函数,它将执行您想要的操作。

如果您想加入其他表,可以使用 Linq To Entites 轻松完成,因此我只是通过仅查询 Customers DbSets 来简化我的版本。

关于sql-server - 从 SQL Server 表中获取随机行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43850049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com