2012-05-27 4 views

Répondre

2

Il n'y a pas vraiment beaucoup d'alternatives. Si l'attribut que vous recherchez n'est pas le nom de l'élément, votre seule alternative est l'utilisation d'un select. Il y a deux approches possibles. Tout d'abord en utilisant le nombre (*)

select count(*) from DomainX where AttributeY='ZValue' 

Ou, en utilisant itemName() qui peut avoir des avantages supplémentaires si vous souhaitez récupérer l'élément après avoir vérifié l'existence (bien que vous auriez probablement juste select * dans ce cas).

select itemName() from DomainX where AttributeY='ZValue' 

De plus, il y a la possibilité d'utiliser la limite

select ..... limit 1 

Heureusement Amazon fournit une indication quant à ce qui est par la valeur BoxUsage le plus cher retourné par chaque opération SimpleDB. J'ai écrit un petit script pour exécuter chacune des 4 alternatives 25 fois (en tenant compte de l'échauffement de la bibliothèque) et comparer le timing et le BoxUsage pour chacun. Le domaine utilisé contenait environ 4500 éléments avec 4 attributs chacun.

Mon premier passage utilisait un seul prédicat where-clause qui correspondait à plusieurs éléments (11 éléments).

Type of Query     | Avg time(s) | Avg BoxUsage 
------------------------------------------------------------ 
count(*) without limit  | 0,092  | 0,0000229400 
count(*) with limit 1   | 0,092  | 0,0000228616 
itemName() without limit  | 0,092  | 0,0000140880 
itemName() with limit 1  | 0,090  | 0,0000140080 

Ma deuxième passe utilisé un seul prédicat clause where qui correspondait à un seul élément

Type of Query     | Avg time(s) | Avg BoxUsage 
------------------------------------------------------------ 
count(*) without limit  | 0,090  | 0,0000140080 
count(*) with limit 1   | 0,091  | 0,0000140080 
itemName() without limit  | 0,090  | 0,0000140080 
itemName() with limit 1  | 0,093  | 0,0000140080 

Le temps moyen est pas statistiquement significative depuis et probablement pas tout ce que je fiable réalisé les tests de mon DSL à la maison. Il aurait été plus approprié de tester à partir d'une instance EC2.

Le BoxUsage est cependant intéressant. Suggérer que itemName() est meilleur que count (*) bien que vous deviez prendre en considération si votre requête correspondrait à beaucoup d'éléments (des centaines), auquel cas vous auriez la surcharge du transfert de données dans itemName() cas, mais ce serait moins cher BoxUsage sage. Que l'utilisation de la limite n'affecte pas grandement le BoxUsage n'est pas tout à fait surprenant car il est destiné à la pagination, ce qui signifie que vous pouvez continuer à récupérer plus de résultats en répétant la requête en utilisant le NextMarker.

Si j'où mettre en œuvre une opération Exists() générique au-dessus de SimpleDB, je serais probablement aller avec

select itemName() from X where Y='Z' limit 1 

Si la performance/coût est sensible, vous devez effectuer theese Vous-même dans votre environnement.