gpt4 book ai didi

sql - 有条件地从一个巨大的数据库中随机选择n行

转载 作者:行者123 更新时间:2023-12-02 13:51:20 25 4
gpt4 key购买 nike

我有一个大约有 800 万多行的数据库,我想从中随机选择 n 行。首先,我已经阅读了StackOverflow上的流行且类似的问题。以及关于MSDN的文章,但是我觉得答案还是不符合我的需要。

如果我想要在没有额外条件的情况下随机选择一定比例的行,那么所提供的解决方案非常有效。但我想随机选择 n 行(例如最多 5 行),所有行都匹配某个条件。

我的数据库包含单词及其词性、标签、引理和标记等信息。现在我想执行一个查询来选择 5 个随机单词,它们都与查询中的单词相似(例如,给我 5 个与 fuzzy 相似的单词),这是通过仅查看具有相同部分的单词来确定的语音和编辑距离值高于某个阈值。我在sql server中有一个函数可以计算编辑距离。

上述方法的问题在于,它们要么必须遍历所有记录并计算编辑距离(这会占用大量时间!),要么只提供我选择百分比而不是 n 行。

运行良好的查询是:

SELECT DISTINCT TOP 5 lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG 
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun'
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].edit_distance('monarchie', Words.Token) > 0.5

但是,仅使用 top 我总是得到相同的结果。我需要我的上衣是随机的。像使用 NEWID() 这样的方法将首先遍历整个数据库,然后随机选择,这不是我的预期行为,因为它们花费的时间太长。

有人知道在一个巨大的数据库上快速选择n个随机行吗?

<小时/>

编辑:

有人(不在 StackOverflow 上)可能为我提供了一个带有 OPTION 子句和 fast 关键字的解决方案,该解决方案检索它找到的前 n 行。

使用 OPTION(fast 5),我获得了迄今为止最好的性能(在 800 万行以上的表上运行 10 秒)。我还将 Levenshtein 函数从 SQL 实现更改为 C# 编写的库实现,这大大提高了性能。

Select top 5 * from (
SELECT DISTINCT lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun'
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].clrEditDistance('monarchie', Words.Token) > 0.5
) AS T
ORDER BY NEWID()
OPTION(fast 5)

最佳答案

避免全面扫描将会很困难。如果您有一个可以轻松随机选择的列,例如您碰巧有一个几乎没有间隙的“密集”身份列,请用以下修改替换 Klark 的方法:

declare @results table (id bigint, name varchar(100))

while (select count(*) from @results) < 5
begin
insert @results
(name)
select name
from (
select *
from dbo.Words
WHERE IDCOLUMN = CONVERT(INT,RAND()) * APPX_NUMBER_OF_ROWS
) as SubQueryAlias
where dbo.edit_distance(left(name,4), 'APRS', 100) < 3
end

select *
from @results)

关于sql - 有条件地从一个巨大的数据库中随机选择n行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19764652/

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