1

私は2つのテーブルを持つDBを持っています自動インクリメント 1,1 tiny int)、Name、Url (プロバイダ + ビデオ ID を使用してリンクを構築するため)

YouTube とは異なり、小規模なプロバイダーには、配列を返し、ランダムなものを取得する API がありません。

私が今得た両方の方法で、完全にランダムな行を取得するのに1秒もかかりません:

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 )

また

少し長い

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 秒に短縮されますが、それは長すぎます。

「order by newid()」を使用せずにクエリ全体を取得すると、クエリにかかる時間が大幅に短縮されますが、アプリケーションはユーザーごとに約 0.2 ~ 2 MB のデータを消費します。データ

4

1 に答える 1

1

一般に、「like」演算子は非常に負荷が高く、パターンが「%」で始まる場合、それぞれの列のインデックス (あると仮定) でさえ使用できません。クエリのパフォーマンスを向上させる簡単な方法はないと思います。

于 2014-06-04T14:00:04.773 に答える