- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2018-09-20T16:24:21+00:00","","")
[[AWSメモ]] >
* DynamoDBで取得する列を指定した場合のキャパシティユニット [#wf6f3706]
#setlinebreak(on);
#contents
-- 関連
--- [[DynamoDBのキャパシティユニットについて]]
-- 参考
--- 項目サイズおよびキャパシティーユニットの消費 &br; https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html#ItemSizeCalculations.Reads
--- boto3 Doc DynamoDB &br; https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html
** 概要 [#q1e70cb5]
#html(<div style="padding-left:10px">)
DynamoDBで取得する列を指定して検索した場合のキャパシティユニットについて確認する。
DynamoDBで取得する列を指定して検索した場合のQueryのキャパシティユニットについて確認する。
AttributesToGet はレガシーパラメータだそうなので、以下のサンプルでは ProjectionExpression を使用する。
※ https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html
#html(</div>)
** 取得する列を指定して検索 [#c5806865]
#html(<div style="padding-left:10px">)
#mycode2(){{
import boto3
from boto3.dynamodb.conditions import Key
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('SampleTable')
def create_test_data():
base_text = '1234567890'
text_data = ''
for i in range(1000):
text_data = text_data + base_text
text_data = '1234567890' * 1000
for i in range(1):
for j in range(10):
res = table.put_item(
Item = {
"pkey": f'pkey-{i+1:05d}',
"skey": f'skey-{j+1:05d}',
"column001": text_data,
"column002": text_data,
"column003": text_data,
"column004": text_data,
"column005": text_data,
"column006": text_data,
"column007": text_data,
"column008": text_data,
"column009": text_data,
"column010": text_data
},
ReturnConsumedCapacity = 'INDEXES'
)
print(res)
def get_item(pkey, skey, columns):
args = {}
args['Key'] = {'pkey': pkey, 'skey': skey}
args['ProjectionExpression'] = columns
args['ReturnConsumedCapacity'] = 'INDEXES'
res = table.get_item(**args)
print(json.dumps(res['ConsumedCapacity'], indent=4))
def query(pkey, skey, columns):
args = {}
args['KeyConditionExpression'] = Key('pkey').eq(pkey)
if skey:
args['KeyConditionExpression'] &= Key('skey').eq(skey)
args['ProjectionExpression'] = columns
args['ReturnConsumedCapacity'] = 'INDEXES'
res = table.query(**args)
print(json.dumps(res['ConsumedCapacity'], indent=4))
def main():
#create_test_data()
print('### get_item(column * 5) ###')
get_item('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005')
print('### get_item(column * 10) ###')
get_item('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010')
print('### query(column * 5) ###')
query('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005')
print('### query(column * 10) ###')
query('pkey-00001', 'skey-00001', 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010')
print('### query(hash key only query - column * 5) ###')
query('pkey-00001', None, 'column001, column002 ,column003, column004, column005')
print('### query(hash key only query - column * 10) ###')
query('pkey-00001', None, 'column001, column002 ,column003, column004, column005, column006, column007 ,column008, column009, column010')
if __name__ == '__main__':
main()
}}
#html(</div>)
** 結果 [#v0db2462]
#html(<div style="padding-left:10px;">)
結果は変わらない。レコードサイズ分のキャパシティユニットが消費される。
#myterm2(){{
### get_item(column * 5) ###
{
"TableName": "SampleTable",
"CapacityUnits": 12.5,
"Table": {
"CapacityUnits": 12.5
}
}
### get_item(column * 10) ###
{
"TableName": "SampleTable",
"CapacityUnits": 12.5,
"Table": {
"CapacityUnits": 12.5
}
}
### query(column * 5) ###
{
"TableName": "SampleTable",
"CapacityUnits": 12.5,
"Table": {
"CapacityUnits": 12.5
}
}
### query(column * 10) ###
{
"TableName": "SampleTable",
"CapacityUnits": 12.5,
"Table": {
"CapacityUnits": 12.5
}
}
### query(hash key only query - column * 5) ###
{
"TableName": "SampleTable",
"CapacityUnits": 122.5,
"Table": {
"CapacityUnits": 122.5
}
}
### query(hash key only query - column * 10) ###
{
"TableName": "SampleTable",
"CapacityUnits": 122.5,
"Table": {
"CapacityUnits": 122.5
}
}
}}
ドキュメントにも書いてある。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html#ItemSizeCalculations.Reads
#html(<div style="padding:0 10px;border:1px solid #333;background:#eeffee;">)
# ドキュメントより抜粋 #
項目を返すオペレーションの場合、取り出す属性の一部をリクエストできます。ただし、項目サイズの計算には影響を及ぼしません。
#html(</div>)
あと、検索結果が0件の場合も、キャパシティユニットが消費される模様。
#html(<div style="padding:0 10px;border:1px solid #333; background:#eeffee;">)
# ドキュメントより抜粋 #
存在しない項目に対して読み込みオペレーションを実行しても、DynamoDB ではやはりプロビジョンド読み込みスループットが消費されます。
強力な整合性のある読み込みオペレーションでは、1 つの読み込みキャパシティーユニットが消費されますが、
結果整合性のある読み込みオペレーションでは、半分の読み込みキャパシティーユニットが消費されます。
#html(</div>)
ただし、queryで複数件を一度に取得した時は1レコード毎に切り上げられず、
合計サイズでキャパシティユニットが計算されるので、少しお得。
#html(<div style="padding:0 10px;border:1px solid #333; background:#eeffee;">)
# ドキュメントより抜粋 #
Query - 同じパーティションキー値を持つ複数の項目を読み取ります。
返されるすべての項目は単一の読み取りオペレーションとして扱われ、DynamoDB はすべての項目の合計サイズを計算し、次の 4 KB 境界に切り上げます。
#html(</div>)
#html(</div>)