Hi,

Right. a database is divided into Q shards, each of which covers part of a 
numeric range from 0 to 2^32-1, the doc id is run through a hashing function 
that outputs a number in that range, and the document is then stored inside the 
shard whose range contains that number.

as this effectively randomises which doc goes in which shard when we need to 
perform a query across the database we need to ask each shard range to perform 
the query and then combine the results.

This is good in some ways (the shards can be stored across multiple machines 
and thus benefit from more cores/disks/memory/etc) it's bad in others, the 
number of workers that need to respond goes up as Q goes up.

"Partition" is just our word (and arguably a misleading word) for allowing 
users to control which shard range their documents end up in. Only part of the 
doc id is passed through the hashing function(doc id "foo:bar" would be 
partition foo, and we'd hash only "foo"). Thus the user can ensure that a group 
of documents lands in the same shard range. The benefit is as Nick described, 
when querying _within_ a given partition we know that only one shard range is 
in play, so we do not consult shards for other ranges (we already know they 
will have no results).

So, to your specific list of questions;

- yes
- yes, but the reason to keep partitions small is because of the fixed 
assignment to a given shard range. the default scheme would load up each shard 
range fairly evenly. it's about disk space management and predictable 
performance.
- when querying a global view we need Q responses (and will issue Q*N requests, 
but cancel Q*(N-1) of those when the first response from each range has been 
received, though they may have already done some, or all, of their work, before 
that happens). for a partitioned view we need 1 response (but will issue N 
requests).
- quorum applies to document operations (read, write, delete), but not view 
queries (R is inherently 1)

B.

> On 13 Jun 2024, at 09:01, Matthieu Rakotojaona 
> <matthieu.rakotojaona-rainimangav...@imt-atlantique.fr> wrote:
> 
> Hello, I'm still a bit confused with shards versus partitions, is this 
> correct ?
> 
> - A database is composed of Q shards, shards splice the database 
> "automatically"
> 
> - A shard is composed of 1 or more partitions, partitions splice the database 
> according to the user's choice. A partition should thus be made so that it is 
> not huge, in fact must be under (total size/Q)
> 
> - When querying a view, the whole database needs to be processed, that means 
> all Q shards
> 
> - When querying a view only on documents inside a partition, since one 
> partition is on 1 shard, only one shard is queried
> 
> - Whatever the number of shards, quorum still needs to be verified, ie for 
> Q=2 and N=3 I still need to wait for (3+1)/2 = 2 replies for each shard
> 
> On 12/06/2024 19:54, Nick Vatamaniuc wrote:
>> Another feature related to efficient view querying are partitioned
>> databases: https://docs.couchdb.org/en/stable/partitioned-dbs/index.html.
>> It's a bit of a niche, as you'd need to have a good partition key, but
>> aside from that, it can speed up your queries as responses would be coming
>> from a single shard only instead of Q shards.
>> 
>> 
>> 
>> On Wed, Jun 12, 2024 at 1:30 PM Markus Doppelbauer
>> <doppelba...@gmx.net.invalid> wrote:
>> 
>>> Hi Nick,
>>> Thank you very much for your reply.This is exactly what we are looking
>>> for.There are so many DBs that store the secondary indexlocally
>>> (Cassandra, Aerospike, SyllaDB, ...)
>>> Thanks again for the answerMarcus
>>> 
>>> 
>>> Am Mittwoch, dem 12.06.2024 um 13:23 -0400 schrieb Nick Vatamaniuc:
>>>> Hi Marcus,
>>>> The node handling the request only queries the nodes with shard
>>>> copies ofthat database. In a 100 node cluster the shards for that
>>>> particulardatabase might be present on only 6 nodes, depending on the
>>>> Q and Nsharding factors, so it will query 6 out 100 nodes. For
>>>> instance, for N=3and Q=2 sharding factors, it will first send N*Q=6
>>>> requests, and wait untilit gets at least one response for each of the
>>>> Q=2 shard ranges. Thishappens very quickly. Then, for the duration of
>>>> the response, it will onlystream responses from those Q=2 workers.
>>>> So, to summarize for a Q=2database, it will be a streaming response
>>>> from 2 workers. For Q=4, from 4workers, etc...
>>>> Cheers,-Nick
>>>> 
>>>> On Wed, Jun 12, 2024 at 1:00 PM Markus Doppelbauer<
>>>> doppelba...@gmx.net.invalid> wrote:
>>>>> Hello,
>>>>> Is the CouchDB-view a "global" or "local" index?For example, if a
>>>>> cluster has 100 nodes, would the query askfor a single node - or
>>>>> 100 nodes?
>>>>> /.../_view/posts?startkey="foobar"&endkey="foobaz"
>>>>> Best wishesMarcus
>>>>> 

Reply via email to