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 automatic
ayarlanır. Dizin oluşturma ilkesindeki automatic
özelliği olarak true
ayarlanarak 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" }
]
}
'
headquarters
ninemployees
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çerenflat
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. DizinliquantizedFlat
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, ilequantized flat
vektör aramalarının dizindekiflat
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.Dizin
diskANN
, 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 veyaflat
değerindenquantizedFlat
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, sorgununORDER 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
veyaDESC
) ö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ığı
none
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ınması gerekmeyen ancak TTL'nin gerekli olduğu senaryolarda, dizin oluşturma modu olarak ayarlanmış consistent
bir dizin oluşturma ilkesi kullanabilir, ekli yol yok ve /*
tek dışlanan yol olarak.