2

Delphiでは、Dataset.NextではなくDataset.Priorを使用することでパフォーマンスが低下しますか?

バックグラウンド:

データセット内の特定のレコードを検索するルーチンがあります。データセットの最後のレコードから開始し、一致するものが見つかるまでDataset.Priorを使用して逆方向に作業します。私がこのバックツーフロントアプローチを使用するのは、(実際には)探しているレコードがデータセットの終わり近くにある可能性がはるかに高いためです。したがって、私の心の中では、後ろから始めるとレコードがより早く見つかります。

ただし、このロジックは、Dataset.PriorとDataset.Nextのパフォーマンスオーバーヘッドがほぼ同じであるという前提に基づいています。そうですか?

4

2 に答える 2

7

それは、データセットとその背後にあるデータベースに大きく依存します。一部はそれをサポートしていません(いわゆる「一方向データセット」)。

あなたが説明した問題は、現在の解決策ではなく、より専門的なクエリが必要なようです。クエリでより多くの詳細を指定できる場合は、データセットで受け取るデータが少なくなり、必要なレコードだけでも可能になります。ほとんどの場合、データベースで実行するとフィルタリングが高速になります。

コードで検索/フィルタリングを行う必要がある場合は、データベースに、より可能性の高いレコード(おそらく日付で)を前面に配置する方法で少なくともデータを並べ替えるように依頼できます。

ただし、特定のデータセットに違いがあるかどうかを知る必要がある場合は、データセット全体を前から後ろ、後ろから前にループして、違いを測定できます。これを行うには、必ず最初にクエリ/データセットを開き、次にDataSet.Lastを使用して最後のレコードにジャンプします。これは、一部のデータセットが一度にすべてのデータをフェッチしないためですが、これにより強制されます。その後、高精度カウンター(QueryPerformanceCounter)を使用して各ループを測定しながら、最初のレコードにループしてから、最後のレコードに再度ループすることができます。

于 2013-02-15T15:41:50.293 に答える
0

データセットの行数が多すぎない場合は、DataSetProviderを使用してそれをClientDataSetに送り込み、そのClientDataSetで並べ替え、フィルタリング、検索などを行います。

とにかくほとんどのレコードを歩く傾向があるので、レコードをフェッチするための最初の1回限りのコストは、検索時間の短縮で返済される可能性があります。

このsowkrが適切なライセンスを持っている場合は、DataSnapを使用して、DAL-secificデータセットを完全にスキップし、すべてをClientDataSetにポンプすることもできます。

于 2013-02-15T17:35:21.440 に答える