sqlinsight-pro/rules/community/fulltext.json
Søren Eggert Lundsteen Olsen 384e1f154f Long operations, full-text rules and statement activity
- Long operations: a one-minute collector reads operations with progress
  from sys.dm_exec_requests (BACKUP, RESTORE, DBCC, REORGANIZE, SHRINK,
  ROLLBACK): command, database, start, percent, expected end, login.
  Stored in insight.LongOperations (migration 0011, RawDays), shown on
  the instance page, in the time window analysis and its PDF. The last
  10 durations per command and database survive restarts; SQLI-OPS-001
  flags a backup/restore running over twice the median.
- Full-text community rules COM-FT-001..005 (metadata only, 2005 syntax):
  disk-full or paused/throttled catalogs, stale manual/off change
  tracking indexes and disabled indexes.
- Statement activity (CPU time / time in plan cache): column in top SQL
  and SQLI-CPU-002 when above SQLInsight:TopSql:ActivityThresholdPercent
  (default 50) for at least an hour. Never clears the plan cache.
- BuiltInCollectors.Create takes a CollectorSettings record.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 09:07:29 +02:00

75 lines
7.3 KiB
JSON

// Full-text search: catalogs whose population has stopped, indexes that are out of date or disabled.
//
// Only metadata (sys.fulltext_catalogs, sys.fulltext_indexes, FULLTEXTCATALOGPROPERTY, OBJECTPROPERTY): no data is read,
// and nothing is changed. Everything is SQL Server 2005 syntax. In databases without full-text the rules find nothing.
//
// FULLTEXTCATALOGPROPERTY(…, 'PopulateStatus'): 0 idle, 1 full population, 2 paused, 3 throttled, 4 recovering,
// 5 shutdown, 6 incremental population, 7 building index, 8 disk full (paused), 9 change tracking.
// 'PopulateCompletionAge' is seconds from 1990-01-01 to the last completed population.
[
{
"id": "COM-FT-001",
"title": "Fulltext-katalog er sat på pause, fordi disken er fuld",
"severity": "High",
"scope": "Database",
"query": "SELECT c.name AS [catalog], FULLTEXTCATALOGPROPERTY(c.name, 'ItemCount') AS [items] FROM sys.fulltext_catalogs c WHERE FULLTEXTCATALOGPROPERTY(c.name, 'PopulateStatus') = 8",
"subject": "fulltext: {database}/{catalog}",
"findingTitle": "Fulltext-kataloget {catalog} i {database} er stoppet: disken er fuld",
"explanation": "SQL Server har sat opbygningen af fulltext-kataloget {catalog} på pause, fordi der ikke er plads på disken. Søgninger med CONTAINS og FREETEXT bruger det indeks, der var bygget, så nye og ændrede rækker findes ikke. Det fortsætter ikke af sig selv, før der er plads.",
"recommendation": "Frigør plads på drevet med databasens datafiler (eller fulltext-katalogets mappe på SQL Server 2005), og genoptag derefter: ALTER FULLTEXT CATALOG [{catalog}] REBUILD, eller start en fuld population af tabellernes fulltext-indexes (ALTER FULLTEXT INDEX ON … START FULL POPULATION).",
"evidence": [ "catalog", "items" ],
"author": "SQLInsight Pro"
},
{
"id": "COM-FT-002",
"title": "Fulltext-katalog er sat på pause eller drosles",
"severity": "Medium",
"scope": "Database",
"query": "SELECT c.name AS [catalog], CASE FULLTEXTCATALOGPROPERTY(c.name, 'PopulateStatus') WHEN 2 THEN 'sat på pause' ELSE 'droslet' END AS [status] FROM sys.fulltext_catalogs c WHERE FULLTEXTCATALOGPROPERTY(c.name, 'PopulateStatus') IN (2, 3)",
"subject": "fulltext: {database}/{catalog}",
"findingTitle": "Fulltext-kataloget {catalog} i {database} er {status}",
"explanation": "Opbygningen af fulltext-kataloget {catalog} er {status}. Mens den står stille, finder fulltext-søgninger ikke nye og ændrede rækker. 'Droslet' betyder, at SQL Server har bremset opbygningen på grund af ressourcemangel (hukommelse eller CPU); 'pause' kan være sat manuelt eller af SQL Server.",
"recommendation": "Tjek status i SQL Server Management Studio under Storage > Full Text Catalogs og fulltext-loggen (SQLFT*.log i SQL Servers logmappe). Genoptag med ALTER FULLTEXT INDEX ON <tabel> RESUME POPULATION. Bliver den ved med at drosles, så se på hukommelse og CPU på serveren.",
"evidence": [ "catalog", "status" ],
"author": "SQLInsight Pro"
},
{
"id": "COM-FT-003",
"title": "Fulltext-indeks uden automatisk opdatering er ikke opdateret i over en uge",
"severity": "Low",
"scope": "Database",
"query": "SELECT OBJECT_NAME(i.object_id) AS [table], c.name AS [catalog], CASE i.change_tracking_state WHEN 'M' THEN 'manuel' ELSE 'slået fra' END AS [change_tracking], CONVERT(varchar(16), DATEADD(second, FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge'), '19900101'), 120) AS [last_population] FROM sys.fulltext_indexes i JOIN sys.fulltext_catalogs c ON c.fulltext_catalog_id = i.fulltext_catalog_id WHERE i.change_tracking_state IN ('M', 'O') AND i.is_enabled = 1 AND FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge') > 0 AND DATEADD(second, FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge'), '19900101') < DATEADD(day, -7, GETDATE()) AND DATEADD(second, FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge'), '19900101') >= DATEADD(day, -30, GETDATE())",
"subject": "fulltext: {database}/{table}",
"findingTitle": "Fulltext-indekset på {table} i {database} er sidst opdateret {last_population}",
"explanation": "Fulltext-indekset på {table} opdateres ikke automatisk (change tracking er {change_tracking}), og kataloget {catalog} blev sidst bygget {last_population}. Søgninger finder ikke rækker, der er oprettet eller ændret siden.",
"recommendation": "Opdatér det regelmæssigt fra et job (ALTER FULLTEXT INDEX ON [{table}] START INCREMENTAL POPULATION, kræver en timestamp-kolonne, ellers START FULL POPULATION), eller slå automatisk opdatering til: ALTER FULLTEXT INDEX ON [{table}] SET CHANGE_TRACKING AUTO.",
"evidence": [ "table", "catalog", "change_tracking", "last_population" ],
"author": "SQLInsight Pro"
},
{
"id": "COM-FT-004",
"title": "Fulltext-indeks uden automatisk opdatering er ikke opdateret i over 30 dage",
"severity": "Medium",
"scope": "Database",
"query": "SELECT OBJECT_NAME(i.object_id) AS [table], c.name AS [catalog], CASE i.change_tracking_state WHEN 'M' THEN 'manuel' ELSE 'slået fra' END AS [change_tracking], CONVERT(varchar(16), DATEADD(second, FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge'), '19900101'), 120) AS [last_population] FROM sys.fulltext_indexes i JOIN sys.fulltext_catalogs c ON c.fulltext_catalog_id = i.fulltext_catalog_id WHERE i.change_tracking_state IN ('M', 'O') AND i.is_enabled = 1 AND FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge') > 0 AND DATEADD(second, FULLTEXTCATALOGPROPERTY(c.name, 'PopulateCompletionAge'), '19900101') < DATEADD(day, -30, GETDATE())",
"subject": "fulltext: {database}/{table}",
"findingTitle": "Fulltext-indekset på {table} i {database} er ikke opdateret siden {last_population}",
"explanation": "Fulltext-indekset på {table} opdateres ikke automatisk (change tracking er {change_tracking}), og kataloget {catalog} er ikke bygget i over 30 dage (sidst {last_population}). Søgninger med CONTAINS og FREETEXT giver derfor forældede resultater.",
"recommendation": "Opdatér det regelmæssigt fra et job (ALTER FULLTEXT INDEX ON [{table}] START INCREMENTAL POPULATION, kræver en timestamp-kolonne, ellers START FULL POPULATION), eller slå automatisk opdatering til: ALTER FULLTEXT INDEX ON [{table}] SET CHANGE_TRACKING AUTO. Bruges indekset ikke, så overvej at fjerne det.",
"evidence": [ "table", "catalog", "change_tracking", "last_population" ],
"author": "SQLInsight Pro"
},
{
"id": "COM-FT-005",
"title": "Fulltext-indeks er deaktiveret",
"severity": "Medium",
"scope": "Database",
"query": "SELECT OBJECT_NAME(i.object_id) AS [table], c.name AS [catalog] FROM sys.fulltext_indexes i JOIN sys.fulltext_catalogs c ON c.fulltext_catalog_id = i.fulltext_catalog_id WHERE i.is_enabled = 0",
"subject": "fulltext: {database}/{table}",
"findingTitle": "Fulltext-indekset på {table} i {database} er deaktiveret",
"explanation": "Fulltext-indekset på {table} (kataloget {catalog}) er slået fra. Det opdateres ikke, og fulltext-søgninger mod tabellen fejler eller finder intet, afhængigt af hvordan applikationen søger.",
"recommendation": "Var det ikke med vilje (fx under en dataindlæsning), så slå det til igen: ALTER FULLTEXT INDEX ON [{table}] ENABLE, og start en population. Bruges det ikke, så fjern det: DROP FULLTEXT INDEX ON [{table}].",
"evidence": [ "table", "catalog" ],
"author": "SQLInsight Pro"
}
]