diff --git a/src/current/_includes/v26.2/faq/auto-generate-unique-ids.md b/src/current/_includes/v26.2/faq/auto-generate-unique-ids.md
index 2124fb051ab..20e027fa07c 100644
--- a/src/current/_includes/v26.2/faq/auto-generate-unique-ids.md
+++ b/src/current/_includes/v26.2/faq/auto-generate-unique-ids.md
@@ -44,6 +44,8 @@ SELECT * FROM users;
(3 rows)
~~~
+For performance, CockroachDB defaults to skipping uniqueness checks for `gen_random_uuid()` due to the near-zero probability of UUID collisions. UUID uniqueness checks can be enabled by setting the [`sql.optimizer.uniqueness_checks_for_gen_random_uuid.enabled`]({% link {{ page.version.version }}/cluster-settings.md %}) cluster setting to `true`.
+
#### Use `uuid_v4()`
Alternatively, you can use the [`BYTES`]({% link {{ page.version.version }}/bytes.md %}) column with the `uuid_v4()` function as the default value:
@@ -122,4 +124,6 @@ SELECT * FROM users3;
Upon insert or upsert, the `unique_rowid()` function generates a default value from the timestamp and ID of the node executing the insert. Such time-ordered values are likely to be globally unique except in cases where a very large number of IDs (100,000+) are generated per node per second. Also, there can be gaps and the order is not completely guaranteed.
+In multi-region deployments with [`REGIONAL BY ROW`]({% link {{ page.version.version }}/table-localities.md %}#regional-by-row-tables) tables, uniqueness checks can add latency due to cross-partition validation. You can improve performance by setting the `skip_unique_checks` index storage parameter to `true`, but this is **only** recommended if the application can guarantee uniqueness. For more information, refer to [`skip_unique_checks`]({% link {{ page.version.version }}/with-storage-parameter.md %}#skip-unique-checks).
+
To understand the differences between the `UUID` and `unique_rowid()` options, see the [SQL FAQs]({% link {{ page.version.version }}/sql-faqs.md %}#what-are-the-differences-between-uuid-sequences-and-unique_rowid). For further background on UUIDs, see [What is a UUID, and Why Should You Care?](https://www.cockroachlabs.com/blog/what-is-a-uuid/).
diff --git a/src/current/_includes/v26.2/misc/index-storage-parameters.md b/src/current/_includes/v26.2/misc/index-storage-parameters.md
index bde3fcae6db..9e11a43ba8e 100644
--- a/src/current/_includes/v26.2/misc/index-storage-parameters.md
+++ b/src/current/_includes/v26.2/misc/index-storage-parameters.md
@@ -1,14 +1,15 @@
-| Parameter name | Description | Data type | Default value
-|---------------------+----------------------|-----|------|
-| `bucket_count` | The number of buckets into which a [hash-sharded index]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) will split. | Integer | The value of the `sql.defaults.default_hash_sharded_index_bucket_count` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). |
-| `shard_columns` | The first key column or columns to use when computing the shard column for a [hash-sharded index]({% link {{ page.version.version }}/hash-sharded-indexes.md %}). The value must match a prefix of the index key columns. If this parameter is omitted, CockroachDB hashes all index key columns. | Tuple of column identifiers or a single column identifier | All index key columns |
-| `geometry_max_x` | The maximum X-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `(1 << 31) -1`. |
-| `geometry_max_y` | The maximum Y-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `(1 << 31) -1`. |
-| `geometry_min_x` | The minimum X-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if the default bounds of the SRID are too large/small for the given data, or SRID = 0 and you wish to use a smaller range (unfortunately this is currently not exposed, but is viewable on ). By default, SRID = 0 assumes `[-min int32, max int32]` ranges. | | Derived from SRID bounds, else `-(1 << 31)`. |
-| `geometry_min_y` | The minimum Y-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `-(1 << 31)`. |
-| `s2_level_mod` | `s2_max_level` must be divisible by `s2_level_mod`. `s2_level_mod` must be between `1` and `3`. | Integer | `1` |
-| `s2_max_cells` | The maximum number of S2 cells used in the covering. Provides a limit on how much work is done exploring the possible coverings. Allowed values: `1-30`. You may want to use higher values for odd-shaped regions such as skinny rectangles. Used in [spatial indexes]({% link {{ page.version.version }}/spatial-indexes.md %}). | Integer | `4` |
-| `s2_max_level` | The maximum level of S2 cell used in the covering. Allowed values: `1-30`. Setting it to less than the default means that CockroachDB will be forced to generate coverings using larger cells. Used in [spatial indexes]({% link {{ page.version.version }}/spatial-indexes.md %}). | Integer | `30` |
+| Parameter name | Description | Data type | Default value | [Alterable after index creation]({% link {{ page.version.version }}/alter-index.md %}#modify-index-storage-parameters)
+|---------------------+----------------------|-----|------|-----|
+| `bucket_count` | The number of buckets into which a [hash-sharded index]({% link {{ page.version.version }}/hash-sharded-indexes.md %}) will split. | Integer | The value of the `sql.defaults.default_hash_sharded_index_bucket_count` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). | No |
+| `shard_columns` | The first key column or columns to use when computing the shard column for a [hash-sharded index]({% link {{ page.version.version }}/hash-sharded-indexes.md %}). The value must match a prefix of the index key columns. If this parameter is omitted, CockroachDB hashes all index key columns. | Tuple of column identifiers or a single column identifier | All index key columns | No |
+| `skip_unique_checks` | Disables [unique constraint checks]({% link {{ page.version.version }}/unique.md %}) for indexes with [implicit partition]({% link {{ page.version.version }}/alter-table.md %}#using-implicit-vs-explicit-index-partitioning-in-regional-by-row-tables) columns, including indexes on [`REGIONAL BY ROW`]({% link {{ page.version.version }}/regional-tables.md %}) tables. This avoids expensive cross-partition uniqueness checks in multi-region deployments. Can only be set on unique indexes with implicit partitioning. **Warning:** This should only be used if the application can guarantee uniqueness. Safe use cases include externally generated UUIDs, or columns using [`unique_rowid()`]({% link {{ page.version.version }}/sql-faqs.md %}#how-do-i-auto-generate-unique-row-ids-in-cockroachdb) or [`unordered_unique_rowid()`]({% link {{ page.version.version }}/sql-faqs.md %}#how-do-i-auto-generate-unique-row-ids-in-cockroachdb) as defaults (provided you do not also manually insert values into those columns). Incorrectly applying this parameter when uniqueness is not guaranteed could result in logically duplicate keys in different partitions of a unique index. Note that, by default, the optimizer does not perform uniqueness checks on columns using [`gen_random_uuid()`]({% link {{ page.version.version }}/uuid.md %}). | Boolean | `false` | Yes |
+| `geometry_max_x` | The maximum X-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `(1 << 31) -1`. | No |
+| `geometry_max_y` | The maximum Y-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `(1 << 31) -1`. | No |
+| `geometry_min_x` | The minimum X-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if the default bounds of the SRID are too large/small for the given data, or SRID = 0 and you wish to use a smaller range (unfortunately this is currently not exposed, but is viewable on ). By default, SRID = 0 assumes `[-min int32, max int32]` ranges. | | Derived from SRID bounds, else `-(1 << 31)`. | No |
+| `geometry_min_y` | The minimum Y-value of the [spatial reference system]({% link {{ page.version.version }}/architecture/glossary.md %}#spatial-reference-system) for the object(s) being covered. This only needs to be set if you are using a custom [SRID]({% link {{ page.version.version }}/architecture/glossary.md %}#srid). | | Derived from SRID bounds, else `-(1 << 31)`. | No |
+| `s2_level_mod` | `s2_max_level` must be divisible by `s2_level_mod`. `s2_level_mod` must be between `1` and `3`. | Integer | `1` | No |
+| `s2_max_cells` | The maximum number of S2 cells used in the covering. Provides a limit on how much work is done exploring the possible coverings. Allowed values: `1-30`. You may want to use higher values for odd-shaped regions such as skinny rectangles. Used in [spatial indexes]({% link {{ page.version.version }}/spatial-indexes.md %}). | Integer | `4` | No |
+| `s2_max_level` | The maximum level of S2 cell used in the covering. Allowed values: `1-30`. Setting it to less than the default means that CockroachDB will be forced to generate coverings using larger cells. Used in [spatial indexes]({% link {{ page.version.version }}/spatial-indexes.md %}). | Integer | `30` | No |
The following parameters are included for PostgreSQL compatibility and do not affect how CockroachDB runs:
diff --git a/src/current/v26.2/alter-index.md b/src/current/v26.2/alter-index.md
index 6b686f7fd0d..ac4eb0722b6 100644
--- a/src/current/v26.2/alter-index.md
+++ b/src/current/v26.2/alter-index.md
@@ -34,10 +34,12 @@ Additional parameters are documented for the respective [subcommands](#subcomman
Subcommand | Description |
-----------|-------------|
-[`CONFIGURE ZONE`](#configure-zone) | [Replication Controls]({% link {{ page.version.version }}/configure-replication-zones.md %}) for an index. |
+[`CONFIGURE ZONE`](#configure-zone) | [Replication Controls]({% link {{ page.version.version }}/configure-replication-zones.md %}) for an index. |
[`PARTITION BY`](#partition-by) | Partition, re-partition, or un-partition an index.
[`RENAME TO`](#rename-to) | Change the name of an index.
[`SCATTER`](#scatter) | Make a best-effort attempt to redistribute replicas and leaseholders for the ranges of a table or index. Note that this statement does not return an error even if replicas are not moved. |
+[`SET`](#set) | Modify alterable [storage parameters]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) on an existing index.
+[`RESET`](#reset) | Remove alterable [storage parameters]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) from an existing index, resetting it to its default value.
[`SPLIT AT`](#split-at) | Force a [range split]({% link {{ page.version.version }}/architecture/distribution-layer.md %}#range-splits) at the specified row in the index.
[`UNSPLIT AT`](#unsplit-at) | Remove a range split enforcement in the index.
[`VISIBILITY`](#visibility) | Set the visibility of an index between a range of `0.0` and `1.0`.
@@ -145,6 +147,43 @@ Parameter | Description
For usage, see [Synopsis](#synopsis).
+### `SET`
+
+`ALTER INDEX ... SET (storage_parameter)` modifies an alterable [index storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) on an existing index.
+
+For examples, see [Modify index storage parameters](#modify-index-storage-parameters).
+
+#### Required privileges
+
+The user must have the `CREATE` [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#managing-privileges) on the table.
+
+#### Parameters
+
+Parameter | Description
+----------|-------------
+`storage_parameter` | The name of the [index storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) to modify.
+`value` | The new value for the storage parameter.
+
+For usage, see [Synopsis](#synopsis).
+
+### `RESET`
+
+`ALTER INDEX ... RESET (storage_parameter)` removes an alterable [index storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) from an existing index, resetting it to its default value.
+
+For examples, see [Modify index storage parameters](#modify-index-storage-parameters).
+
+#### Required privileges
+
+The user must have the `CREATE` [privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#managing-privileges) on the table.
+
+#### Parameters
+
+Parameter | Description
+----------|-------------
+`storage_parameter` | The name of the [index storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) to reset to its default value.
+
+For usage, see [Synopsis](#synopsis).
+
### `SPLIT AT`
`ALTER INDEX ... SPLIT AT` forces a [range split]({% link {{ page.version.version }}/architecture/distribution-layer.md %}#range-splits) at a specified row in the index.
@@ -512,6 +551,69 @@ SELECT range_id, start_pretty, end_pretty, split_enforced_until FROM crdb_intern
The table is still split into ranges at `25.00`, `50.00`, and `75.00`, but the `split_enforced_until` column is now `NULL` for all ranges in the table. The split is no longer enforced, and CockroachDB can [merge the data]({% link {{ page.version.version }}/architecture/distribution-layer.md %}#range-merges) in the table as needed.
+### Modify index storage parameters
+
+Many [index storage parameters]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) can only be set when creating an index and cannot be changed afterward. However, some index storage parameters can be modified on an existing index using `ALTER INDEX ... SET` or `ALTER INDEX ... RESET`.
+
+This example demonstrates modifying the `skip_unique_checks` parameter on a unique index on a [`REGIONAL BY ROW`]({% link {{ page.version.version }}/regional-tables.md %}) table.
+
+Set up a multi-region database and create a `REGIONAL BY ROW` table with a unique index:
+
+{% include_cached copy-clipboard.html %}
+~~~ sql
+CREATE DATABASE multi_region_db PRIMARY REGION "us-east1" REGIONS "us-west1", "europe-west1";
+USE multi_region_db;
+
+CREATE TABLE users (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ email STRING UNIQUE,
+ name STRING
+) LOCALITY REGIONAL BY ROW;
+~~~
+
+View the index on the `email` column:
+
+{% include_cached copy-clipboard.html %}
+~~~ sql
+SHOW CREATE TABLE users;
+~~~
+
+~~~
+ table_name | create_statement
+-------------+----------------------------------------------------------------------------------------------------
+ users | CREATE TABLE public.users (
+ | id UUID NOT NULL DEFAULT gen_random_uuid(),
+ | email STRING NULL,
+ | name STRING NULL,
+ | crdb_region public.crdb_internal_region NOT VISIBLE NOT NULL DEFAULT default_to_database_primary_region(gateway_region())::public.crdb_internal_region,
+ | CONSTRAINT users_pkey PRIMARY KEY (id ASC),
+ | UNIQUE INDEX users_email_key (email ASC)
+ | ) LOCALITY REGIONAL BY ROW
+(1 row)
+~~~
+
+The `users_email_key` index is a unique index that is implicitly partitioned by the `crdb_region` column. By default, CockroachDB performs cross-partition uniqueness checks for this index because `skip_unique_checks` is set to `false`.
+
+#### Set a storage parameter
+
+To disable the cross-partition uniqueness checks, set `skip_unique_checks` to `true`:
+
+{% include_cached copy-clipboard.html %}
+~~~ sql
+ALTER INDEX users_email_key SET (skip_unique_checks = true);
+~~~
+
+#### Reset a storage parameter
+
+To re-enable cross-partition uniqueness checks, reset the parameter to its default value:
+
+{% include_cached copy-clipboard.html %}
+~~~ sql
+ALTER INDEX users_email_key RESET (skip_unique_checks);
+~~~
+
+This restores the default behavior where CockroachDB enforces uniqueness across all partitions of the index (`skip_unique_checks = false`).
+
### Set index visibility
#### Set an index to be not visible
diff --git a/src/current/v26.2/alter-table.md b/src/current/v26.2/alter-table.md
index 3001ee1834e..ca255fb05df 100644
--- a/src/current/v26.2/alter-table.md
+++ b/src/current/v26.2/alter-table.md
@@ -459,7 +459,7 @@ For usage, see [Synopsis](#synopsis).
`ALTER TABLE ... RESET {storage parameter}` reverts the value of a storage parameter on a table to its default value.
{{site.data.alerts.callout_info}}
-To reset a storage parameter on an existing index, you must drop and [recreate the index without the storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}).
+To reset a storage parameter on an existing index, use [`ALTER INDEX ... RESET (storage_parameter)`]({% link {{ page.version.version }}/alter-index.md %}#reset) if the parameter [can be altered]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters). Otherwise, you must drop and [recreate the index without the storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}).
{{site.data.alerts.end}}
For examples, see [Set and reset storage parameters](#set-and-reset-storage-parameters).
@@ -541,7 +541,7 @@ The user must be a member of the [`admin`]({% link {{ page.version.version }}/se
`ALTER TABLE ... SET {storage parameter}` sets a storage parameter on an existing table.
{{site.data.alerts.callout_info}}
-To set a storage parameter on an existing index, you must drop and [recreate the index with the storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}).
+To set a storage parameter on an existing index, use [`ALTER INDEX ... SET (storage_parameter)`]({% link {{ page.version.version }}/alter-index.md %}#set) if the parameter [can be altered]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters). Otherwise, you must drop and [recreate the index with the storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}).
{{site.data.alerts.end}}
For examples, see [Set and reset storage parameters](#set-and-reset-storage-parameters).
@@ -1357,7 +1357,15 @@ SHOW PARTITIONS FROM TABLE users;
To ensure that the uniqueness constraint is enforced properly across regions when rows are inserted, or the `email` column of an existing row is updated, the database needs to do the following additional work when indexes are partitioned:
1. Run a one-time-only validation query to ensure that the existing data in the table satisfies the unique constraint.
-1. Thereafter, the [optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}) will automatically add a "uniqueness check" when necessary to any [`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statement affecting the columns in the unique constraint.
+1. By default, the [optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}) performs a "uniqueness check" when handling an [`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statement affecting the columns in the unique constraint.
+
+ These checks can be skipped for unique, implicitly partitioned indexes by setting the `skip_unique_checks` [storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) to `true`.
+
+ {{site.data.alerts.callout_danger}}
+ Uniqueness checks should only be skipped if the application can guarantee uniqueness, for example, by using external UUID values or relying on a [`unique_rowid()`]({% link {{ page.version.version }}/uuid.md %}#use-unique_rowid) default value. Incorrectly applying this setting when uniqueness is not guaranteed by the application could result in logically duplicate keys in different partitions of a unique index.
+
+ For more information, refer to [`skip_unique_checks`]({% link {{ page.version.version }}/with-storage-parameter.md %}#skip-unique-checks).
+ {{site.data.alerts.end}}
{% include {{page.version.version}}/sql/locality-optimized-search.md %}
@@ -1397,7 +1405,7 @@ To auto-generate unique row identifiers in `REGIONAL BY ROW` tables, use the [`U
~~~
{{site.data.alerts.callout_info}}
-When using `DEFAULT gen_random_uuid()` on columns in `REGIONAL BY ROW` tables, uniqueness checks on those columns are disabled by default for performance purposes. CockroachDB assumes uniqueness based on the way this column generates [`UUIDs`]({% link {{ page.version.version }}/uuid.md %}#create-a-table-with-auto-generated-unique-row-ids). To enable this check, you can modify the `sql.optimizer.uniqueness_checks_for_gen_random_uuid.enabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). Note that while there is virtually no chance of a [collision](https://wikipedia.org/wiki/Universally_unique_identifier#Collisions) occurring when enabling this setting, it is not truly zero.
+By default, the optimizer does not perform uniqueness checks when you use `DEFAULT gen_random_uuid()` on columns in `REGIONAL BY ROW` tables. CockroachDB assumes uniqueness based on the way this column generates [`UUIDs`]({% link {{ page.version.version }}/uuid.md %}#create-a-table-with-auto-generated-unique-row-ids). To enable this check, you can modify the `sql.optimizer.uniqueness_checks_for_gen_random_uuid.enabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). Note that while there is virtually no chance of a [collision](https://wikipedia.org/wiki/Universally_unique_identifier#Collisions) occurring when enabling this setting, it is not truly zero.
{{site.data.alerts.end}}
#### Using implicit vs. explicit index partitioning in `REGIONAL BY ROW` tables
@@ -1409,7 +1417,13 @@ These indexes can either include or exclude the partitioning key (`crdb_region`)
- If `crdb_region` is included in the index definition, a [`UNIQUE` index]({% link {{ page.version.version }}/unique.md %}) will enforce uniqueness on the set of columns, just like it would in a non-partitioned table.
- If `crdb_region` is excluded from the index definition, that serves as a signal that CockroachDB should enforce uniqueness on only the columns in the index definition.
-In the latter case, the index alone cannot enforce uniqueness on columns that are not a prefix of the index columns, so any time rows are [inserted]({% link {{ page.version.version }}/insert.md %}) or [updated]({% link {{ page.version.version }}/update.md %}) in a `REGIONAL BY ROW` table that has an implicitly partitioned `UNIQUE` index, the [optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}) must add uniqueness checks.
+In the latter case, the index alone cannot enforce uniqueness on columns that are not a prefix of the index columns, so any time rows are [inserted]({% link {{ page.version.version }}/insert.md %}) or [updated]({% link {{ page.version.version }}/update.md %}) in a `REGIONAL BY ROW` table that has an implicitly partitioned `UNIQUE` index, by default the [optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}) performs uniqueness checks. These checks can be skipped for unique, implicitly partitioned indexes by setting the `skip_unique_checks` [storage parameter]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters) to `true`.
+
+{{site.data.alerts.callout_danger}}
+Uniqueness checks should only be skipped if the application can guarantee uniqueness, for example, by using external UUID values or relying on a [`unique_rowid()`]({% link {{ page.version.version }}/uuid.md %}#use-unique_rowid) default value. Incorrectly applying this setting when uniqueness is not guaranteed by the application could result in logically duplicate keys in different partitions of a unique index.
+
+For more information, refer to [`skip_unique_checks`]({% link {{ page.version.version }}/with-storage-parameter.md %}#skip-unique-checks).
+{{site.data.alerts.end}}
Whether or not to explicitly include `crdb_region` in the index definition depends on the context:
diff --git a/src/current/v26.2/create-index.md b/src/current/v26.2/create-index.md
index ee7b959d8b8..4994ae8cf7c 100644
--- a/src/current/v26.2/create-index.md
+++ b/src/current/v26.2/create-index.md
@@ -56,7 +56,7 @@ Parameter | Description
`opt_where_clause` | An optional `WHERE` clause that defines the predicate boolean expression of a [partial index]({% link {{ page.version.version }}/partial-indexes.md %}).
`opt_index_visible` | An optional `VISIBLE`, `NOT VISIBLE`, or `VISIBILITY` clause that indicates that an [index is visible, not visible, or partially visible to the cost-based optimizer]({% link {{ page.version.version }}/cost-based-optimizer.md %}#control-whether-the-optimizer-uses-an-index). If not visible, the index will not be used in queries unless it is specifically selected with an [index hint]({% link {{ page.version.version }}/indexes.md %}#selection) or the property is overridden with the [`optimizer_use_not_visible_indexes` session variable]({% link {{ page.version.version }}/set-vars.md %}#optimizer-use-not-visible-indexes). For examples, see [Set index visibility]({% link {{ page.version.version }}/alter-index.md %}#set-index-visibility).
Indexes that are not visible are still used to enforce `UNIQUE` and `FOREIGN KEY` [constraints]({% link {{ page.version.version }}/constraints.md %}). For more considerations, see [Index visibility considerations](alter-index.html#not-visible).
`USING HASH` | Creates a [hash-sharded index]({% link {{ page.version.version }}/hash-sharded-indexes.md %}).
-`WITH storage_parameter` | A comma-separated list of [spatial index tuning parameters]({% link {{ page.version.version }}/spatial-indexes.md %}#index-tuning-parameters). Supported parameters include `fillfactor`, `s2_max_level`, `s2_level_mod`, `s2_max_cells`, `geometry_min_x`, `geometry_max_x`, `geometry_min_y`, and `geometry_max_y`. The `fillfactor` parameter is a no-op, allowed for PostgreSQL-compatibility.
For details, see [Spatial index tuning parameters]({% link {{ page.version.version }}/spatial-indexes.md %}#index-tuning-parameters). For an example, see [Create a spatial index that uses all of the tuning parameters]({% link {{ page.version.version }}/spatial-indexes.md %}#create-a-spatial-index-that-uses-all-of-the-tuning-parameters).
+`WITH storage_parameter` | A comma-separated list of [index storage parameters]({% link {{ page.version.version }}/with-storage-parameter.md %}#index-parameters).
`CONCURRENTLY` | Optional, no-op syntax for PostgreSQL compatibility. All indexes are created concurrently in CockroachDB.
## Viewing schema changes
diff --git a/src/current/v26.2/with-storage-parameter.md b/src/current/v26.2/with-storage-parameter.md
index a8df98739cf..3dad468d30b 100644
--- a/src/current/v26.2/with-storage-parameter.md
+++ b/src/current/v26.2/with-storage-parameter.md
@@ -83,6 +83,6 @@ In this case, CockroachDB implicitly added the `ttl` and `ttl_job_cron` [TTL sto
- [Take Full and Incremental Backups]({% link {{ page.version.version }}/take-full-and-incremental-backups.md %})
- [`BACKUP`]({% link {{ page.version.version }}/backup.md %})
- [`RESTORE`]({% link {{ page.version.version }}/restore.md %})
-- [`SET` (storage parameter)]({% link {{ page.version.version }}/alter-table.md %}#set-storage-parameter)
-- [`RESET` (storage parameter)]({% link {{ page.version.version }}/alter-table.md %}#reset-storage-parameter)
+- [`ALTER TABLE ... SET`]({% link {{ page.version.version }}/alter-table.md %}#set-storage-parameter)
+- [`ALTER INDEX ... SET`]({% link {{ page.version.version }}/alter-index.md %}#set)
- [Batch Delete Expired Data with Row-Level TTL]({% link {{ page.version.version }}/row-level-ttl.md %})