問題タブ [extensible-storage-engine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - Extensible Storage Engine データベースを縮小する方法は? - データベースには多くのデータが含まれていてはいけませんか?
Laurion Burchall が聞いてくれることを願っています :)
私のデータベースには、一部のデータを一時的にキャッシュするために使用される longbinary フィールドがあります。データは、実際には非常に長い間必要とされない場合があります。一般的なサイズの範囲は 1k から 3MB です
データベースにあるはずの実際のデータが常に 20 MB または 30 MB 未満であるにもかかわらず、データベースのサイズが際限なく大きくなっていることに気付きました。
私が使っているパットは
データベースは約 30MB 程度になる傾向があると思いますが、その代わりにどんどん大きくなります (30GB)。私が行っている削除が正しくないか、何らかの方法で圧縮する必要がありますか?
ESEを間違って使用している場合など、誰かが何が起こっているのかを明確にしてくれることを願っています
database - JetSetColumnsを使用してJET_coltypLongBinary値を置き換えることはできますか?
JetSetColumn()を呼び出してJET_coltypLongBinary値の内容を置き換えると、操作は期待どおりに機能します-値が置き換えられます
ただし、JetSetColumns()を呼び出すと、値は置き換えられません。代わりに、値は古い値のままになります。奇妙なことに、他の列(長い列ではない)は期待どおりに更新されます。エラーは返されません。
JET_coltypLongTextでも同じ動作が発生します。JetSetColumns()を長い値で使用できないのではないかと思いますか?
チップ?
windows - Extensible Storage Engine に大量のレコードをすばやく保存する方法
Extensible Storage Engine を使用して多数の大きなレコードをキャッシュしています。これらのレコードのサイズは (それぞれ) 約 2MB になる傾向があります。
多くの場合、それらは数時間以内に削除されますが、この時間以上存続することはめったにありません
JetBeginTransaction/JetPrepareUpdate/JetSetColums/Update/JetCommitTransaction のタイトなループに陥っています。このループの反復ごとに 2MB のレコードが書き込まれます。書き込まれているデータは事前に割り当てられており、RAM にあります - 私のプロデューサーは CPU やディスク時間を消費するべきではありません
私は非常に遅いパフォーマンスを測定しており、毎秒 2 メガバイト程度です。
procmon を使用すると、非常に多くの小さな読み取りと書き込み (512 バイト、4096 バイト、および多くの書き込み ~30K) が見られます。私が確認した最大の書き込みは 393,216 バイトで、これが JET_paramMaxCoalesceWriteSize のデフォルトだと思います。
これはチューニングのように感じます。大規模な書き込みのパフォーマンスを向上させるにはどうすればよいですか? このハードウェアが提供できるはずのものから、ほぼ 2 桁もずれています。
database - JET_bitColumnAutoincrementでマークされた値をESEで設定する
grbitをJET_bitColumnAutoincrementに設定してESEで列を作成しました。通常の使用では、これが私が望むものであり、値をデータベースによって一意に設定します。
ただし、データベースの動作方法では、値を直接設定する必要がある場合がまれです。追加するIDがまだ使用されていないことを100%確信しています。これは再構築タイプの操作であり、通常の場合ではありません。
これは可能ですか?自分で設定する機能を維持しながら、両方を自動インクリメントする方法はありますか?
database - JetUpdate で JET_errVersionStoreOutOfMemory をどうするか
JetUpdate() を呼び出すと、JET_errVersionStoreOutOfMemory または JET_errVersionStoreOutOfMemoryAndCleanupTimedOut のいずれかが返されることがあります。
マシンには十分な RAM とディスクの空き容量があります。
トランザクションを再試行する前に、Sleep()ing などのアクションを少し試しましたが、うまくいくように見えることもあれば、うまくいかないこともあります。
database - Extensible Storage Engine にいくつかの重複を含む多くのレコードをすばやく追加する方法
ESE データベースに数百万のデータ レコードを追加する必要があります。他の値の中でも、各レコードには一意の文字列値があります。この値はキーと考えることができます。
レコードにとって興味深いのは、入力セット内に同じレコードの同一のインスタンスが複数存在する可能性があることです。入力したら、一意の文字列のそれぞれを持つ 1 つのレコードのみが必要です。
私の質問は、これを行う方法です-重複をすばやく除外するにはどうすればよいですか?
現在、キーの検索を行った後にのみ各レコードを追加しています。エントリが既に存在する場合はスキップします。データベースにない場合は、レコードを追加して進行します。ここでの大きなコストは、各エントリで検索を行うことです。
これを非常に高速にするためのアイデアはありますか?重複の追加が失敗するように値をキー設定する方法はありますか?
database - ESE では、JET_coltypDateTime を安全に使用して符号なし 64 ビット値を保持できますか?
古い OS (JET_VERSION = 0x0501) で ESE を使用しています。unsigned 64 int を保存する必要があります
この int を JET_coltyDateTime または JET_coltypCurrency に安全にキャストできますか? ESE は範囲に対して何らかの種類の変換/制限を行いますか?
私の目的では、検索機能が何らかの形で台無しにされない限り、並べ替え順序は重要ではないことに注意してください
c# - ESENTに存在
テーブルにレコードが存在するかどうかを確認しようとしています。さて、明らかな方法の 1 つは、レコードを探すことです。
ただし、この操作はカーソルを見つかったレコードに設定します (成功した場合)。これはやりたくないことです。どういうわけか、現在のレコード番号をすばやく保存してから元に戻すことができると思いますが、もっと良い解決策があるでしょうか? API で正しいメソッドが見つかりませんでした。
では、レコードが存在するかどうかを確認するためだけに Seek を意味する Exists を実行することは可能ですか?
ちなみに、ESENT Managed Interface 1.9.0 で .NET 4.0 を使用しています。
c++ - cpp を使用して ESE データベースからレコードを読み取る方法
JetOpenDatabase APIを使用して、ESE データベースを正常に開くことができました。レコードを読み取るために、「MSysObjects」テーブルを開き、現在のインデックスを「RootObjects」に設定しました。
これが私のコードです(エラー処理なし):
レコードを読み取るために、現在のレコードから複数の列の値を取得するためにJetRetrieveColumns関数を試しました。JetRetrievedColumn関数も試しましたが、実際の結果は得られませんでした。
cpp を使用して、既存のマウントされていない ESE データベース ファイルからレコードを読み取る方法を知っている人はいますか?