Cosmos DB Continuation Token nasıl çalışır?

Aug 17 2020

İlk bakışta, Cosmos DB'de devam belirtecinin ne yaptığı açıktır: Bir sonraki sorguya eklemek size bir sonraki sonuç kümesini verir. Ama "sonraki sonuç kümesi" tam olarak ne anlama geliyor?

Anlamında mı:

  1. İlk sorgu sırasında (uygun sayıda belge atlanarak) orijinal sorgu sayfalandırılmadan tamamen yürütülmüş gibi bir sonraki sonuç kümesi?
  2. sonraki sonuç grubu, sanki orijinal sorgu şimdi çalıştırılmış gibi (uygun sayıda belge atlanarak)?
  3. Tamamen farklı bir şey mi?

Cevap 1. tercih edilebilir görünebilir, ancak sunucunun sınırsız miktarda durum depolaması gerekeceği düşünüldüğünde olası değildir. Ancak Cevap 2, tutarsızlıklara neden olabileceğinden de sorunludur, örneğin, temel veriler sayfa sorguları arasında değişmişse, aynı belge sayfalar arasında birden çok kez sunulabilir.

Yanıtlar

2 KalyanChanumolu-MSFT Aug 21 2020 at 13:51

Cosmos DB sorgu yürütmeleri sunucu tarafında durumsuzdur. Devam belirteci, dizinin durumunu yeniden oluşturmak ve yürütmenin ilerlemesini izlemek için kullanılır.

"Sonraki sonuç grubu", sorgunun önceki yürütmeden bir "yer işaretinden" yeniden yürütüldüğü anlamına gelir. Bu yer imi, devam belirteci tarafından sağlanır.

  1. Sürdürmeler sırasında oluşturulan belgeler

Ekleme ve yürütülen sorgunun konumuna bağlı olarak iade edilebilir veya döndürülmeyebilirler.

Misal:

SEÇİN * c SİPARİŞ c.someValue ASC

Yer işaretinin birazDeğer = 10 olduğunu varsayalım, sorgu motoru bazıDeğer = 10 olan bir devam belirteci kullanarak işlemeye devam eder.

Sorgu yürütme işlemleri arasına someValue = 5 olan yeni bir belge eklerseniz , sonraki sonuç kümesinde görünmeyecektir .

Yeni belge yer imi olan bir "sayfaya" eklenirse, sonraki sonuç kümesinde görünecektir .

  1. Devam etme sırasında güncellenen belgeler

Yukarıdaki ile aynı mantık güncellemeler için de geçerlidir (Bkz. # 4)

  1. Devam etme sırasında silinen belgeler

Onlar görünmez sonuçlarında sonraki sette.

  1. Yineleme şansı

Aşağıdaki sorgu durumunda,

C.remainingInventory ASC TARAFINDAN SEÇİN *

Kalan Envanter ilk sonuç kümesinden sonra güncellendiyse ve şimdi ikinci sayfanın ORDER BY ölçütlerini karşılıyorsa, belge yeniden görünecektir .


Cosmos DB, sorgu sayfalarında anlık görüntü yalıtımı sağlamaz. Bununla birlikte, ürün ekibine göre bu inanılmaz derecede nadir bir senaryodur çünkü devam ettirmelerle ilgili sorgular çok hızlıdır ve çoğu durumda tüm sorgu sonuçları ilk sayfada döndürülür.

MoB. Aug 24 2020 at 09:10

Ön deneylere dayanarak, cevap 2 numaralı seçenek gibi görünüyor veya daha doğrusu:

  1. İlk sayfa sunulduktan sonra oluşturulan belgeler sonraki sayfalarda gözlemlenebilir
  2. İlk sayfa sunulduktan sonra güncellenen dokümanlar sonraki sayfalarda gözlemlenebilir.
  3. İlk sayfa sunulduktan sonra silinen belgeler sonraki sayfalarda atlanır
  4. Belgeler asla iki kez sunulmaz

Yukarıdaki ilk ifade, MSFT'den gelen bilgilerle çelişiyor ( bkz. Kalyan'ın cevabı). Cosmos DB Ekibinden sayfaları geri getirmenin anlamını tam olarak belirterek daha nitelikli bir yanıt almak harika olurdu. Bu, kullanıcı arayüzünde veri görüntülemek için çok önemli olmayabilir, ancak bir sorgu gerçekleştirirken sayfalamayı devre dışı bırakmanın herhangi bir yolu olmadığı göz önüne alındığında, arka uçta veri işleme için gerekli olabilir ( bkz. İşlem sorgularında mümkün mü Cosmos DB? ).


Deneysel yöntem

5 belge içeren bir koleksiyonu sorgulamak için Sacha Bruttin's Cosmos DB Explorer'ı kullandım, çünkü bu araç sayfa boyutu ve diğer istek seçenekleriyle oynamaya izin veriyor.

Sayfa boyutu 1 olarak ayarlandı ve Çapraz Bölüm Sorguları etkinleştirildi. Farklı sorgular denendi, örn. SELECT * FROM cVeya SELECT * FROM c ORDER BY c.name.

1. sayfayı aldıktan sonra, yeni belgeler eklendi ve bazı mevcut belgeler (sonraki sayfalarda görünmesi gereken belgeler dahil) güncellenmiş ve silindi. Ardından, sonraki tüm sayfalar sırayla alındı.

(Aracın kaynak koduna hızlı bir bakış ResponseContinuationTokenLimitInKbbunun ayarlanmadığını doğruladı .)