Azure Cosmos DB'de dizin oluşturma ilkeleri

Azure Cosmos DB her kapsayıcının, kapsayıcı öğelerinin nasıl dizinlenmesi gerektiğini belirten bir dizin oluşturma ilkesi vardır. 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.

Note

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

Dizin oluşturma modu

Azure Cosmos DB iki dizin oluşturma modunu destekler:

  • Tutarlı: Öğeleri oluşturduğunuzda, güncellediğinizde veya sildiğinizde dizin eşzamanlı olarak güncellenir. 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.

Note

Azure Cosmos DB ayrıca Gecikmeli dizin oluşturma modunu da destekler. Yavaş dizin oluşturma, altyapı başka bir iş yapmadığında dizin güncelleştirmelerini daha düşük bir öncelik düzeyinde gerçekleştirir. 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. cosmosdbindexing@microsoft.com ile iletişime geçerek muafiyet isteyebilirsiniz, ancak sunucusuz modda olup gecikmeli dizin oluşturma desteği bulunmayan bir Azure Cosmos DB hesabı kullanıyorsanız bu mümkün değildir.

Dizin boyutu

Azure Cosmos DB toplam tüketilen depolama alanı hem Veri boyutu hem de Dizin boyutu 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 işlemi tamamlandıktan sonra dizin alanı boşaltılır.

Important

Bölüm anahtarı (aynı zamanda "/id" olmadığı sürece) dizine alınmaz ve dizine dahil edilmelidir. Bölüm anahtarlarının çalışması için dizin oluşturma gerekmez, ancak bunları dizin oluşturma ilkenize eklemezseniz, bölüm anahtarı hiyerarşisinde filtreleme yapılan tüm sorgular tam taramaları zorlar ve daha yüksek RU tüketimine neden olur. Hiyerarşik bölüm anahtarları söz konusu olduğunda, verimli sorgu performansı sağlamak için dizin oluşturma ilkenize bölüm anahtarı hiyerarşisinin tek tek düzeylerini dahil etmek istiyorsunuz.

  • Cosmos hesabının dizin oluşturma modu Tutarlı olduğunda, sistem özellikleri id ve _ts her zaman dizine eklenir.
  • Sistem özellikleri kimliği ve _ts, kapsayıcı ilkesinin dizine alınmış yollar açıklamasına dahil edilmemiştir. Bu sistem özellikleri varsayılan olarak dizine alındığından ve bu davranış devre dışı bırakılamadığından bu tasarım gereğidir.

Özellik yollarını ekleme ve çıkarma

