Flo*_*ndt 8 sql sql-server random performance query-performance
我有一个大约800万行的数据库,我想从中随机选择n行.首先,我在StackOverflow和MSDN上的文章中阅读了流行的和类似的问题,但我觉得答案仍然不适合我的需求.
如果我想在没有额外条件的情况下随机选择一定百分比的行,那么所提供的解决方 但是我想要随机选择n行(例如最多5行),所有这些都匹配某个条件.
我的数据库包含包含词性,标签,引理和令牌等信息的单词.现在我想执行查询以选择5个与查询中的单词类似的随机单词(例如,给我5个类似于模糊的单词),这是通过仅查看具有相同词性和单词的值来确定的. levenshtein距离超过一定阈值.我在sql server中有一个函数可以计算levenshtein距离.
上述方法的问题在于它们要么必须遍历所有记录并计算levenshtein距离(这需要花费很多时间!),或者它们只能让我选择百分比而不是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
Run Code Online (Sandbox Code Playgroud)
然而,只有顶部我总是得到相同的结果.我需要我的上衣是随机的.像使用NEWID()这样的方法将首先遍历整个数据库,然后随机选择,这不是我想要的行为,因为它们占用时间太长.
有没有人有想法在庞大的数据库上快速选择n个随机行?
编辑:
有人(不在StackOverflow上)可能为我提供了一个OPTION子句和fast关键字的解决方案,该关键字检索它找到的前n行.
使用OPTION(快5)我到目前为止获得了最佳性能(在800万行表上有10秒).我还将Levenshtein函数从SQL实现更改为ac#编写的库实现,这大大加快了性能.
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)
Run Code Online (Sandbox Code Playgroud)
为了获取随机数据,您需要遍历与 where 子句匹配的所有行。搜索将仅在与您的 where 表达式匹配的行上完成,因此它不会是全表搜索。如果您有很多与您的搜索匹配的记录,您可以执行以下操作:
select top 5 * from
(
SELECT DISTINCT TOP 1000 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
) order by newid();
Run Code Online (Sandbox Code Playgroud)
但当然,这不会是真正随机的。
归档时间: |
|
查看次数: |
1530 次 |
最近记录: |