2

私は現在、200 列以上と 300 万行のデータを持つテーブルを含むデータベースをクライアントから渡されたプロジェクトに取り組んでいます (笑)。これは間違いなく設計が不十分であり、現在いくつかのオプションを検討しています。16 GB の RAM と 512 ssd を搭載した 2012 mbp でアプリを開発しました。mvc4 を使用してアプリを開発する必要があったため、osx で Parallels 8 を使用して開発およびテスト環境をセットアップしました。設計の一環として、クライアントが数百行のこの大きなテーブルにカスタム クエリを作成するためのインターフェイスを開発したので、動的 linq を使用して渡される queryString をコントローラーに送信し、結果は JSON を使用してビューに送信されます。 (剣道UIグリッドを設定するため)。私のmbpでは、作成したインターフェースを使用してクエリをテストすると、剣道UIグリッドに結果を返すのに最大10秒かかります(検索が多すぎます)。同様に、

ただし、これらの同じクエリをテストするためにこれをクライアントに展開すると、3 分以上かかります。簡単に言うと、クライアントはサーバー ハードウェアをアップグレードしますが、それまでの間、アプリをテストする必要があります。

私の質問は、テーブルが 200 列を保持しているにもかかわらず、各行が一意であるということです。より具体的には、設計は次のとおりです。

PK-(GUID) OrganizationID (FK) --- 200 列 (税フィールド)

これを次のように再設計すると:

PK (GUID) OrganizationID (FK) FieldID(FK) 入力

フィールド テーブル: FieldID FieldName

これにより、この 300 万行のデータ テーブルが 6 億行になりますが、3 列しかありません。パフォーマンスの向上は見られますか?

洞察をいただければ幸いです-正規化は理解していますが、私の経験のほとんどはプログラミングです。

前もって感謝します!

4

2 に答える 2

1

テーブルで実行しているクエリを知らずに判断を下すことは非常に困難です。

いくつかの考慮事項を次に示します。

  1. 少数の行しか返さない場合は、クエリがインデックスを使用していることを確認してください。
  2. テーブルをメモリに格納するのに十分なメモリがあることを確認してください。
  3. タイミングを実行するときは、最初の実行を無視してください。これはページ キャッシュをロードしているだけだからです。

テスト目的で、テーブルのサイズを小さくしてください。それは物事をスピードアップするはずです。

正規化についての質問について。非正規化された構造は、値ごとにキーを繰り返す必要がないため、正規化された構造よりもはるかに少ないディスク容量を占有します。1 つの行で 1 つの値を探している場合、正規化は役に立ちません。インデックスをスキャンして行を見つけてからロードする必要があります。また、正規化されているか非正規化されているかに関係なく、行は 1 ページになります。実際、インデックスがはるかに大きくなるため、正規化は悪化する可能性があります。

データの正規化が役立つクエリの例がいくつかあります。ただし、一般に、行ごとにデータをフェッチする場合は、より効率的なデータ構造が既に存在します。

于 2013-05-17T02:24:05.490 に答える
0

ページングのアプローチを取ることができます。2 つのクエリがあります。initial はすべての行を返します、一意の ID を持つ列のみを返します。この配列は、ページごとに 100 個の ID など、ページに分割できます。ユーザーが特定のページを選択すると、100 個の ID が 2 番目のクエリに渡され、今回は 200 列すべてが返されます、要求された 100 行のみが返されます。これにより、すべての行のすべての列を一度に返す必要がなくなり、パフォーマンスが大幅に向上します。

于 2013-05-17T02:15:44.920 に答える