# DELETE
DELETE FROM [db.]table WHERE expr
DELETE FROM
は、式expr
に一致する行をテーブル[db.]table
から削除します。削除された行はすぐに削除されたとマークされ、以降のすべてのクエリから自動的にフィルタリングされます。データのクリーンアップは非同期でバックグラウンドで行われます。
例えば、次のクエリは、Title
列にテキストhello
を含むhits
テーブルのすべての行を削除します。
DELETE FROM hits WHERE Title LIKE '%hello%';
MyScale(およびClickHouse)では、この操作は軽量な削除と呼ばれます。ALTER TABLE ... DELETE
(opens new window)クエリと比較して、オーバーヘッドが大幅に少なくなります。デフォルトでは、軽量な削除は非同期です。ただし、mutations_sync
(opens new window)を1に設定しているため、クライアントは1つのレプリカがステートメントを処理するのを待ちます。
ベクトルインデックスを持つテーブルでは、効率の悪さのためにALTER TABLE ... DELETE
クエリを無効にしています。代わりに、すべてのテーブルでDELETE FROM
を使用することをお勧めします。これははるかに高速です。
# データの更新方法
ClickHouseでは、ユーザーはALTER TABLE ... UPDATE
(opens new window)コマンドを使用してデータを更新することができます。ただし、MyScaleではベクトルの更新シナリオにこのコマンドを使用することは推奨されません。代わりに、DELETEとINSERTを使用する方法がより良いアプローチです。
例えば、次のクエリは、id
列が100と等しいtest_vector
テーブルの行を更新する方法を示しています。
DELETE FROM test_vector WHERE id = 100;
INSERT INTO test_vector values (100, [-0.045589335, ..., 0.026581138]);
MyScaleはOLAPデータベースであり、頻繁な挿入および削除操作には最適化されていません。最適なパフォーマンスを得るためには、各行を個別に処理するのではなく、1つのステートメントで複数のデータの挿入および削除を実行することが重要です。以下の例は、1つのステートメントで効率的にバッチ挿入および削除操作を行う方法を示しています。
DELETE FROM test_vector where id in (2, 3, 5, 7, 11, ...);
INSERT INTO test_vector values (2, [-0.045589335, ..., 0.026581138]), (3, [-0.051993933, ..., 0.031703997]), (5, [-0.038116932, ..., -0.116080105]), ...;
ALTER TABLE ... UPDATE
を使用することは推奨されません。
ALTER TABLE test_vector UPDATE vector = [-0.045589335, ..., 0.026581138] WHERE id = 100;