Azure Cosmos DB'de dizin oluşturma ilkeleri

UYGULANANLAR: NoSQL

Azure Cosmos DB'de her kapsayıcının bir dizin oluşturma ilkesi vardır ve bu ilke kapsayıcıdaki öğelerin nasıl dizine alınacağını belirler. Yeni oluşturulan kapsayıcıların varsayılan dizin oluşturma ilkesi tüm öğelerin tüm özelliklerini dizine alır ve tüm dizeler veya sayılar için aralık dizinlerini zorunlu tutar. Bu sayede önceden dizin oluşturmayı ve dizin yönetimini düşünmek zorunda kalmadan iyi bir sorgu performansı elde edebilirsiniz.

Bazı durumlarda, gereksinimlerinize daha uygun olması için bu otomatik davranışı geçersiz kılmak isteyebilirsiniz. Dizin oluşturma modunu ayarlayarak ve özellik yollarını dahil ederek veya hariç tutarak kapsayıcının dizin oluşturma ilkesini özelleştirebilirsiniz.

Not

Bu makalede açıklanan dizin oluşturma ilkelerini güncelleştirme yöntemi yalnızca NoSQL için Azure Cosmos DB API'sinde geçerlidir. MongoDB için Azure Cosmos DB API'sinde dizin oluşturma hakkında bilgi edinin

Dizin oluşturma modu

Azure Cosmos DB iki dizin oluşturma modunu destekler:

  • Tutarlı: Siz öğeleri oluştururken, güncelleştirirken veya silerken dizin zaman uyumlu olarak güncelleştirilir. Bu, okuma sorgularınızın tutarlılığının hesap için yapılandırılan tutarlılık olacağı anlamına gelir.
  • Hiçbiri: Kapsayıcıda dizin oluşturma devre dışı bırakıldı. Bu mod genellikle bir kapsayıcı ikincil dizinlere gerek kalmadan saf anahtar-değer deposu olarak kullanıldığında kullanılır. Toplu işlemlerin performansını geliştirmek için de kullanılabilir. Toplu işlemler tamamlandıktan sonra dizin modu Tutarlı olarak ayarlanabilir ve tamamlanana kadar IndexTransformationProgress kullanılarak izlenebilir.

Not

Azure Cosmos DB, Gecikmeli dizin oluşturma modunu da destekler. Gecikmeli dizinde, dizin güncelleştirmeleri altyapıda hiçbir çalışma yapılmadığı sırada çok daha düşük öncelik düzeyinde gerçekleştirilir. Bu tutarsız veya eksik sorgu sonuçlarına yol açabilir. Azure Cosmos DB kapsayıcısını sorgulamayı planlıyorsanız gecikmeli dizin oluşturmayı seçmemelisiniz. Yeni kapsayıcılar gecikmeli dizin oluşturmayı seçemez. İletişim kurarak cosmosdbindexing@microsoft.com muafiyet isteyebilirsiniz (gecikmeli dizin oluşturmayı desteklemeyen sunucusuz modda bir Azure Cosmos DB hesabı kullanıyorsanız hariç).

Dizin oluşturma ilkesi varsayılan olarak olarak automaticayarlanır. Dizin oluşturma ilkesindeki automatic özelliği olarak trueayarlanarak elde edilir. Bu özelliğin olarak true ayarlanması, Azure Cosmos DB'nin yazıldıklarında öğeleri otomatik olarak dizine eklemesine olanak tanır.

Dizin boyutu

Azure Cosmos DB'de toplam tüketilen depolama alanı hem Veri boyutu hem de Dizin boyutunun birleşimidir. Dizin boyutunun bazı özellikleri şunlardır:

  • Dizin boyutu dizin oluşturma ilkesine bağlıdır. Tüm özellikler dizine eklendiyse, dizin boyutu veri boyutundan daha büyük olabilir.
  • Veriler silindiğinde dizinler neredeyse sürekli olarak sıkıştırılır. Ancak, küçük veri silme işlemleri için dizin boyutunun hemen azalmasını gözlemlemeyebilirsiniz.
  • Fiziksel bölümler bölündüğünde Dizin boyutu geçici olarak büyüyebilir. Bölüm bölme tamamlandıktan sonra dizin alanı serbest bırakılır.

