3

まず第一に、私はデータベースの専門家ではなく、請負業者です。私は (優秀な) プログラマーを雇いましたが、私たちが経験したいくつかの問題と私が読んでいるすべての情報のために、データベース設計の特定の部分について疑問を持っています. はじめましょう。

パーサーを使用してすべてのデータを処理し、ms-sql データベースに格納するハウジング サイトを構築します。毎日、フィードには約 70,000 件のレコードが含まれており、そのほとんどに写真 (平均 3 件) が添付されています。写真のサイズは 30kb から 400kb までさまざまです。データベースにはほぼ同じ量のレコードがあります。約 400 個の新しいオブジェクトが処理されます。これは、データが変更されたかどうか、オブジェクトが削除されたかどうか、または新しいオブジェクトであるため挿入する必要があるかどうかを確認するために、データベース内のすべてのレコードを毎日入力する必要があることを意味します。写真はデータベースに保存されます。フィードは、32 GB のメモリと SSA ディスクを備えたデュアル クアッドコア マシンで処理されます。データベースのサイズは現在 600GB です。

現在、1 日に約 3000 人のユーザーが 6 軒の家を見て、1 ユーザーあたり平均 10 枚の画像を閲覧しています。

これが私たちが経験したことです: - 解析の全プロセスには約 13 時間かかります。- ログに多くのタイムアウト エラーが記録される - いくつかのデッドロック エラーが発生する - Google はタイムアウト エラーについて不平を言い、その結果、多くのページがインデックスに登録されない。- 一部のディレクトリの読み込みに 10 秒以上かかるため、Google はサイトを遅いと評価しています。

個人的には、データベース内の写真といくつかの悪いクエリに関係があると思います。しかし、プログラマーに不平を言う前に、これについてあなたの意見を聞きたいと思います。お時間をいただきありがとうございます。

プログラマーからの更新: テーブルの構造に関する情報を次に示します。画像には 2 つのテーブルがあり、1 つは画像のクエリ (たとえば、imageid と content-type のリストの取得など) に使用される imageinfo と呼ばれ、画像の id と BLOB を含む画像テーブルです。imageinfo テーブルには、イメージ テーブルと同じ ID (1:1 の関係) があり、イメージの名前、タイプ、ハッシュなどの追加情報があります。そのハッシュはパーサー プロセスで使用され、画像が変更されたかどうかが判断されます。したがって、画像テーブルが変更されるのは、パーサーから挿入/更新/削除が行われ、サイトが画像にアクセスするときだけです。1 つの画像にアクセスしてダウンロードするのにかかる時間は、約 350 ミリ秒です。

4

2 に答える 2

3

次の 2 つの問題を教えてください。

  1. インポートが遅い
  2. サイトの閲覧が遅い

(2) は簡単です。おそらく、読み取りクエリを理解し、それらにインデックスを付ける必要があります。これは間違いなく解決可能です。

(1) より具体的に説明しないと、何かを言うのははるかに難しい. 多くのブロブを比較する必要があることは理解しています。実際のデータに加えて、これらのブログのコンパクトなハッシュを保存できます。そうすれば、比較のために BLOB を取得する必要がなくなり、ハッシュのインデックスを作成することもできます。

データベースに画像が必要ですか?

最大の長所は次のとおりです。一貫性のある簡単なバックアップ、開発者の利便性。最大の短所は、潜在的な誤用です。一般に、イメージがファイル システムに属しているとは言えません。それらを別の場所に配置する特定の具体的な理由がある場合を除いて、データベースは通常問題ありません。

私の推測では、これらのブログの使用法は誤用に該当し、ファイルがファイル システムに保存されている場合も同じ問題が発生するでしょう。

于 2012-06-07T10:59:28.670 に答える
0

パフォーマンスがどこに影響を与えているかを実際に測定する必要があります。正確に何が遅いのかを知らなければ、それを修正することは望めません。

ただし、どこから測定を開始するかについてのアイデアを探している場合は、インポート プロセスを見て、RBAR スタイルで何が行われているかを確認することをお勧めします。RBAR は「Row By Agonizing Row」の略で、セットで作業する方がはるかに効率的な場合に、一度に 1 つの行を操作するプロセスを適切に表します。

私が確認するもう 1 つのことは、各画像のコンテンツを実際にチェックして、変更されていないことを確認していないことです。そのデータのバイナリ比較を行っている場合、非常に遅くなると想像できます。チェックサムを計算してチェックサムを比較すると、

a) SQL Server プロセスの外部で、できれば別のボックスでそのチェックサムを計算できます。b) 特にそのチェックサムが適切なインデックス
の列である場合、はるかに無駄のないプロセスで更新されたイメージをチェックできます。INCLUDE

しかし、コメントされているように、画像を DB に保存することは、いずれにせよ最も優れたアイデアではありません。

于 2012-06-07T11:17:52.477 に答える