作業チケットのFirebird 2.5データベースを最適化しています。それらはそのように宣言されたテーブルに保存されます:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
通常、処理されておらずPending
ステータスにある最初のチケットを見つけたいです。
私の処理ループは次のようになります:
- 最初のチケットを取得する場所
Pending
- チケットを使用してください。
- チケットステータスの更新=>
Complete
- 繰り返す。
派手なものは何もありません。このループの実行中にデータベースを監視している場合、各反復でインデックス付き読み取りの数が増えていることがわかります。パフォーマンスは、私が知ることができるほどひどく低下するようには見えませんが、私がテストしているマシンはかなり速いです。ただし、一部のユーザーから時間の経過とともにパフォーマンスが低下するという報告を受けました。
にインデックスがありますStatus
が、それでもTicket_Id
繰り返しごとに列をスキャンするようです。私は何かを見落としているように見えますが、何がわからないのですか。このようなものに対するインデックス付き読み取りの増加数は予想されていますか、それともインデックスが何らかの形で誤動作していますか?
-コメントの編集-
Firebirdでは、次のように行の取得を制限します。
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
だから、「最初」と言うとき、私はそれをどこに限定レコードセットを要求しているだけですStatus = 'Pending'
。
ticket_id
、あなたはprobbalyにインデックス必要がある(status, ticket_id)
ticket_id
実際に含めるようにインデックスを変更すると、ステータスをインデックスに登録するよりもパフォーマンスが低下します。
id
(データ型)を使用すると、定義されたドメイン?