1

約500万行のテーブルがあります

CREATE TABLE audit_log
(
  event_time timestamp with time zone NOT NULL DEFAULT now(),
  action smallint, -- 1:modify, 2:create, 3:delete, 4:security, 9:other
  level smallint NOT NULL DEFAULT 20, -- 10:minor, 20:info, 30:warning, 40:error
  component_id character varying(150),
  CONSTRAINT audit_log_pk PRIMARY KEY (audit_log_id)
)
WITH (
  OIDS=FALSE
);

のようなものですべてのコンポーネント ID を取得する必要があり、クエリを完了するのに約20 秒SELECT component_id from audit_log GROUP BY component_idかかります。どうすればそれを最適化できますか?

更新日:

component_id にインデックスがあります

CREATE INDEX audit_log_component_id_idx
  ON audit_log
  USING btree
  (component_id COLLATE pg_catalog."default");

UPD 2 :コンポーネント名を別のテーブルに移動することが1つの解決策であることは知っていましたが、もっと簡単な解決策があることを願っていました。みんなありがとう。

4

3 に答える 3

1
  • 列 component_id にインデックスを作成する

クエリで使用される唯一の列であるため、インデックスから直接情報にアクセスできます。

コンポーネント (現在は文字列) を別のテーブルに移動して、整数型などの ID で参照することも検討してください。

于 2013-05-24T09:18:37.717 に答える
0

別のテーブルに有効なコンポーネント ID のリストがあり、それらが監査テーブルに存在するかどうかをチェックしたい場合、オプションでいくつかの条件を指定すると、次のようになります。

select
  component_id
from
  components
where
  exists (
    select null
    from   audit_log
    where  audit_log.component_id = components.component_id)

これは、個別の component_id の数が audit_log の行数よりも大幅に少なく、audit_log.component_id がインデックス化されている場合に、はるかに優れたパフォーマンスを発揮します。

于 2013-05-24T10:15:57.793 に答える