Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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,/1vb. 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" }
]
}
'
headquartersninemployeesyolu şudur:/headquarters/employees/?locations'countryyolu/locations/[]/country/?'dirheadquartersaltı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
_etagvarsayılan olarak dizin oluşturmanın dışında tutulur.Dizin oluşturma modu tutarlı olarak ayarlanırsa, sistem özellikleri
idve_tsotomatik 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:
flatvequantizedFlatdizin türleri, vektör araması yaparken her vektörde depolamak ve okumak için Azure Cosmos DB dizinini uygular. Dizin içerenflatvektö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çin505boyut sınırlaması vardır.quantizedFlatdizini, indeks içinde nicelenmiş (sıkıştırılmış) vektörleri depolar. DizinliquantizedFlatvektö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 flatile yapılan vektör aramaları,flatdizinindeki 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.diskANNdizini, 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ğuquantizedFlatveyaflatdeğ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 dequantizedFlatDiskANNdizin 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çinDiskANNgeç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
- Tuplelar öncü
/events/[]/{name/?,category/?}/?- Tuple'lar bir
?ile biter
- Tuple'lar bir
/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),
orderyan tümcesinde belirtilen sıralamayla da eşleşmelidir.Bileşik dizin, tüm yollarda ters sırada olan bir
ORDER BYibaresini 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
ORDERkı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 BYyan tümcesi içeren bir sorguda bileşik bir dizin tanımlamazsanız, sorgu yine de başarılı olur. Ancak,ORDER BYifadesindeki ö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 BYdahil edilmelidir. - Sorgu birden çok özelliğe filtre eklerse, eşitlik filtreleri yan tümcesindeki ilk özellikler
ORDER BYolmalı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 BYbileş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(ASCveyaDESC) ö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
noneolarak 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.