2

知りたいことの正しい言葉がわからないので、グーグルで検索するのに苦労しています。

クエリを再度実行する代わりに、データベース (テクノロジーに依存しませんが、Oracle、MySQL、および Postgres で可能かどうかを知りたい) で特定の行を指すことができるかどうかを知りたいです。

そのため、最初にクエリを実行して関心のある行を見つけてから、次に必要なときにすぐにアクセスできるデータベース上の場所を示すポインターまたはその他のメタデータのリストを取得することで、それらを再度検索することを避けたい場合があります。それらの結果。

データベースにキャッシュがあることはわかっていますが、これらの「ポインター」を他の場所に保持したいので、キャッシュは最終的にこの問題を解決しません。これは単なるインデックスであり、インデックスを保存してこれで検索しますか? 私の現在のテーブルのほとんどにはインデックスがなく、インデックスに時々伴う速度の低下は望ましくありません。

それで、私がグーグルに入れようとしてきた魔法の用語は何ですか?

乾杯

4

4 に答える 4

3

私の現在のテーブルのほとんどにはインデックスがなく、インデックスに時々伴う速度の低下は望ましくありません。

また、通常はインデックスに伴う速度の向上は望まないが、代わりに特注の疑似キャッシュを手動でロールしたいですか?

私はここで意地悪をしているわけではありません。これは重大な点です。データベース設計者は、製品の最適化に多大なスキルとエネルギーを費やしてきました。いくつかのコア機能を再実装するよりも、彼らの努力を活用する方法を学ぶ方が賢明ではないでしょうか?

于 2010-04-11T20:38:58.733 に答える
3

Oracle では ROWID と呼ばれます。ファイル、ブロック番号、およびそのブロック内の行番号を識別します。あなたが説明していることは良い考えだとは言えませんが、これで少なくとも正しい方向を見始めることができるかもしれません。

詳細については、 http ://www.orafaq.com/wiki/ROWID を確認してください。

ちなみに、あなたが恐れている「インデックスに伴う速度低下」は、読み取りよりも挿入と更新を行う場合にのみ関係します。インデックスは読み取りを高速化するだけなので、読み取り率が高い場合は問題がなく、インデックスが最適なソリューションである可能性があります。

于 2010-04-11T20:07:59.937 に答える
2

一般に、この種の要件を処理する最善の方法は、主キー (または実際には任意の便利でコンパクトな一意の識別子) を「ポインタ」として使用し、迅速なインデックス付きルックアップに依存することです。 .

ROWID は Oracle 以外の DBMS でも使用できますが、さまざまな理由から一般的にはお勧めできません。「すべてのテーブルに自動インクリメント列がある」というデータベース設計の流派に屈した場合は、自動インクリメント列の値を識別子として記録できます。

(ほぼ) すべてのテーブルに少なくとも 1 つのインデックスが必要です。そのインデックスは主キー用です。例外は、メモリに簡単に収まり、更新されず、メモリから追い出されないほど十分に使用されるほど小さいテーブルの場合です。その場合、インデックスは気を散らすものになる可能性があります。ただし、通常、このようなテーブルはめったに更新されないため、インデックスが害を及ぼすことはありません。また、インデックスが役に立たない場合 (そして役に立たない場合もあります)、オプティマイザーはそれを無視します。

補助索引を使用することもできます。ほとんどのアクティビティがデータの読み取りであるシステムでは、アクセス時間が最も重要であるため、インデックスを少なくするのではなく、多くすることをお勧めします。システムが頻繁に更新される場合は、データが追加、削除、または更新されるときにインデックスを更新するとコストがかかるため、インデックスを少なくします。明らかに、ユーザーが実際に実行する (またはアプリケーションが実行する) クエリとうまく連携するようにインデックスを設計する必要があります。

于 2010-04-11T21:18:32.090 に答える
0

カーソルにも興味があるかもしれません。(インデックスの議論はカーソルでも有効であることに注意してください。)

ウィキペディアの定義はこちら。

于 2010-04-12T21:16:37.043 に答える