大規模インスタンスや、Yellowfinを長期間使用している場合、アプリケーションのリポジトリDBがかなり大きくなります。
データベースが大きくなる原因とデータベースを適正なレベルまでに軽くする方法について紹介します。
以下の情報では、大きいテーブルは何のために使われているか、このようなデープルを積極的に管理する方法について詳しく説明します。
免責事項:
YellowfinリポジトリDBを変更することには大きなリスクが伴います。誤ったクエリーによって、Yellowfinの環境全体に影響を与え、回復ができなくなったり、使用ができなくなったりする可能性があります。ご了承下さい。
Yellowfinの環境全体に影響することを理解した上で、YellowfinリポジトリDBを変更してください。
YellowfinリポジトリDBに対してクエリーを実行する前に、以下をご確認ください。
- 常に最新のバックアップを取得してあること
- Yellowfinを正しく停止していること
ご不明な点がございましたら、サポートサイトからお問い合わせください。
Eventテーブル
このテーブルにはYellowfinの操作ログが保存されています。
例えば:ユーザーログイン、レポートの実行、インポートとエクスポートなどです。
このデータは監査のみに使用されます。追跡できるイベントの一覧はwikをご参考ください。
EventArchiveテーブル
このテーブルには、アーカイブされたすべてのイベントデータが保管されています。ここのデータは一定の期間が経過した後にEventテーブルから移動されたデータです。
ReportInstanceテーブル
このテーブルには、レポートを実行または編集するたびにレコードが増えます。
同じレポートを複数回実行すると、このテーブルに複数のレコードが保存されます。
例えば:
- レポート実行する平均時間を記録するため
- 実行されたフィルター値を記録するため
- レポートをロールバックするため(ドラフトレポートは編集前のレポートと分けて保存されているため、編集前のレポートにロールバックすることができます。)
- KPIレポートの結果に使用するため
DocumentDataテーブル
このテーブルには、多くのレポートと関連するデータが保存されています。
メタデータではなく、実際のデータです。
例えば:
- キャッシュされたレポート結果セット(キャッシュされたレポートやレポートレベルで作成されたスナップショットなど)
- フリーハンドSQL(仮想テーブル、カスタムクエリーフィルター、フリーハンドSQLレポートなど)
- 古いバージョンでキャッシュされたフィルターの結果(最新バージョンのYellowfinはキャッシュしたフィルター結果を別のテーブルに保存します。)
- CSVレポート
キャッシュされたレポートをテーブルから手動で削除する場合は、こちらの記事をご参照ください。
サイズが大きいテーブルを確認する方法
以下の情報を入手してください。
- サイズが大きい順の上位10位のテーブル
- 下記のクエリーの結果
SELECT a.CategoryCode,a.SubCategoryCode, COUNT (distinct a.reportid) FROM reportheader a, reportinstance b, DocumentItem c WHERE a.reportid=b.reportid and a.reportid=c.subjectid group by a.CategoryCode,a.SubCategoryCode
上記のクエリーでは、現在キャッシュされているレポートの数と、そのカテゴリーに属するレポートの数をカウントします。
注意:キャッシュされたレポートのコピーはカウントしません。
キャッシュされたレポートのリストとキャッシュされたコピーの数が必要な場合、下記のクエリーを実行してください。
SELECT a.reportid,a.reportname,count (b.ReportInstanceId) as ReportInstance,a.CategoryCode,a.SubCategoryCode,C.SubjectId FROM reportheader a, reportinstance b, DocumentItem c WHERE a.reportid=b.reportid and a.reportid=c.subjectid group by a.CategoryCode,a.SubCategoryCode,a.ReportName,a.reportid, c. SubjectId
上記のテーブルのサイズを軽くする方法
これらのテーブルにどのようなデータが保存されているかを説明しましたので、ここから、テーブルを軽くする方法について、紹介します。
注意:リポジトリDBに対してクエリーを変更する前に、必ず最新のバックアップを取得してください。
EventとEventArchive
イベント(ユーザーの操作ログ)のアーカイプと削除のスケジュールを変更するための設定です。
EventテーブルとEventArchiveテーブルの管理については、こちらの記事をご参考ください。
これらのテーブルには操作ログしか保存されていません。
レポートの監査と追跡が必要な場合は、こちらのデータが必要となるため、これらのテーブルのデータを削除することはできません。
例えば:レポートが実行されるたびにEventテーブルにレコードを保存したくない場合は、下記のクエリーを実行してください。
INSERT INTO Configuration (IpOrg, ConfigTypeCode, ConfigCode, ConfigData) VALUES (1, 'SYSTEM', 'DISABLEREPORTEVENTS', 'true');
ReportInstance:
すべてのKPIレポートとキャッシュされたレポートを変更せず、ReportInstansテーブルをクリアしたい場合は下記のクエリーを実行してください。
DELETE FROM ReportInstance WHERE ReportStatusCode NOT IN ('BOOKMARK','SNAPSHOT', 'BROADCASTBOOKMARK', 'DISTRIBUTEBOOKMARK') AND (DocumentId = 0 OR DocumentId IS NULL OR ReportId not in (SELECT ReportId FROM ReportHeader WHERE RoleCode = 'KPI'));
レポートを実行した時に、ReportInstanceテーブルとReportInstanceFilterテーブルにデータが作成されないようにするには、下記のクエリーを実行してください。
注意:キャッシュされたレポートが何に使用されているかを理解した上で、実行してください。
INSERT INTO Configuration (IpOrg, ConfigTypeCode, ConfigCode, ConfigData) VALUES (1, 'SYSTEM', 'CREATEREPORTINSTANCES', 'false');
DocumentData:
こちらのテーブルのサイズを軽くする方法は、通常レポートのキャッシュ機能を無効にすることです。
これは、関連する各レポートカテゴリーに対するUIを通じて実行することができます。
または、下記のクエリーを実行することで、DB内のレコードを直接変更することもできます。
UPDATE ContentManagement SET VersionHistoryRequiredFlag=0 WHERE ContentManagementId =
正しいIDを取得するには、テーブル内のすべてのレコードを見て、関連するサブカテゴリーの名前を探してください。
「INDEX」はサブカテゴリーの「ContentCode」ではなく、親カテゴリーであることを示します。
例えば:「KPI」のサブカテゴリーは、親カテゴリー「TUTORIAL」の下に存在します。したがって、必要なContentManagementIDは53698です。
レポートのキャッシュ機能を無効にすると、夜間にキャッシュされたレポートがクリーンアップされ、レポートのキャッシュが削除されます。
次回Yellowfin起動する時、強制的にクリーンアップを実行するには、Yellowfinを停止してから以下のクエリーを実行します。Yellowfinを再起動してから、タスクを完了するまでには若干時間がかかリます。
UPDATE TaskSchedule SET LastRunDate = null, LastRunGMTDateTime = null, LastRunTime = null, LastRunStatus = null WHERE ScheduleUnitCode='DocumentCleanupTask'
上記の手順に沿って操作してもYellowfinリポジトリDBを軽くすることができない場合や、他の疑問を持つ場合、大きいテーブルとその使用状況を確認して、サポートサイトからお問合せください。
上記のタスクをクリーンアップすることに失敗した場合は、下記のクエリーの実行をご検討ください。
キャッシュしたレポートの一部だけを削除したい、あるいはKPIレポートなどを削除したくない場合、下記のクエリーを実行しないでください。
下記のクエリーでは、Abstract列に「DELETE」を設定して、キャッシュされたレポート(実際のレポートではなく、キャッシュされた結果のみ)に削除マークを付けます。
UPDATE DocumentItem SET Abstract = 'DELETE' WHERE DocumentCode = 'XMLWRAPPER'
AND DocumentId NOT IN ( SELECT MaxDocumentId FROM ( SELECT ReportId, MAX(DocumentId) as MaxDocumentId FROM ReportInstance WHERE ReportId IN ( SELECT ReportId FROM ReportHeader WHERE RoleCode = 'KPI' ) OR ReportStatusCode = 'SNAPSHOT' GROUP BY ReportId ) as t );
下記のクエリーでDocumentItemsテーブルから削除する予定のレポートを削除します。
DELETE FROM DocumentItem WHERE Abstract = 'DELETE';
下記のクエリーでDocumentRevisionテーブルから削除する予定のレポートを削除します。
DELETE FROM DocumentRevision WHERE DocumentId NOT IN (SELECT DocumentId FROM DocumentItem);
下記のクエリーでDocumentDataテーブルから削除する予定のレポートを削除します。
DELETE FROM DocumentData WHERE RevisionId NOT IN (SELECT RevisionId FROM DocumentRevision);
他のデータを削除するクエリーをご参考ください。
下記のクエリーで削除されたReportInstanceレポートに属するフィルター(ReportInstanceFilter)を削除します。
DELETE FROM ReportInstanceFilter WHERE InstanceId NOT IN ( SELECT ReportInstanceId FROM ReportInstance )
下記のクエリーでReportInstanceにある不要なレコードを削除します。
DELETE FROM ReportInstance WHERE DocumentId != 0 and DocumentId IS NOT NULL AND DocumentId NOT IN ( SELECT DocumentId From DocumentItem)
また、次のクエリーは、何らかの理由で削除されたレポートまたはビューにリンクされている
孤立したレコードを安全に削除します。
DELETE FROM ReportFieldParameter WHERE ReportId IN ( SELECT ReportId FROM ReportHeader WHERE ReportStatusCode = 'DELETED');
DELETE FROM ReportFieldParameter WHERE ViewId IN (SELECT ViewId FROM reportview WHERE viewstatuscode = 'DELETED');
DELETE FROM ReportFieldTemplate WHERE Viewid IN (SELECT Viewid FROM ReportView WHERE viewstatuscode = 'DELETED');
DELETE FROM ReportFormat WHERE ReportId IN ( SELECT REPORTID FROM REPORTHeader WHERE ReportStatusCode = 'DELETED');
DELETE FROM CachedFilterValue WHERE CachedFilterId in (SELECT CachedFilterId FROM CachedFilter WHERE reportid in ( SELECT REPORTID FROM REPORTHeader WHERE ReportStatusCode = 'DELETED'));
DELETE FROM ReportInstance WHERE ReportId IN ( SELECT REPORTID FROM REPORTHeader WHERE ReportStatusCode = 'DELETED');