1

同じ 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) が含まれます。私のメンタルモデルはどこで間違っていますか?

4

0 に答える 0