# 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;
Last Updated: Fri Nov 01 2024 09:02:06 GMT+0000