Özellik yollarını dahil etme ve hariç tutma

Özel dizin oluşturma ilkesi, dizin oluşturmanın açıkça dahil edilen veya dışında tutulan özellik yollarını belirtebilir. Dizine alınan yol sayısını iyileştirerek yazma işlemlerinin gecikme süresini ve RU ücretini önemli ölçüde azaltabilirsiniz. Bu yollar, dizin oluşturma genel bakış bölümünde açıklanan yöntemin ardından aşağıdaki eklemelerle tanımlanır:

  • skaler değere (dize veya sayı) giden bir yol ile biter /?
  • dizideki öğeler, gösterimi aracılığıyla /[] (vb. yerine/0/1) birlikte ele alınır.
  • joker karakter, düğümün /* altındaki öğelerle eşleştirmek için kullanılabilir

Aynı örneği tekrar ele alıyoruz:

    {
        "locations": [
            { "country": "Germany", "city": "Berlin" },
            { "country": "France", "city": "Paris" }
        ],
        "headquarters": { "country": "Belgium", "employees": 250 },
        "exports": [
            { "city": "Moscow" },
            { "city": "Athens" }
        ]
    }
  • ' headquartersnin employees yolu şudur: /headquarters/employees/?

  • locations' country yolu/locations/[]/country/?

  • altındaki headquarters herhangi bir şeyin yolu /headquarters/*

Örneğin, yolu dahil /headquarters/employees/? edebiliriz. Bu yol özelliği dizine employees almamızı sağlar ancak bu özellik içinde fazladan iç içe JSON dizini oluşturmaz.

Ekleme/hariç tutma stratejisi

Dizin oluşturma ilkelerinin kök yolu /* eklenen veya dışlanan bir yol olarak içermesi gerekir.

  • Dizine alınması gerekmeyen yolları seçmeli olarak dışlamak için kök yolu ekleyin. Azure Cosmos DB'nin modelinize eklenebilen tüm yeni özellikleri proaktif olarak dizine eklemesine olanak tanıyan bu yaklaşım önerilir.

  • Dizine alınması gereken yolları seçmeli olarak eklemek için kök yolu hariç tutun. Bölüm anahtarı özellik yolu varsayılan olarak dışlama stratejisiyle dizine alınmaz ve gerekirse açıkça dahil edilmelidir.

  • Alfasayısal karakterler ve _ (alt çizgi) gibi normal karakterler içeren yollar için, yol dizesini çift tırnak (örneğin, "/path/?"). Diğer özel karakterlere sahip yollar için, yol dizesini çift tırnak içine almanız gerekir (örneğin, "/"path-abc"/?"). Yolunuzda özel karakterler bekliyorsanız, güvenlik için her yoldan kaçabilirsiniz. İşlevsel olarak, her yoldan veya yalnızca özel karakterlere sahip olanlardan kaçış yapmanız fark etmez.

  • Etag dizin oluşturma için eklenen yola eklenmediği sürece sistem özelliği _etag varsayılan olarak dizin oluşturmanın dışında tutulur.

  • Dizin oluşturma modu tutarlı olarak ayarlanırsa, sistem özellikleri id ve _ts otomatik olarak dizine eklenir.

  • Açıkça dizine alınmış bir yol bir öğede yoksa, yolun tanımsız olduğunu belirtmek için dizine bir değer eklenir.

Açıkça eklenen tüm yollar, belirli bir öğe için tanımlanmamış olsa bile kapsayıcıdaki her öğe için dizine değerler eklenir.

Yolları dahil etme ve dışlama için dizin oluşturma ilkesi örnekleri için bu bölüme bakın.

Önceliği dahil et/hariç tut

Dahil edilen yollarınızla dışlanan yollarınızın çakışması varsa, daha kesin yol önceliklidir.

Bir örnek aşağıda verilmiştir:

Eklenen Yol: /food/ingredients/nutrition/*

Dışlanan Yol: /food/ingredients/*

Bu durumda, dahil edilen yol, daha kesin olduğundan dışlanan yoldan önceliklidir. Bu yollara bağlı olarak, yolundaki food/ingredients veya içinde iç içe yerleştirilmiş tüm veriler dizinden dışlanır. Özel durum, dahil edilen yol içindeki veriler olabilir: /food/ingredients/nutrition/*, dizine alınır.

Azure Cosmos DB'de dahil edilen ve dışlanan yol önceliği için bazı kurallar aşağıda verilmiştir:

  • Daha derin yollar, dar yollara göre daha kesindir. örneğin: /a/b/? değerinden daha /a/?kesindir.

  • , /? değerinden daha /*kesindir. Örneğin /a/? , öncelik aldığından daha /a/* /a/? kesindir.

  • Yol /* , eklenen veya dışlanan bir yol olmalıdır.

Vektör dizinleri

Not

Vektör dizin oluşturma ilkesi belirtmek için Azure Cosmos DB NoSQL Vektör Dizini önizleme özelliğine kaydolmanız gerekir.>

Vektör dizinleri, sistem işlevini kullanarak VectorDistance vektör aramaları yaparken verimliliği artırır. Vektör dizini uygulanırken vektör aramaları daha düşük gecikme süresine, daha yüksek aktarım hızına ve daha az RU tüketimine sahiptir. Aşağıdaki vektör dizin ilkesi türlerini belirtebilirsiniz:

Type Açıklama Maksimum boyutlar
flat Vektörleri diğer dizine alınan özelliklerle aynı dizinde depolar. 505
quantizedFlat Dizinde depolamadan önce vektörleri niceleştirir (sıkıştırır). Bu, az miktarda doğruluk karşılığında gecikme süresini ve aktarım hızını iyileştirebilir. 4096
diskANN Hızlı ve verimli yaklaşık arama için DiskANN tabanlı bir dizin oluşturur. 4096

Dikkate almak için birkaç nokta:

  • ve quantizedFlat dizin türleri, flat vektör araması yaparken her vektöri depolamak ve okumak için Azure Cosmos DB'nin dizinini uygular. Dizin içeren flat vektör aramaları deneme yanılma aramalarıdır ve %100 doğruluk veya geri çekme üretir. Başka bir ifadeyle, veri kümesindeki en benzer vektörleri bulmak garanti edilir. Ancak düz bir dizindeki vektörler için boyut sınırlaması 505 vardır.

  • Dizin, quantizedFlat dizinde nicelenmiş (sıkıştırılmış) vektörleri depolar. Dizinli quantizedFlat vektör aramaları da deneme yanılma aramalarıdır, ancak vektörler dizine eklemeden önce ölçüleceğinden doğrulukları %100'ün biraz altında olabilir. Ancak, ile quantized flat vektör aramalarının dizindeki flat vektör aramalarına göre daha düşük gecikme süresi, daha yüksek aktarım hızı ve daha düşük RU maliyeti olmalıdır. Bu, vektör aramasını görece küçük bir vektör kümesine daraltmak için sorgu filtrelerini kullandığınız ve yüksek doğruluk gerektiren senaryolar için iyi bir seçenektir.

  • DizindiskANN, Microsoft Research tarafından geliştirilen yüksek performanslı vektör dizinleme algoritmaları paketi olan DiskANN uygulayan vektörler için özel olarak tanımlanan ayrı bir dizindir. DiskANN dizinleri en düşük gecikme süresi, en yüksek aktarım hızı ve en düşük RU maliyeti sorgularından bazılarını sunarken yüksek doğruluğu korumaya devam edebilir. Ancak, DiskANN yaklaşık en yakın komşular (ANN) dizini olduğundan doğruluk veya flatdeğerinden quantizedFlat düşük olabilir.

Aşağıda vektör dizinine sahip bir dizin oluşturma ilkesi örneği verilmişti:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?",
        },
        {
            "path": "/vector/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector",
            "type": "diskANN"
        }
    ]
}

Önemli

Vektör dizin oluşturma ilkesi, kapsayıcının vektör ilkesinde tanımlanan yolda olmalıdır. Kapsayıcı vektör ilkeleri hakkında daha fazla bilgi edinin. Vektör dizinleri de Kapsayıcı oluşturma sırasında tanımlanmalıdır ve oluşturulduktan sonra değiştirilemez. Gelecek bir sürümde vektör dizinleri değiştirilebilir olacak.

Önemli

Ekleme için iyileştirilmiş performans sağlamak için dizin oluşturma ilkesinin "excludedPaths" bölümüne eklenen vektör yolu. "excludedPaths" öğesine vektör yolu eklenmemesi, vektör eklemeleri için daha yüksek RU ücreti ve gecikme süresine neden olur.

Uzamsal dizinler

Dizin oluşturma ilkesinde uzamsal bir yol tanımladığınızda, bu yola hangi dizinin type uygulanacağını tanımlamanız gerekir. Uzamsal dizinler için olası türler şunlardır:

  • Nokta

  • Poligon

  • MultiPolygon

  • LineString

Azure Cosmos DB varsayılan olarak herhangi bir uzamsal dizin oluşturmaz. Uzamsal SQL yerleşik işlevlerini kullanmak istiyorsanız, gerekli özelliklerde uzamsal dizin oluşturmanız gerekir. Uzamsal dizinler eklemeye yönelik dizin oluşturma ilkesi örnekleri için bu bölüme bakın.

Bileşik dizinler

İki veya daha fazla özelliğe sahip yan ORDER BY tümcesine sahip sorgular bileşik dizin gerektirir. Ayrıca, birçok eşitlik ve aralık sorgusunun performansını artırmak için bileşik dizin de tanımlayabilirsiniz. Varsayılan olarak bileşik dizin tanımlanmadığından, gerektiğinde bileşik dizinler eklemeniz gerekir.

Eklenen veya dışlanan yollardan farklı olarak, joker karakterle /* yol oluşturamazsınız. Her bileşik yolun sonunda, belirtmeniz gerekmeyen örtük /? bir yol vardır. Bileşik yollar, bileşik dizinde yer alan tek değer olan bir skaler değere yol açar. Bileşik dizindeki bir yol bir öğede yoksa veya büyük harf olmayan bir değere yol açıyorsa, yolun tanımsız olduğunu belirtmek için dizine bir değer eklenir.

Bileşik dizin tanımlarken şunları belirtirsiniz:

  • İki veya daha fazla özellik yolu. Özellik yollarının tanımlandığı sıra önemlidir.

  • Sıra (artan veya azalan).

Not

Bileşik dizin eklediğinizde, yeni bileşik dizin ekleme işlemi tamamlanana kadar sorgu mevcut aralık dizinlerini kullanır. Bu nedenle, bileşik dizin eklediğinizde performans iyileştirmelerini hemen gözlemlemeyebilirsiniz. SDK'lardan birini kullanarak dizin dönüştürme işleminin ilerleme durumunu izlemek mümkündür.

Birden çok özellik üzerinde ORDER BY sorguları:

İki veya daha fazla özelliğe sahip yan ORDER BY tümcesi olan sorgular için bileşik dizinler kullanılırken aşağıdaki noktalar kullanılır:

  • Bileşik dizin yolları yan tümcesindeki ORDER BY özelliklerin dizisiyle eşleşmiyorsa bileşik dizin sorguyu destekleyemez.

  • Bileşik dizin yollarının sırası (artan veya azalan) yan tümcesindekiyle order ORDER BY de eşleşmelidir.

  • Bileşik dizin, tüm yollarda karşıt sırada olan bir ORDER BY yan tümceyi de destekler.

Bileşik dizinin özellik adı, yaşı ve _ts üzerinde tanımlandığı aşağıdaki örneği göz önünde bulundurun:

Bileşik dizin Örnek ORDER BY Sorgu Bileşik dizin desteği
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name ASC, c.age asc Yes
(name ASC, age ASC) SELECT * FROM c ORDER BY c.age ASC, c.name asc No
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name DESC, c.age DESC Yes
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name ASC, c.age DESC No
(name ASC, age ASC, timestamp ASC) SELECT * FROM c ORDER BY c.name ASC, c.age ASC, timestamp ASC Yes
(name ASC, age ASC, timestamp ASC) SELECT * FROM c ORDER BY c.name ASC, c.age ASC No

Tüm gerekli ORDER BY sorgulara hizmet verebilmeniz için dizin oluşturma ilkenizi özelleştirmeniz gerekir.

Birden fazla özelliğinde filtreler olan sorgular

Bir sorguda iki veya daha fazla özellik üzerinde filtreler varsa, bu özellikler için bileşik dizin oluşturmak yararlı olabilir.

Örneğin, hem eşitlik hem de aralık filtresi olan aşağıdaki sorguyu göz önünde bulundurun:

SELECT *
FROM c
WHERE c.name = "John" AND c.age > 18

Bu sorgu, üzerinde (name ASC, age ASC)bileşik dizin uygulayabiliyorsa daha az zaman alan ve daha az RU tüketen daha verimlidir.

Birden çok aralık filtresi olan sorgular bileşik dizinle de iyileştirilebilir. Ancak, tek tek her bileşik dizin yalnızca tek bir aralık filtresini iyileştirebilir. Aralık filtreleri , , <<=, >=ve !=filtrelerini içerir>. Aralık filtresi bileşik dizinde en son tanımlanmalıdır.

Bir eşitlik filtresi ve iki aralık filtresi ile aşağıdaki sorguyu göz önünde bulundurun:

SELECT *
FROM c
WHERE c.name = "John" AND c.age > 18 AND c._ts > 1612212188

Bu sorgu ve (name ASC, _ts ASC)üzerindeki (name ASC, age ASC) bileşik dizinle daha verimlidir. Ancak, eşitlik filtrelerine sahip özelliklerin önce bileşik dizinde (age ASC, name ASC) tanımlanması gerektiğinden, sorgu üzerinde bileşik dizin kullanmaz. Her bileşik dizin yalnızca tek bir aralık filtresini iyileştirebildiğinden, üzerinde (name ASC, age ASC, _ts ASC) tek bir bileşik dizin yerine iki ayrı bileşik dizin gereklidir.

Birden çok özellik üzerinde filtre içeren sorgular için bileşik dizinler oluşturulurken aşağıdaki noktalar kullanılır

  • Filtre ifadeleri birden çok bileşik dizin kullanabilir.
  • Sorgunun filtresindeki özellikler bileşik dizindeki özelliklerle eşleşmelidir. Bir özellik bileşik dizindeyse ancak sorguya filtre olarak dahil değilse, sorgu bileşik dizini kullanmaz.
  • Bir sorgu, filtrede bileşik dizinde tanımlanmayan başka özelliklere sahipse, sorguyu değerlendirmek için bileşik ve aralık dizinlerinin birleşimi kullanılır. Bunun için yalnızca aralık dizinlerini kullanmaktan daha az RU gerekir.
  • Bir özelliğin aralık filtresi (>, <, <=, >=veya !=) varsa, bu özellik bileşik dizinde en son tanımlanmalıdır. Bir sorguda birden fazla aralık filtresi varsa, birden çok bileşik dizinden yararlanabilir.
  • Birden çok filtre içeren sorguları iyileştirmek için bileşik dizin oluştururken bileşik ORDER dizinin sonuçları etkilemez. Bu özellik isteğe bağlıdır.

Bileşik dizinin özellik adı, yaşı ve zaman damgası üzerinde tanımlandığı aşağıdaki örnekleri göz önünde bulundurun:

Bileşik dizin Örnek Sorgu Bileşik dizin desteği
(name ASC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age = 18 Yes
(name ASC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name ASC, age ASC) SELECT COUNT(1) FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name DESC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name ASC, age ASC) SELECT * FROM c WHERE c.name != "John" AND c.age > 18 No
(name ASC, age ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.age = 18 AND c.timestamp > 123049923 Yes
(name ASC, age ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.age < 18 AND c.timestamp = 123049923 No
(name ASC, age ASC) and (name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.age < 18 AND c.timestamp > 123049923 Yes

Filtre ve ORDER BY içeren sorgular

Sorgu bir veya daha fazla özelliğe filtre uygulamışsa ve ORDER BY yan tümcesinde farklı özelliklere sahipse, filtredeki özellikleri yan tümcesine ORDER BY eklemek yararlı olabilir.

Örneğin, filtredeki özellikleri yan tümcesine ORDER BY ekleyerek bileşik dizin uygulamak için aşağıdaki sorgu yeniden yazılabilir:

Aralık dizinini kullanarak sorgula:

SELECT *
FROM c 
WHERE c.name = "John" 
ORDER BY c.timestamp

Bileşik dizin kullanarak sorgu:

SELECT * 
FROM c 
WHERE c.name = "John"
ORDER BY c.name, c.timestamp

Aynı sorgu iyileştirmeleri, filtrelere sahip tüm ORDER BY sorgular için genelleştirilebilir ve tek tek bileşik dizinlerin en fazla bir aralık filtresini destekleyebileceğinizi unutmayın.

Aralık dizinini kullanarak sorgula:

SELECT * 
FROM c 
WHERE c.name = "John" AND c.age = 18 AND c.timestamp > 1611947901 
ORDER BY c.timestamp

Bileşik dizin kullanarak sorgu:

SELECT * 
FROM c 
WHERE c.name = "John" AND c.age = 18 AND c.timestamp > 1611947901 
ORDER BY c.name, c.age, c.timestamp

Ayrıca, sistem işlevleri ve ORDER BY ile sorguları iyileştirmek için bileşik dizinleri kullanabilirsiniz:

Aralık dizinini kullanarak sorgula:

SELECT * 
FROM c 
WHERE c.firstName = "John" AND Contains(c.lastName, "Smith", true) 
ORDER BY c.lastName

Bileşik dizin kullanarak sorgu:

SELECT * 
FROM c 
WHERE c.firstName = "John" AND Contains(c.lastName, "Smith", true) 
ORDER BY c.firstName, c.lastName

Filtre ve ORDER BY yan tümcesi olan bir sorguyu iyileştirmek için bileşik dizinler oluştururken aşağıdaki noktalar geçerlidir:

  • Bir özellikte filtre ve farklı bir özellik kullanan ayrı ORDER BY bir yan tümcesi olan bir sorguda bileşik dizin tanımlamazsanız, sorgu yine başarılı olur. Ancak, özellikle yan tümcesindeki özelliğin yüksek kardinalitesi varsa, sorgunun ORDER BY RU maliyeti bileşik dizinle azaltılabilir.
  • Sorgu özelliklere göre filtrelenirse, bu özellikler ilk olarak yan tümcesine ORDER BY dahil edilmelidir.
  • Sorgu birden çok özelliğe filtre eklerse, eşitlik filtreleri yan tümcesindeki ilk özellikler ORDER BY olmalıdır.
  • Sorgu birden çok özelliğe göre filtrelenirse bileşik dizin başına en fazla bir aralık filtresi veya sistem işlevi kullanılabilir. Aralık filtresinde veya sistem işlevinde kullanılan özellik en son bileşik dizinde tanımlanmalıdır.
  • Birden çok özelliğe sahip sorgular ve birden çok özellik üzerinde filtre içeren sorgular için ORDER BY bileşik dizinler oluşturmaya yönelik tüm önemli noktalar yine de geçerlidir.
Bileşik dizin Örnek ORDER BY Sorgu Bileşik dizin desteği
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.name ASC, c.timestamp ASC Yes
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.timestamp > 1589840355 ORDER BY c.name ASC, c.timestamp ASC Yes
(timestamp ASC, name ASC) SELECT * FROM c WHERE c.timestamp > 1589840355 AND c.name = "John" ORDER BY c.timestamp ASC, c.name ASC No
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.timestamp ASC, c.name ASC No
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.timestamp ASC No
(age ASC, name ASC, timestamp ASC) SELECT * FROM c WHERE c.age = 18 and c.name = "John" ORDER BY c.age ASC, c.name ASC,c.timestamp ASC Yes
(age ASC, name ASC, timestamp ASC) SELECT * FROM c WHERE c.age = 18 and c.name = "John" ORDER BY c.timestamp ASC No

Filtre ve toplama içeren sorgular

Bir sorgu bir veya daha fazla özelliğe filtre uygulamışsa ve toplam sistem işlevine sahipse, filtre ve toplama sistemi işlevindeki özellikler için bileşik dizin oluşturmak yararlı olabilir. Bu iyileştirme SUM ve AVG sistem işlevleri için geçerlidir.

Filtre ve toplama sistem işleviyle bir sorguyu iyileştirmek için bileşik dizinler oluştururken aşağıdaki noktalar geçerlidir.

  • Bileşik dizinler, toplamalı sorgular çalıştırılırken isteğe bağlıdır. Ancak sorgunun RU maliyeti genellikle bileşik dizinle azaltılabilir.
  • Sorgu birden çok özelliğe göre filtrelenirse, eşitlik filtreleri bileşik dizindeki ilk özellikler olmalıdır.
  • Bileşik dizin başına en fazla bir aralık filtresine sahip olabilirsiniz ve bu filtrenin toplama sistemi işlevindeki özelliğinde olması gerekir.
  • Toplama sistemi işlevindeki özelliği bileşik dizinde en son tanımlanmalıdır.
  • order (ASC veya DESC) önemli değildir.
Bileşik dizin Örnek Sorgu Bileşik dizin desteği
(name ASC, timestamp ASC) SELECT AVG(c.timestamp) FROM c WHERE c.name = "John" Yes
(timestamp ASC, name ASC) SELECT AVG(c.timestamp) FROM c WHERE c.name = "John" No
(name ASC, timestamp ASC) SELECT AVG(c.timestamp) FROM c WHERE c.name > "John" No
(name ASC, age ASC, timestamp ASC) SELECT AVG(c.timestamp) FROM c WHERE c.name = "John" AND c.age = 25 Yes
(age ASC, timestamp ASC) SELECT AVG(c.timestamp) FROM c WHERE c.name = "John" AND c.age > 25 No

Dizin oluşturma ilkesini değiştirme

Kapsayıcının dizin oluşturma ilkesi, Azure portalı veya desteklenen SDK'lardan biri kullanılarak istediğiniz zaman güncelleştirilebilir. Dizin oluşturma ilkesine yönelik bir güncelleştirme, eski dizinden yenisine çevrimiçi ve yerinde gerçekleştirilen bir dönüştürmeyi tetikler (bu nedenle işlem sırasında fazladan depolama alanı tüketilmez). Eski dizin oluşturma ilkesi yazma kullanılabilirliğini, okuma kullanılabilirliğini veya kapsayıcıda sağlanan aktarım hızını etkilemeden yeni ilkeye verimli bir şekilde dönüştürülür. Dizin dönüştürme zaman uyumsuz bir işlemdir ve tamamlanma süresi sağlanan aktarım hızına, öğe sayısına ve boyutlarına bağlıdır. Birden çok dizin oluşturma ilkesi güncelleştirmesi yapılması gerekiyorsa, dizin dönüştürmenin mümkün olan en kısa sürede tamamlanması için tüm değişiklikleri tek bir işlem olarak yapmanız önerilir.

Önemli

Dizin dönüştürme, istek birimlerini kullanan bir işlemdir.

Not

Dizin dönüştürme işleminin ilerleme durumunu Azure portalında veya SDK'lardan birini kullanarak izleyebilirsiniz.

Dizin dönüştürmeleri sırasında yazma kullanılabilirliğini etkilemez. Dizin dönüştürme, sağlanan RU'larınızı kullanır ancak CRUD işlemlerinizden veya sorgularınızdan daha düşük önceliklidir.

Yeni dizine alınan yollar eklenirken okuma kullanılabilirliğini etkilemez. Sorgular yalnızca bir dizin dönüştürme işlemi tamamlandıktan sonra yeni dizine alınan yolları kullanır. Başka bir deyişle, yeni bir dizinli yol eklerken, bu dizinli yoldan yararlanan sorgular, dizin dönüştürmeden önce ve sırasında aynı performansa sahiptir. Dizin dönüştürme tamamlandıktan sonra sorgu altyapısı yeni dizine alınan yolları kullanmaya başlar.

Dizine alınan yolları kaldırırken, tüm değişikliklerinizi tek bir dizin ilkesi dönüşümünde gruplandırmalısınız. Birden çok dizini kaldırır ve bunu tek bir dizin ilkesi değişikliğinde yaparsanız, sorgu altyapısı dizin dönüşümü boyunca tutarlı ve eksiksiz sonuçlar sağlar. Ancak, dizinleri birden çok dizin oluşturma ilkesi değişikliğiyle kaldırırsanız, sorgu altyapısı tüm dizin dönüştürmeleri tamamlanana kadar tutarlı veya eksiksiz sonuçlar sağlamaz. Geliştiricilerin çoğu dizinleri bırakmaz ve bu dizinleri kullanan sorguları hemen çalıştırmaya çalışır, bu nedenle pratikte bu durum pek olası değildir.

Dizine alınan bir yolu bıraktığınızda sorgu altyapısı bunu kullanmayı hemen durdurur ve bunun yerine tam tarama yapar.

Not

Mümkün olduğunda, her zaman birden çok dizin kaldırma işlemini tek bir dizin ilkesi değişikliğinde gruplandırmayı denemelisiniz.

Önemli

Bir dizinin kaldırılması hemen geçerli olurken, dizin oluşturma dönüşümü gerektirdiği için yeni bir dizin eklemek biraz zaman alır. Bir dizini başka bir dizinle değiştirirken (örneğin, tek bir özellik dizinini bileşik dizinle değiştirirken) önce yeni dizini eklediğinizden emin olun ve dizin oluşturma ilkesinden önceki dizini kaldırmadan önce dizin dönüştürme işleminin tamamlanmasını bekleyin. Aksi takdirde bu, önceki dizini sorgulama becerinizi olumsuz etkiler ve önceki dizine başvuran tüm etkin iş yüklerini bozabilir.

Dizin oluşturma ilkeleri ve TTL

Yaşam Süresi (TTL) özelliğinin kullanılması için dizin oluşturma gerekir. Bu şu anlama gelir:

  • dizin oluşturma modunun olarak ayarlandığı nonebir kapsayıcıda TTL'yi etkinleştirmek mümkün değildir.
  • TTL'nin etkinleştirildiği bir kapsayıcıda dizin oluşturma modunu Yok olarak ayarlamak mümkün değildir.

Hiçbir özellik yolunun dizine alınması gerekmeyen ancak TTL'nin gerekli olduğu senaryolarda, dizin oluşturma modu olarak ayarlanmış consistentbir dizin oluşturma ilkesi kullanabilir, ekli yol yok ve /* tek dışlanan yol olarak.