使用like语句检索随机行(超过5百万行)

时间:2014-06-04 13:51:43

标签: sql sql-server newid

我有一个有两张桌子的数据库 tblVideos大约有800万行,包含Id(自动增量1,1),videoId,名称,标签,(FK)VideoProviderId tblVideoProviders目前约有6家提供商,有3列: Id(自动递增1,1 tiny int),Name,Url(使用提供者+视频ID构建链接)

与YouTube不同,较小的提供商没有API来返回数组,然后随机选择一些内容。

在我现在获得的两种方式中检索一个完全随机的行需要不到一秒:

select top 1 tblVideoProvider.Url + tblVideos.videoId as url, tblVideos.Name,
tblVideos.tags from tblVideos
inner join tblVideoProvider
on tblVideos.VideoProviderId = tblVideoProvider.id
WHERE ((ABS(CAST(
(BINARY_CHECKSUM
(tblVideos.id, NEWID())) as int))
% 6800000) < 10 )

OR

稍长

select top 1 tblVideoProvider.Url + tblVideos.videoId as url,
tblVideos.Name, tblVideos.tags from tblVideos
inner join tblVideoProvider
on tblVideos.VideoProviderId = tblVideoProvider.id
ORDER BY NEWID()

但是一旦我开始寻找更具体的东西:

select top 1 tblVideoProvider.Url + tblVideos.videoId as url, tblVideos.Name,
tblVideos.tags from tblVideos
inner join tblVideoProvider
on tblVideos.VideoProviderId = tblVideoProvider.id
where (tblVideos.tags like '%' + @tag + '%')
or (tblVideos.Name like '%' + @tag + '%')
ORDER BY NEWID()

查询命中8秒,移除最后一个或 tblVideos,如将其缩短为4~5秒,但这太高了。

通过newid()&#34;检索整个查询而不使用&#34;顺序将使查询花费更少的时间,但应用程序将消耗每个用户大约0.2~2 MB的数据,并假设超过200~400个simultanios请求最终导致大量数据

1 个答案:

答案 0 :(得分:1)

一般来说,&#34;喜欢&#34;运算符非常昂贵,当模式以&#34;%&#34;甚至不能使用相应列的索引(假设您有一个索引)。我认为没有简单的方法来提高查询的性能。