2011-01-13 19 views
0

私はmysqlデータベース(600万レコード)に大きなテーブルを持っています。私はテーブルをリンクする場合、私はそれを開くことができます - それはアクセスが必要に応じてレコードを要求するようです。ただし、パススルークエリを使用すると、アクセスを開始する前にテーブル全体でアクセスが要求されるようです。これは通常のテーブル(200,000)のレコードでは十分に遅いですが、大きなものは不可能です。 SQL文を使用できるようにするためにパススルーを使用したいと思っていますが、もっと速くする必要があります。これを行う方法はありますか?ありがとう!大きなSQLテーブルのアクセスパススルークエリ

編集: ここにはクエリがあります。あなたはこれよりはるかに簡単になることはできません。 SELECT * FROM Traffic12

+0

パススルークエリを投稿してください –

+2

パススルークエリは、あなたが記述しているものとちょうど逆です。私の経験では、p-tクエリはクエリステートメントをバックエンドに送信して実行されますが、p-t以外のクエリはテーブル全体をダウンさせるか、キーセットをクライアントに渡すことがあります。 – Tim

+0

私の以前のコメントを編集できません - 下記の私の答えを見てください。 – Tim

答えて

3

あなたのお問い合わせは、全テーブルを要求しています。アクセスはあなたの言うこととまったく同じです。パススルークエリを使用する唯一の方法は、サーバー上でWHERE句(フィルタリング)を実行する場合や、サーバー上で実行される結合やサーバー側の機能を利用する場合ですUDF)、またはバックエンドサーバーが理解できる「ヒント」を追加する場合に使用します。

p-tクエリを使用していないときに気付くパフォーマンス上の利点は、一度に特定の数の行だけをフェッチするAccessからのものです。パススルーを使用するときは、この最適化をページングアルゴリズムからバイパスしています。

フィルタリングがサーバー側で実行されると、パススルークエリは、非p-tよりも帯域幅が大幅に削減され、非パススルーに比べてパフォーマンスが大幅に向上します。また、バックエンドは膨大な量のRAMを搭載した巨大な4CPUマシンで、時には大規模なインデックスをフラッシュすることもあります。状況を評価して、どのようなアプローチがすべての要因を考慮に入れたほうが良いかを確認する必要があります。

+0

ありがとう、私はずっとよく理解しています! – Nathan

+0

ほとんどのWHERE句はJet/ACEによってサーバーに渡されます。実際にJet/ACEが実行しないSQLを書くのは難しい作業です。 –

関連する問題