Ö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 bir değere (dize veya sayı) yönelen bir yol /? ile sonlanır
  • Dizideki öğeler, /[] gösterimi kullanılarak (öğelerin birlikte ele alınması için /0, /1 vb. yerine) ele alınır.
  • Joker karakter, /* düğümünün altındaki öğeleri eşleştirmek amacıyla 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/?'dir

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

Örneğin, /headquarters/employees/? yolunu dahil edebiliriz. Bu yol employees özelliğini dizine almamızı sağlar ancak bu özellik içindeki fazladan iç içe geçmiş JSON'u dizine eklemez.

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 modelinize eklenebilecek tüm yeni özellikleri proaktif olarak dizine eklemesine olanak sağlayan 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, dışlama stratejisi kullanıldığında varsayılan olarak 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 içine almanıza gerek yoktur (örneğin, "/path/?"). Diğer özel karakterlere sahip yollar söz konusu olduğunda, yol dizisini çift tırnak içinde verdiğinizden emin olun (ö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.

Öncelik sırasını 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 yollar temel alınarak, food/ingredients yolundaki veya içinde iç içe yerleştirilmiş tüm veriler dizine dahil edilmez. İstisna, /food/ingredients/nutrition/* dahilindeki yol içerisindeki verilerin dizine alınmasıdır.

Azure Cosmos DB 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/?/a/?'den daha kesindir.

  • /? /*'den daha kesindir. Örneğin /a/?, /a/*'den daha kesindir, bu yüzden /a/? önceliklidir.

  • Yol /* ya dahil edilen bir yol ya da hariç tutulan bir yol olmalıdır.

Tam metin dizinleri

Note

NoSQL API için Tam Metin ve Hibrit Arama özelliğini etkinleştirmelisiniz ve tam metin dizinini belirtmelisiniz.

Tam metin dizinleri, dizini kullanarak tam metin arama ve puanlama özelliklerini verimli bir şekilde etkinleştirir. Dizin oluşturma ilkesinde tam metin yolu tanımlama işlemi, dizin oluşturulacak tüm metin yollarını içeren dizin oluşturma ilkesinin bir fullTextIndexes bölümü eklenerek kolayca yapılabilir. Örneğin:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        },
    ],
    "fullTextIndexes": [
        {
            "path": "/text"
        }
    ]
}

Important

Tam metin dizin oluşturma ilkesi, kapsayıcının tam metin ilkesinde tanımlanan yolda olmalıdır. Kapsayıcı vektör ilkeleri hakkında daha fazla bilgi edinin.

Vektör dizinleri

Note

Vektör dizini belirtmek için Azure Cosmos DB NoSQL Vektör Arama özelliğini etkinleştirmeniz 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:

Türü Description 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

Important

Şu anda vektör ilkeleri ve vektör dizinleri oluşturma işleminden sonra sabittir. Değişiklik yapmak için lütfen yeni bir koleksiyon oluşturun.

Dikkate almak için birkaç nokta:

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

    • quantizedFlat dizini, indeks içinde 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, quantized flat ile yapılan vektör aramaları, flat dizinindeki vektör aramalarına göre daha düşük gecikme süresi, daha yüksek aktarım hızı ve daha düşük RU maliyetine sahip 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.

    • diskANN dizini, 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, tahmini en yakın komşular (ANN) dizini olduğundan, doğruluğu quantizedFlat veya flat değerlerinden daha düşük olabilir.

diskANN ve quantizedFlat dizinleri, her Yaklaşık En Yakın Komşu vektör dizini için geçerli olan doğruluk ve gecikme süresi takasını ayarlamak için kullanılabilecek isteğe bağlı dizin derleme parametrelerini alabilir.

  • quantizationByteSize: Ürün nicelemesi için boyutu (bayt cinsinden) ayarlar. Min=1, Default=dynamic (sistem karar verir), Max=512. Bu değerin daha büyük ayarlanması, daha yüksek RU maliyeti ve daha yüksek gecikme süresi karşılığında daha yüksek doğruluk vektör aramalarına neden olabilir. Bu, hem hem de quantizedFlatDiskANN dizin türleri için geçerlidir.
    • indexingSearchListSize: Dizin derlemesi oluşturma sırasında aranacak vektör sayısını ayarlar. Min=10, Default=100, Max=500. Bu büyük ayarın ayarlanması, daha uzun dizin derleme süreleri ve daha yüksek vektör alma gecikme süreleri pahasına daha yüksek doğruluk vektör aramaları yapılmasına neden olabilir. Bu yalnızca dizinler için DiskANN geçerlidir.

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/?",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector",
            "type": "diskANN"
        }
    ]
}

Important

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.

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:

  • Point

  • Polygon

  • 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.

Tuple dizinleri

Tuple Dizinleri, bir dizi öğesi içindeki birden çok alanda filtreleme yaparken kullanışlıdır. Tuple dizinleri, tuple belirteci "[]" kullanılarak dizin oluşturma ilkesinin includedPaths bölümünde tanımlanır.

Note

Dahil edilen veya dışlanan yollardan farklı olarak , /* joker karakteriyle yol oluşturamazsınız. Her tuple yolunun "/?" ile bitmesi gerekir. Bir tuple yolundaki bir tuple bir öğede yoksa, tuple'ın tanımsız olduğunu belirtmek için dizine bir değer eklenir.

Dizi demet yolakları includedPaths bölümünde tanımlanır ve aşağıdaki gösterim kullanılacaktır.

<path prefix>/[]/{<tuple 1>, <tuple 2> … <tuple n>}/?

Şunlara dikkat edin:

  • İlk bölüm olan Yol Öneki, tüpler arasında ortak olan yoldur. Kökten dizilime giden yoldur. Bizim örneğimizde "/events" şeklindedir.
  • Sonraki, "[]" dizi joker karakteri tanımlayıcısıdır. Tüm dizi tanımlama grubu yollarında, tanımlama grubu tanımlayıcısı "{}" öncesinde bir dizi joker karakter tanımlayıcısı olmalıdır.
  • Ardından "{}" demet belirleyicisini kullanarak demetleri belirtmektir.
  • ** İkili veriler virgülle ayrılır.
  • Tuple, birkaç istisna dışında diğer dizin yollarıyla aynı yol belirtimini kullanmalıdır.
  • Tanımlama kümeleri baştaki "/" ile başlamamalıdır.
  • Demetlerin dizi joker karakterleri olmamalıdır.
  • Tuplar "?" veya "*" ile bitmemelidir
  • "?" bir tuple yolundaki son segmenttir ve tuple belirleyici segmentinden hemen sonra belirtilmelidir.

Örneğin

/events/[]/{name, category}/?

Geçerli dizi kartelası yollarına birkaç örnek verilmiştir:

    "includedPaths":[  
        {"path": "/events/[]/{name/first, name/last}/?"}, 
        {"path": "/events/[]/{name/first, category}/?"}, 
        {"path": "/events/[]/{name/first, category/subcategory}/?"}, 
        {"path": "/events/[]/{name/[1]/first, category}/?"}, 
        {"path": "/events/[]/{[1], [3]}/?"}, 
        {"path": "/city/[1]/events/[]/{name, category}/?"} 
    ]

Bunlar geçersiz dizi tanımlama grubu yollarına birkaç örnektir

  • /events/[]/{name/[]/first, category}/?
    • Kümelerden birinde dizi joker karakter bulunuyor
  • /events/[]/{name, category}/*
    • Dizi tanımlama grubu yolundaki son segment * değil "?" olmalıdır
  • /events/[]/{{name, first},category}/?
    • Tuple tanımlayıcısı iç içe geçmiş durumda.
  • /events/{name, category}/?
    • Tuple tanımlayıcıdan önce dizi joker karakteri eksik
  • /events/[]/{/name,/category}/?
    • Tuplelar öncü / ile başlar
  • /events/[]/{name/?,category/?}/?
    • Tuple'lar bir ? ile biter
  • /city/[]/events/[]/{name, category}/?
    • 2 dizi joker karakteri kullanılarak yol ön eki

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 karakteriyle bir yol oluşturamazsınız. Her bileşik yolun sonunda, belirtmenize gerek olmayan örtük bir /? bulunur. 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 skaler olmayan bir değere yol açıyorsa, yolun tanımsız olduğunu belirtmek amacıyla dizine bir işaret değeri 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).

Note

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 bir ORDER BY yan 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), order yan tümcesinde belirtilen sıralamayla da eşleşmelidir.

  • Bileşik dizin, tüm yollarda ters sırada olan bir ORDER BY ibaresini 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 tarafından destekleniyor mu?
(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 özellik üzerinde filtreler içeren 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, (name ASC, age ASC) üzerinde bileşik dizin uygulayabiliyorsa daha az zaman alan ve daha az RU tüketen, daha verimli hale gelir.

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, (name ASC, age ASC) ve (name ASC, _ts ASC) üzerinde bir bileşik dizinle daha etkilidir. Ancak sorgu, eşitlik filtrelerine sahip olan özelliklerin bileşik dizinde önce tanımlanması gerektiği için (age ASC, name ASC) üzerinde bileşik dizini 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 fazla filtre kullanılan sorguları iyileştirmek için bileşik dizin oluştururken, bileşik dizinin ORDER kısmı 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 tarafından destekleniyor mu?
(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 özellik üzerinde filtre ve farklı bir özellik kullanan ayrı bir ORDER BY yan tümcesi içeren bir sorguda bileşik bir dizin tanımlamazsanız, sorgu yine de başarılı olur. Ancak, ORDER BY ifadesindeki özelliğin yüksek kardinalitesi varsa, özellikle bileşik bir dizinle sorgunun RU maliyeti 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 tarafından destekleniyor mu?
(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 tarafından destekleniyor mu?
(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

Dizi joker karakteri içeren bileşik dizinler

Aşağıda, dizi joker karakteri (wildcard) içeren bileşik dizine yönelik bir örnek verilmiştir.

{  
    "automatic":true,
    "indexingMode":"Consistent",
    "includedPaths":[  
        {  
            "path":"/*"
        }
    ],
    "excludedPaths":[],
    "compositeIndexes":[  
        [  
            {"path":"/familyname", "order":"ascending"},
            {"path":"/children/[]/age", "order":"descending"}
        ]
    ]
}

Bu bileşik dizinden yararlanabilecek örnek bir sorgu:

SELECT r.id
FROM root r
JOIN ch IN r.children
WHERE r.familyname = 'Anderson' AND ch.age > 20

Dizin oluşturma ilkesini değiştirme

Kapsayıcının dizin oluşturma ilkesi, Azure portalı veya desteklenen SDK'lardan biri kullanılarak herhangi bir zamanda 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.

Important

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

Note

dizin dönüştürmenin 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ınmış yollar eklenirken okuma erişilebilirliğine hiçbir etkisi yoktur. 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.

Note

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.

Important

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. Bunun anlamı şudur:

  • dizin oluşturma modu none olarak ayarlandığında bir 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ınmaması gereken, ancak TTL'nin gerekli olduğu senaryolarda, dizin modu consistent olarak ayarlanmış bir dizinleme ilkesini kullanabilirsiniz, hiçbir ekli yol yoktur ve /* yalnızca hariç tutulan yol olarak belirlenmiştir.