2

マルチテナント環境でRavenDBを使用しているため、ユーザーは独自のテナントを作成し、そこで独自のアプリケーションを作成できます。

ただし、問題は、データベースが時々アイドル状態になることです(確かに受け入れられますが、本番環境でも発生します)。何らかの理由で、データベースの再ロードに40秒以上かかります。ただし、ドキュメントは最大1000個、インデックスは最大300個(本番環境に移行するとさらに多くのドキュメントを含める必要があるアプリケーションの青写真)であり、すべてのインデックスに1つMapの句と1つの句がTransformResultsあります。

バージョン:2.0.2230と2.0.2261の両方(執筆時点で最新の安定版)

一般的な統計

 ...
TransactionalStorageSize:26222592,
TransactionalStorageSizeHumaneSize:"25.01 MBytes",
IndexStorageSize:376263,
IndexStorageHumaneSize:"367.44 KBytes",
TotalDatabaseSize:26598855,
TotalDatabaseHumaneSize:"25.37 MBytes",
CountOfDocuments:975,
...

データベース統計

CountOfIndexes:305,
InMemoryIndexingQueueSize:0,
ApproximateTaskCount:0,
CountOfDocuments:975,
StaleIndexes:[],
CurrentNumberOfItemsToIndexInSingleBatch:256,
CurrentNumberOfItemsToReduceInSingleBatch:128,
DatabaseTransactionVersionSizeInMB:0.02,
....
Errors:[],
....

編集

私たちが話しているアプリケーションには、デザイナーとランタイムの2つのコンポーネントがあります。ravendbには、ランタイムで作成/使用されたデザインとデータが保存されます。そして、各テナントはアプリケーションです。

デザインモードで作成するクエリごとに、ravendbにインデックスを作成するため、非常に多くのインデックスがあります。

インデックスの形式は次のとおりです。from ... [from...|let...] [where ... ] select ...特定のluceneクエリに必要な関連ドキュメントをロードするためのLoadDocument呼び出しと、必要な形式でドキュメントを形成するための同様のTransfromResultsを使用したマップ。

クエリとインデックスの間の1対1の結合を緩めることができるかどうかを調査します。

Q:いくつかの巨大なインデックスを用意する方が良いですか?たとえば、クエリを実行するエンティティごとに1つずつ作成するか、中間点を見つける方がよいでしょうか。

Q:現時点では、エンティティの設計で「複雑な」エンティティを使用することは許可されていません。つまり、値のプロパティまたは他のドキュメントへの参照以外は、ドキュメントが少し少なくて大きい場合に影響を与える可能性があります。したがって、 LoadDocument(...)?への呼び出しを少なくする必要があります。

これに時間がかかる(40秒)理由はありますか?そして、これを軽減するための可能な方法があれば幸いです。

4

2 に答える 2

3

これの1つのサブ質問に答える:

Q: クエリを実行するエンティティごとに 1 つの巨大なインデックスを作成するのと、中間点を見つけるのとではどちらが良いですか?

通常の状況では、エンティティ タイプごとに複数のインデックスが必要になることはありません。

何十ものエンティティ タイプがある場合は、RDBMS モデル設計を非リレーショナル設計に適用するという落とし穴に陥っている可能性があります。概観すると、合計 8 つの集約ルートの上に構築された機能豊富なシステムがあります。2 ~ 3 のサポート インフラストラクチャ エンティティを使用。

全部で 17 個のインデックスがあります。8 マップ、5 マルチマップ、5 マップ削減。ご覧のとおり、Map:Aggregate Root インデックスの比率は 1:1 です。集約された検索をサポートするための追加のインデックスと、カスタム結果のための map/reduce。

于 2013-03-08T18:32:56.073 に答える
2

少し奇妙だと思うことの 1 つ - ドキュメントに対するインデックスの比率が少し高いようです。なぜそんなに多くのインデックスが必要なのですか? それらをマージできますか?

たとえば、同じエンティティに次のようなマップのみのインデックスがあるとします。

// index 1
Map = customers => from customer in customers
                   select new
                   {
                       customer.FirstName
                   }

// index 2
Map = customers => from customer in customers
                   select new
                   {
                       customer.LastName
                   }

明らかに、これらは単一のインデックスに含まれる可能性があります。

Map = customers => from customer in customers
                   select new
                   {
                       customer.FirstName,
                       customer.LastName
                   }

インデックス数を減らすことができれば、サーバーのストレスが大幅に軽減されます。

すべてのインデックスはすべてのドキュメントに対して実行されることに注意してください。翻訳されたマップには、メタデータdocs.customerのフィルタリングの省略形である -が表示されます。Raven-Entity-Type

したがって、300 個のインデックスに対して 1,000 個のドキュメントがある場合、マップを評価する必要があるのは 300,000 回です。インデックスをより一般的なもの (たとえば 20 程度) に減らすと、パフォーマンスが大幅に向上します。

于 2013-03-08T13:37:29.703 に答える