Put deleted_at in the event-tier indexes so SQLite uses them
check / check (push) Successful in 3m16s
check / check (push) Successful in 3m16s
GORM adds deleted_at IS NULL to these queries, and SQLite, which has no table statistics here, preferred the deleted_at index to the new single-column ones wherever a column is matched against several values or compared with <. The event log's attempt load, retention's lookups of expired events and their deliveries, and the queue-depth sampler still read every live row. Each index now also covers deleted_at, first in the events index because created_at is compared with <; events keeps its created_at index for retention's final delete. A test checks SQLite's plan for each statement as GORM builds it. Model: opus-5-5
This commit is contained in:
@@ -1,16 +1,26 @@
|
||||
package database
|
||||
|
||||
import "time"
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// Event represents a captured webhook event
|
||||
//
|
||||
//nolint:lll // a struct tag cannot wrap
|
||||
type Event struct {
|
||||
BaseModel
|
||||
|
||||
// CreatedAt overrides BaseModel.CreatedAt only to add an index:
|
||||
// retention deletes events by age, so events.created_at is queried
|
||||
// on every sweep. The other tables keep the unindexed BaseModel
|
||||
// field.
|
||||
CreatedAt time.Time `gorm:"index" json:"createdAt"`
|
||||
// CreatedAt and DeletedAt repeat the BaseModel fields only to index
|
||||
// them for retention, which finds events by age. Its lookups carry
|
||||
// GORM's "deleted_at IS NULL" (see DeliveryResult) and compare
|
||||
// created_at with <, so their index has deleted_at first: SQLite
|
||||
// narrows by a < only on the last column it uses. Its final delete
|
||||
// has no deleted_at condition and uses the index on created_at
|
||||
// alone. The other tables keep the unindexed BaseModel created_at.
|
||||
CreatedAt time.Time `gorm:"index;index:idx_events_deleted_at_created_at,priority:2" json:"createdAt"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index:idx_events_deleted_at_created_at,priority:1" json:"deletedAt,omitzero"`
|
||||
|
||||
WebhookID string `gorm:"type:uuid;not null" json:"webhookId"`
|
||||
EntrypointID string `gorm:"type:uuid;not null" json:"entrypointId"`
|
||||
|
||||
Reference in New Issue
Block a user