Cosmos DB Continuation Token nasıl çalışır?
İ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ı:
- İ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?
- sonraki sonuç grubu, sanki orijinal sorgu şimdi çalıştırılmış gibi (uygun sayıda belge atlanarak)?
- 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
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.
- 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 .
- Devam etme sırasında güncellenen belgeler
Yukarıdaki ile aynı mantık güncellemeler için de geçerlidir (Bkz. # 4)
- Devam etme sırasında silinen belgeler
Onlar görünmez sonuçlarında sonraki sette.
- 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.
Ön deneylere dayanarak, cevap 2 numaralı seçenek gibi görünüyor veya daha doğrusu:
- İlk sayfa sunulduktan sonra oluşturulan belgeler sonraki sayfalarda gözlemlenebilir
- İlk sayfa sunulduktan sonra güncellenen dokümanlar sonraki sayfalarda gözlemlenebilir.
- İlk sayfa sunulduktan sonra silinen belgeler sonraki sayfalarda atlanır
- 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 c
Veya 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ış ResponseContinuationTokenLimitInKb
bunun ayarlanmadığını doğruladı .)