|
| 1 | +--- |
| 2 | +title: INSPECT |
| 3 | +summary: Use the INSPECT statement to run data consistency validation checks against tables or databases. |
| 4 | +toc: true |
| 5 | +docs_area: reference.sql |
| 6 | +--- |
| 7 | + |
| 8 | +The `INSPECT` [statement]({% link {{ page.version.version }}/sql-statements.md %}) runs a data consistency validation job against a table or database and records any errors it finds. To display errors recorded by an inspection job, use [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}). |
| 9 | + |
| 10 | +{{site.data.alerts.callout_info}} |
| 11 | +`INSPECT` is used to verify data integrity. It does not automatically repair errors. |
| 12 | +{{site.data.alerts.end}} |
| 13 | + |
| 14 | +## Required privileges |
| 15 | + |
| 16 | +To run `INSPECT` and view its results, the user must have: |
| 17 | + |
| 18 | +- The `INSPECT` system-level [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges), which is required to run the `INSPECT` statement. |
| 19 | + |
| 20 | +## Synopsis |
| 21 | + |
| 22 | +<div> |
| 23 | + {% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/inspect_table.html %} |
| 24 | +</div> |
| 25 | + |
| 26 | +<div> |
| 27 | + {% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/{{ page.release_info.crdb_branch_name }}/grammar_svg/inspect_database.html %} |
| 28 | +</div> |
| 29 | + |
| 30 | +## Parameters |
| 31 | + |
| 32 | +Parameter | Description |
| 33 | +----------|------------ |
| 34 | +`table_name` | The [table]({% link {{ page.version.version }}/create-table.md %}) to inspect. |
| 35 | +`db_name` | The [database]({% link {{ page.version.version }}/create-database.md %}) to inspect. |
| 36 | +`opt_as_of_clause` | Optional. Run the inspection against a historical read timestamp using `INSPECT ... AS OF SYSTEM TIME {expr}`. For an example, see [`INSPECT` at a specific timestamp](#inspect-at-a-specific-timestamp). For more information about historical reads, see [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}). |
| 37 | +`opt_inspect_options_clause` | Optional. Control which [indexes]({% link {{ page.version.version }}/indexes.md %}) are inspected using `INSPECT ... WITH OPTIONS (...)`. For an example, see [`INSPECT` a table for specific indexes](#inspect-a-table-for-specific-indexes). See [Options](#options). |
| 38 | + |
| 39 | +### Options |
| 40 | + |
| 41 | +Option | Description |
| 42 | +-------|------------ |
| 43 | +`INDEX ALL` | Inspect all supported index types in the target table or database. This is the default. |
| 44 | +`INDEX ({index_name} [, ...])` | Inspect only the specified indexes. Note that `INDEX ALL` and this option are mutually exclusive. |
| 45 | +`DETACHED` | Run `INSPECT` in detached mode so the statement returns to the SQL client after the job is created (instead of waiting for the job to complete). For an example, see [`INSPECT` a table without waiting for completion](#inspect-a-table-without-waiting-for-completion). This option allows `INSPECT` to run inside a [multi-statement transaction]({% link {{ page.version.version }}/run-multi-statement-transactions.md %}). |
| 46 | + |
| 47 | +## Considerations |
| 48 | + |
| 49 | +- `INSPECT` always runs as a [background job]({% link {{ page.version.version }}/show-jobs.md %}). |
| 50 | +- By default, `INSPECT` causes the SQL client to wait for the background job to complete and returns a `NOTICE` with the job ID. To return to the client as soon as the job is created (without waiting for it to finish), use the [`DETACHED` option](#options). |
| 51 | +- `INSPECT` can be run inside a [multi-statement transaction]({% link {{ page.version.version }}/run-multi-statement-transactions.md %}) if the `DETACHED` option is used. Otherwise, it needs to be run in an [implicit transaction]({% link {{ page.version.version }}/transactions.md %}#individual-statements). |
| 52 | +- `INSPECT` runs with low priority under the [admission control]({% link {{ page.version.version }}/admission-control.md %}) subsystem and may take time on large datasets. Plan to run it during periods of lower system load. |
| 53 | +- The following index types are unsupported: |
| 54 | + - [Vector indexes]({% link {{ page.version.version }}/vector-indexes.md %}) |
| 55 | + - [Partial indexes]({% link {{ page.version.version }}/partial-indexes.md %}) |
| 56 | + - [Expression indexes]({% link {{ page.version.version }}/expression-indexes.md %}) |
| 57 | + - [Hash-sharded indexes]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) |
| 58 | + - [Inverted indexes]({% link {{ page.version.version }}/inverted-indexes.md %}) |
| 59 | +- Unsupported index types are automatically skipped when using the default `INDEX ALL` behavior. If an unsupported index type is directly requested using `INDEX {index_name}`, the statement will fail before starting. |
| 60 | + |
| 61 | +## Examples |
| 62 | + |
| 63 | +### `INSPECT` a table (all supported indexes) |
| 64 | + |
| 65 | +{% include_cached copy-clipboard.html %} |
| 66 | +~~~ sql |
| 67 | +INSPECT TABLE movr.public.users; |
| 68 | +~~~ |
| 69 | + |
| 70 | +~~~ |
| 71 | +NOTICE: waiting for INSPECT job to complete: 1141477630617223169 |
| 72 | +If the statement is canceled, the job will continue in the background. |
| 73 | +~~~ |
| 74 | + |
| 75 | +### `INSPECT` a table for specific indexes |
| 76 | + |
| 77 | +{% include_cached copy-clipboard.html %} |
| 78 | +~~~ sql |
| 79 | +INSPECT TABLE movr.public.vehicles WITH OPTIONS INDEX (vehicles_auto_index_fk_city_ref_users); |
| 80 | +~~~ |
| 81 | + |
| 82 | +~~~ |
| 83 | +NOTICE: waiting for INSPECT job to complete: 1141477560713150465 |
| 84 | +If the statement is canceled, the job will continue in the background. |
| 85 | +~~~ |
| 86 | + |
| 87 | +### `INSPECT` a table without waiting for completion |
| 88 | + |
| 89 | +{% include_cached copy-clipboard.html %} |
| 90 | +~~~ sql |
| 91 | +INSPECT TABLE movr.public.vehicles WITH OPTIONS DETACHED; |
| 92 | +~~~ |
| 93 | + |
| 94 | +~~~ |
| 95 | +NOTICE: INSPECT job 1141773037670301697 running in the background |
| 96 | +~~~ |
| 97 | + |
| 98 | +### `INSPECT` at a specific timestamp |
| 99 | + |
| 100 | +{% include_cached copy-clipboard.html %} |
| 101 | +~~~ sql |
| 102 | +INSPECT TABLE movr.public.users AS OF SYSTEM TIME '-10s'; |
| 103 | +~~~ |
| 104 | + |
| 105 | +~~~ |
| 106 | +NOTICE: waiting for INSPECT job to complete: 1141477013029322753 |
| 107 | +If the statement is canceled, the job will continue in the background. |
| 108 | +~~~ |
| 109 | + |
| 110 | +### Checking `INSPECT` job status |
| 111 | + |
| 112 | +When you issue the `INSPECT` statement, a `NOTICE` message is returned to the client showing the job ID: |
| 113 | + |
| 114 | +~~~ |
| 115 | +NOTICE: waiting for INSPECT job to complete: 1141477013029322753 |
| 116 | +If the statement is canceled, the job will continue in the background. |
| 117 | +~~~ |
| 118 | + |
| 119 | +You can check the status of the `INSPECT` [job]({% link {{ page.version.version }}/show-jobs.md %}) using a statement like the following: |
| 120 | + |
| 121 | +{% include_cached copy-clipboard.html %} |
| 122 | +~~~ sql |
| 123 | +SELECT * FROM [SHOW JOBS] WHERE job_id = 1141477013029322753; |
| 124 | +~~~ |
| 125 | +~~~ |
| 126 | + job_id | job_type | description | user_name | status | running_status | created | started | finished | modified | fraction_completed | error | coordinator_id |
| 127 | +----------------------+----------+---------------------------------+-----------+-----------+----------------+------------------------+------------------------+------------------------+------------------------+--------------------+-------+----------------- |
| 128 | + 1141477013029322753 | INSPECT | INSPECT TABLE movr.public.users | node | succeeded | NULL | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 2026-01-14 20:12:19+00 | 1 | | 1 |
| 129 | +~~~ |
| 130 | + |
| 131 | +### Viewing `INSPECT` results |
| 132 | + |
| 133 | +To view errors found by an inspection job, use [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}). Errors are stored in an internal system table and are subject to a 90 day retention policy. |
| 134 | + |
| 135 | +## See also |
| 136 | + |
| 137 | +- [`SHOW INSPECT ERRORS`]({% link {{ page.version.version }}/show-inspect-errors.md %}) |
| 138 | +- [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) |
| 139 | +- [Jobs page in DB Console]({% link {{ page.version.version }}/ui-jobs-page.md %}) |
| 140 | +- [`AS OF SYSTEM TIME`]({% link {{ page.version.version }}/as-of-system-time.md %}) |
| 141 | +- [Supported privileges]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) |
0 commit comments