同じ Cassandra 行に対して大量の削除を発行することは、読み取りに時間がかかるため、アンチ パターンであることはわかっています (こちらを参照)。しかし、削除には桁違いに時間がかかることもわかっています。
同じ行に複数の値を追加してから再度追加し、一度に 1 つずつ削除してから再度追加するこの python スクリプトを考えてみましょう。各アクティビティの時間が監視され、画面に表示されます。
import cql
from time import time
connection = cql.connect('localhost',cql_version='3.0.0', keyspace='rkg')
cursor = connection.cursor()
try:
cursor.execute("DROP TABLE test")
except:
pass
cqlStatement = """
CREATE TABLE test (
a int,
b text,
c text,
d text,
PRIMARY KEY (a,b,c)
);
"""
cursor.execute(cqlStatement)
n = 1000
insertStatement = """
INSERT INTO test (a,b,c,d)
VALUES ({0},'{1}','{2}','{3}');
"""
deleteStatement = """
DELETE FROM test
WHERE a = {0} AND b = '{1}' AND c = '{2}';
"""
t = time()
for i in xrange(0,n):
cursor.execute(insertStatement.format(1,i,i,i))
print "initial insert time:\t"+ str(time() - t)
t = time()
for i in xrange(0,n):
cursor.execute(insertStatement.format(1,i,i,i))
print "second insert time:\t"+ str(time() - t)
t = time()
for i in xrange(0,n):
cursor.execute(deleteStatement.format(1,i,i))
print "delete time:\t"+ str(time() - t)
t = time()
for i in xrange(0,n):
cursor.execute(insertStatement.format(1,i,i,i))
print "next insert time:\t"+ str(time() - t)
このスクリプトへの出力は次のようになります。
$ python insertDeleteTest.py
initial insert time: 0.369267940521
second insert time: 0.368498086929
delete time: 10.8632941246
next insert time: 0.313306808472
挿入に比べて列の削除に時間がかかる理由を教えてください。
私のメンタル モデルでは、挿入も削除も基本的には同じものです。具体化されていない列がコミットログの最後に書き込まれ、memtable に押し込まれます。挿入の場合は、その列の新しい値が含まれ、削除の場合は、その列の廃棄 (tombstone) が含まれます。私のメンタルモデルはどこで間違っていますか?