SAI quick start
Follow the steps to get started quickly with Storage-Attached Indexing (SAI).
To get started with Storage-Attached Indexing (SAI), create a keyspace and a simple table in your DataStax Astra or DataStax Enterprise (DSE) database. Then enter a few CREATE CUSTOM INDEX commands on the table columns, load some data, and submit queries to try the features in your development environment.
The examples in this quick start topic show SAI indexes with non-partition key columns. See the next topic, Examine SAI column index and query rules, for examples that include indexing based on a single column from a composite partition key.
cycling
. Another option is to see the Better Botz sample and its SAI indexing examples in the Astra documentation.
The Astra CQL Console with the cqlsh
prompt:
Create a keyspace
cqlsh
, define the cycling
keyspace to try the commands in a test environment.
(Astra users – skip this step.) Example:
CREATE KEYSPACE IF NOT EXISTS cycling WITH replication = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : '1' };
Create a database table
cyclist_semi_pro
database table in the cycling
keyspace or the keyspace name of your
choice. Example:
CREATE TABLE IF NOT EXISTS cycling.cyclist_semi_pro ( id int, firstname text, lastname text, age int, affiliation text, country text, registration date, PRIMARY KEY (id));
Create a few SAI indexes on the database table
cyclist_semi_pro
table. Examples:
CREATE CUSTOM INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname) USING 'StorageAttachedIndex' WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'}; CREATE CUSTOM INDEX age_sai_idx ON cycling.cyclist_semi_pro (age) USING 'StorageAttachedIndex'; CREATE CUSTOM INDEX country_sai_idx ON cycling.cyclist_semi_pro (country) USING 'StorageAttachedIndex' WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'}; CREATE CUSTOM INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration) USING 'StorageAttachedIndex';
DESCRIBE TABLE cycling.cyclist_semi_pro;
CREATE TABLE cycling.cyclist_semi_pro ( id int PRIMARY KEY, affiliation text, age int, country text, firstname text, lastname text, registration date ) WITH additional_write_policy = '99PERCENTILE' AND bloom_filter_fp_chance = 0.01 AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND nodesync = {'enabled': 'true', 'incremental': 'true'} AND read_repair = 'BLOCKING' AND speculative_retry = '99PERCENTILE'; CREATE CUSTOM INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration) USING 'StorageAttachedIndex'; CREATE CUSTOM INDEX country_sai_idx ON cycling.cyclist_semi_pro (country) USING 'StorageAttachedIndex' WITH OPTIONS = {'normalize': 'true', 'case_sensitive': 'false', 'ascii': 'true'}; CREATE CUSTOM INDEX age_sai_idx ON cycling.cyclist_semi_pro (age) USING 'StorageAttachedIndex'; CREATE CUSTOM INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname) USING 'StorageAttachedIndex' WITH OPTIONS = {'normalize': 'true', 'case_sensitive': 'false', 'ascii': 'true'};
Add data to your table
INSERT
commands to add some data to the
cyclist_semi_pro
database table. INSERT
commands. To load databases with
many rows, consider using DataStax Bulk Loader for Apache Cassandra.Examples:
INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (1, 'Carlos', 'Perotti', 22, 'Recco Club', 'ITA', '2020-01-12'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (2, 'Giovani', 'Pasi', 19, 'Venezia Velocità', 'ITA', '2016-05-15'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (3, 'Frances', 'Giardello', 24, 'Menaggio Campioni', 'ITA', '2018-07-29'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (4, 'Mark', 'Pastore', 19, 'Portofino Ciclisti', 'ITA', '2017-06-16'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (5, 'Irene', 'Cantona', 24, 'Como Velocità', 'ITA', '2012-07-22'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (6, 'Hugo', 'Herrera', 23, 'Bellagio Ciclisti', 'ITA', '2004-02-12'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (7, 'Marcel', 'Silva', 21, 'Paris Cyclistes', 'FRA', '2018-04-28'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (8, 'Theo', 'Bernat', 19, 'Nice Cavaliers', 'FRA', '2007-05-15'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (9, 'Richie', 'Draxler', 24, 'Normandy Club', 'FRA', '2011-02-26'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (10, 'Agnes', 'Cavani', 22, 'Chamonix Hauteurs', 'FRA', '2020-01-02'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (11, 'Pablo', 'Verratti', 19, 'Chamonix Hauteurs', 'FRA', '2006-05-15'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (12, 'Charles', 'Eppinger', 24, 'Chamonix Hauteurs', 'FRA', '2018-07-29'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (13, 'Stanley', 'Trout', 30, 'Bolder Boulder', 'USA', '2016-02-12'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (14, 'Juan', 'Perez', 31, 'Rutgers Alumni Riders', 'USA', '2017-06-16'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (15, 'Thomas', 'Fulton', 27, 'Exeter Academy', 'USA', '2012-12-15'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (16, 'Jenny', 'Hamler', 28, 'CU Alums Crankworkz', 'USA', '2012-07-22'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (17, 'Alice', 'McCaffrey', 26, 'Pennan Power', 'GBR', '2020-02-12'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (18, 'Nicholas', 'Burrow', 26, 'Aberdeen Association', 'GBR', '2016-02-12'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (19, 'Tyler', 'Higgins', 24, 'Highclere Agents', 'GBR', '2019-07-31'); INSERT INTO cycling.cyclist_semi_pro (id, firstname, lastname, age, affiliation, country, registration) VALUES (20, 'Leslie', 'Boyd', 18, 'London Cyclists', 'GBR', '2012-12-15');
Submit CQL queries
SELECT
command to submit queries.- Numerics:
=
,<
,>
,<=
,>=
,AND
- Strings:
=
,CONTAINS
,CONTAINS key
,CONTAINS VALUES
,AND
Not supported: LIKE
,
IN
, OR
Find a specific semi-pro cyclist:
SELECT * FROM cycling.cyclist_semi_pro WHERE lastname = 'Eppinger';
id | affiliation | age | country | firstname | lastname | registration
----+-------------------+-----+---------+-----------+----------+--------------
12 | Chamonix Hauteurs | 24 | FRA | Charles | Eppinger | 2018-07-29
(1 rows)
Find semi-pro cyclists whose age is less than or equal to 23:
SELECT * FROM cycling.cyclist_semi_pro WHERE age <= 23;
id | affiliation | age | country | firstname | lastname | registration
----+--------------------+-----+---------+-----------+----------+--------------
10 | Chamonix Hauteurs | 22 | FRA | Agnes | Cavani | 2020-01-02
11 | Chamonix Hauteurs | 19 | FRA | Pablo | Verratti | 2006-05-15
1 | Recco Club | 22 | ITA | Carlos | Perotti | 2020-01-12
8 | Nice Cavaliers | 19 | FRA | Theo | Bernat | 2007-05-15
2 | Venezia Velocità | 19 | ITA | Giovani | Pasi | 2016-05-15
4 | Portofino Ciclisti | 19 | ITA | Mark | Pastore | 2017-06-16
20 | London Cyclists | 18 | GBR | Leslie | Boyd | 2012-12-15
7 | Paris Cyclistes | 21 | FRA | Marcel | Silva | 2018-04-28
6 | Bellagio Ciclisti | 23 | ITA | Hugo | Herrera | 2004-02-12
(9 rows)
Find semi-pro cyclists from Great Britain:
SELECT * FROM cycling.cyclist_semi_pro WHERE country = 'GBR';
id | affiliation | age | country | firstname | lastname | registration
----+----------------------+-----+---------+-----------+-----------+--------------
19 | Highclere Agents | 24 | GBR | Tyler | Higgins | 2019-07-31
18 | Aberdeen Association | 26 | GBR | Nicholas | Burrow | 2016-02-12
20 | London Cyclists | 18 | GBR | Leslie | Boyd | 2012-12-15
17 | Pennan Power | 26 | GBR | Alice | McCaffrey | 2020-02-12
(4 rows)
Find semi-pro cyclists who registered between a given date range:
SELECT * FROM cycling.cyclist_semi_pro WHERE registration > '2010-01-01' AND registration < '2015-12-31' LIMIT 10;
id | affiliation | age | country | firstname | lastname | registration
----+---------------------+-----+---------+-----------+----------+--------------
5 | Como Velocità | 24 | ITA | Irene | Cantona | 2012-07-22
16 | CU Alums Crankworkz | 28 | USA | Jenny | Hamler | 2012-07-22
15 | Exeter Academy | 27 | USA | Thomas | Fulton | 2012-12-15
20 | London Cyclists | 18 | GBR | Leslie | Boyd | 2012-12-15
9 | Normandy Club | 24 | FRA | Richie | Draxler | 2011-02-26
(5 rows)
CONTAINS
clauses that take advantage of SAI collection maps, lists, and sets, be sure to see
SAI collection map examples with keys, values, and entries and SAI collection examples with list and set types.Removing an SAI index
To remove an SAI index, use DROP INDEX
.
Example:
DROP INDEX IF EXISTS cycling.age_sai_idx;
What's next?
The next topic examines column index and query rules, plus collection maps.