3

Delphi 4 には、コンポーネントを使用して一度に 3 つのテキスト型フィールドと他の必須フィールドを取得する 1 つの SELECT クエリがありTQueryます。
1,000 を超えるレコードがあります (今後増える可能性があります)。
このクエリは大量のメモリを消費します。この次のクエリにより、実行に膨大な時間がかかると思います。

BDE を使用して SQL サーバーに接続しています。

それほど時間がかからないように、パフォーマンスを最適化する必要があります。ご意見をお聞かせください。

4

5 に答える 5

2

ある種のページング メカニズムを検討する必要があります。1000 (または 100 万) のレコードをクライアントにフェッチするのではなく、代わりにSQL サーバーROW_NUMBER()でページングを使用して、1 ページあたり 50 ~ 100 レコードのブロックを取得します。

したがって、次のようなクエリ:

SELECT id, username FROM mytable ORDER BY id

次のようになります。

SELECT * FROM (
SELECT id, username, TOTAL_ROWS=Count(*) OVER(), ROW_NUMBER() OVER(ORDER BY id) AS ROW_NUM
FROM mytable 
) T1
WHERE ROW_NUM BETWEEN 1 AND 50

フィールドはORDER BY、処理を高速化するために (可能であれば) インデックスを作成する必要があります。

于 2011-12-15T10:42:16.017 に答える
1

を使用する場合は、処理を高速化するために取得ループの外側でTQuerylocal を使用するようにしてください(メソッドは多少遅くなります)。TFieldFieldByName

フリーウェアのオープン ソース クラスを試して、任意の DB エンジンにアクセスできます。

ADO レイヤーを呼び出さずに、OleDB を介して MS SQL に直接アクセスできます。

速度が非常に最適化されており、旧バージョンの Delphi でも Unicode に対応しています。Windows XP、Vista、および Seven (64 ビットを含む) でテストされています。

TQueryエミュレーターがあります。これは、 DB.pasTQueryユニットで定義されているようには当てはまりませんが、ほとんど同じメソッドを持つクラスです。また、すべての BDE クラスとユニットを操作する必要はありません。欠点は、Delphi DB のビジュアル コントロールを使用できないことですが、迅速な TQuery の場合はそれで十分です。

考慮に値するいくつかのユニークな機能 (フィールド アクセスのためのレイト バインディングの使用など) があります。

サードパーティ ライブラリ (BDE など) を必要とせず、Delphi 5 から XE2 まで動作します。Delphi 4 でも動くと思います。

私たちのサイトでダウンロードしてサポートを求めることができます。

于 2011-12-15T08:34:07.623 に答える
0

実際TEXTに列の値を取得するには時間がかかり、メモリも消費します。

フェッチを高速化するにTEXTは、リストから列を除外しますSELECT。そして、それらの値が本当に必要な場合にのみ、レコードの主キーによる追加のクエリを使用してそれらをフェッチします。

メモリ使用量を減らすには、上記のようにUnidirectionalクエリまたは bove を使用します。

于 2011-12-15T17:46:34.043 に答える
0

(データによっては) 時間を短縮するために、クエリで DATALENGTH を使用できます。

お気に入り

DATALENGTH(TEXT) <> 0

TEXTこれにより、フィールドに値がないレコードはロードされません。

于 2012-05-16T12:19:34.810 に答える
-2
  • どのフィールド タイプを定義しましたか? それらが大きい場合、メモリを占有します。それについてできることはほとんどありません。さまざまなライブラリを試すことができます。宣言されたものではなく、フィールドの実際のサイズのみを割り当てるほどスマートなものもあれば、宣言されたものを常に割り当てるものもあります。したがって、4000 文字の 3 つのフィールドと 1000 レコードがある場合、3 *テキストフィールドだけに割り当てられた 4000 * 1000 バイト。
  • データセット全体を一度にロードする必要がありますか? where 条件やインクリメンタル フェッチを使用して必要なデータだけをフェッチすると、メモリと実行時間の両方を削減できます。
  • クエリの実行に時間がかかる場合は、その理由と場所を理解する必要があります。クエリの実行時間そのものの場合もあれば、結果セットをクライアント アプリケーションに転送するのにかかる時間の場合もあります。実際に何が問題なのかを理解し、適切な是正措置を取るには、クエリをプロファイリングする必要があります。1000 レコードは今日の非常に小さなデータセットです。遅い場合は、非常に悪いことがあります。
  • 各データベースには微妙な最適化の違いがあります。使用しているデータベースを注意深く調べ、適切なデータベースを設計した後で、そのデータベースに適切なクエリを作成する必要があります。

それが正確な原因であると判断せずにデータベース コンポーネントを変更するだけでは、明らかにばかげています。問題が別の場所にある場合は、時間の無駄です。特に ADO と比較した場合、BDE は十分に機能します。また、Microsoft も ADO のサポートを終了しているため、時間とお金を投資するつもりはありません。

更新: この回答が反対票を投じられた理由を知ることは興味深いでしょう。ADO信奉者は将来苦労するだろうし、真実を隠す必要があると感じているからですか?

愚か者に反対票を投じ続けてください。あなたは自分の無知を示​​すだけです!

于 2011-12-15T08:59:41.917 に答える