診断

Confluence では、クエリが lower() 関数を使用するため、タイトルでページを取得する際にパフォーマンス上の問題が発生することがあります。クエリはたとえば次のようなものになります。

select * from CONTENT where lower(TITLE) = :title and SPACEID = :spaceid

データベース プロファイリングでは、実行に時間がかかる次のようなクエリが表示される場合があります(部分的に太字にしてあります)。 

select ... from CONTENT page0_, SPACES space1_
where page0_.CONTENTTYPE='PAGE'
and ((lower(space1_.SPACEKEY)= @P0 and page0_.SPACEID=space1_.SPACEID)
and(lower(page0_.TITLE)= @P1 )
and(page0_.PREVVER is null )and(page0_.CONTENT_STATUS='current' ))

Typically, databases don't use indexes when you use a function in a where clause; they do a table scan instead. This makes the performance of this query not ideal (CONF-11577).

一般的な解決策

多くのデータベース (たとえば Oracle、PostgreSQL、DB2 for z/OS)では、列名の代わりに関数を使用するだけで、通常の "create index" 構文を使用してインデックスを作成することが可能です。

create index CONFTITLE_LOWER on CONTENT(lower(TITLE));

ソース

SQL Server

SQL Server では、データベースのテーブルに計算列を追加して、その列にインデックスを追加できます。

alter table CONTENT add TITLE_LOWER as lower(TITLE);
create index CONFTITLE_LOWER on CONTENT(TITLE_LOWER);

ソース

MySQL

現在、MySQL では小文字のインデックスを作成することはできません。Confluence 3.0 には、このデータベースでのパフォーマンス上の問題を軽減するキャッシュの改善がいくつか含まれています。

ソース:

Linux または Windows 用の DB2

DB2 supports indexes on generated columns which are used for queries with a matching predicate. You can implement it like this:

ALTER TABLE CONTENT ADD COLUMN TITLE_LOWER GENERATED ALWAYS AS (LOWER(TITLE));
CREATE INDEX CONFTITLE_LOWER ON CONTENT(TITLE_LOWER)

関連ページ

  • ラベルなし