Bagikan melalui


Properti komputasi di Azure Cosmos DB untuk NoSQL

BERLAKU UNTUK: NoSQL

Properti komputasi di Azure Cosmos DB memiliki nilai yang berasal dari properti item yang ada, tetapi properti tidak bertahan dalam item itu sendiri. Properti komputasi dilingkup ke satu item dan dapat direferensikan dalam kueri seolah-olah properti tersebut tetap ada. Properti komputasi mempermudah penulisan logika kueri yang kompleks sekali dan mereferensikannya berkali-kali. Anda dapat menambahkan satu indeks pada properti ini atau menggunakannya sebagai bagian dari indeks komposit untuk meningkatkan performa.

Catatan

Apakah Anda memiliki umpan balik tentang properti komputasi? Kami ingin mendengar pendapat Anda! Jangan ragu untuk berbagi umpan balik langsung dengan tim teknik Azure Cosmos DB: cosmoscomputedprops@microsoft.com.

Apa itu properti komputasi?

Properti komputasi harus berada di tingkat atas dalam item dan tidak dapat memiliki jalur berlapis. Setiap definisi properti komputasi memiliki dua komponen: nama dan kueri. Nama adalah nama properti komputasi, dan kueri menentukan logika untuk menghitung nilai properti untuk setiap item. Properti komputasi dicakup ke item individual dan oleh karena itu tidak dapat menggunakan nilai dari beberapa item atau mengandalkan properti komputasi lainnya. Setiap kontainer dapat memiliki maksimum 20 properti komputasi.

Contoh definisi properti komputasi:

{
  "computedProperties": [
    {
      "name": "cp_lowerName",
      "query": "SELECT VALUE LOWER(c.name) FROM c"
    }
  ]
}

Batasan nama

Kami sangat menyarankan agar Anda memberi nama properti komputasi sehingga tidak ada tabrakan dengan nama properti yang bertahan. Untuk menghindari nama properti yang tumpang tindih, Anda dapat menambahkan awalan atau akhiran ke semua nama properti komputasi. Artikel ini menggunakan awalan cp_ dalam semua definisi nama.

Penting

Menentukan properti komputasi dengan menggunakan nama yang sama dengan properti yang bertahan tidak mengakibatkan kesalahan, tetapi mungkin menyebabkan perilaku yang tidak terduga. Terlepas dari apakah properti komputasi diindeks atau tidak, nilai properti yang dipertahankan yang punya nama sama dengan properti komputasi tidak akan disertakan dalam indeks. Kueri akan selalu menggunakan properti komputasi alih-alih properti yang dipertahankan kecuali jika proyeksi wildcard di klausul SELECT menghasilkan properti yang dipertahankan, bukan properti komputasi. Proyeksi kartubebas tidak secara otomatis menyertakan properti komputasi.

Batasan pada nama properti komputasi adalah:

  • Semua properti komputasi harus memiliki nama yang unik.
  • Nilai name properti mewakili nama properti tingkat atas yang dapat digunakan untuk mereferensikan properti komputasi.
  • Nama properti sistem yang dicadangkan seperti id, _rid, dan _ts tidak dapat digunakan sebagai nama properti komputasi.
  • Nama properti komputasi tidak dapat cocok dengan jalur properti yang sudah diindeks. Batasan ini berlaku untuk semua jalur pengindeksan yang ditentukan, termasuk:
    • Jalur yang disertakan
    • Jalur yang dikecualikan
    • Indeks spasial
    • Indeks komposit

Batasan kueri

Kueri dalam definisi properti komputasi harus valid secara sintis dan semantik, jika tidak, operasi buat atau perbarui gagal. Kueri harus mengevaluasi ke nilai deterministik untuk semua item dalam kontainer. Kueri mungkin mengevaluasi ke tidak terdefinisi atau null untuk beberapa item, dan properti komputasi dengan nilai yang tidak terdefinisi atau null berperilaku sama seperti properti yang bertahan dengan nilai tidak terdefinisi atau null saat digunakan dalam kueri.

Batasan definisi kueri properti komputasi adalah:

  • Kueri harus menentukan klausa FROM yang mewakili referensi item akar. Contoh klausul FROM yang didukung adalah: FROM c, , FROM root cdan FROM MyContainer c.
  • Kueri harus menggunakan klausa VALUE dalam proyeksi.
  • Kueri tidak dapat menyertakan JOIN.
  • Kueri tidak dapat menggunakan ekspresi Skalar nondeterministik. Contoh ekspresi skalar nondeterministik adalah: GetCurrentDateTime, GetCurrentTimeStamp, GetCurrentTicks, dan RAND.
  • Kueri tidak dapat menggunakan salah satu klausul berikut: WHERE, GROUP BY, ORDER BY, TOP, DISTINCT, OFFSET LIMIT, EXISTS, ALL, LAST, FIRST, dan NONE.
  • Kueri tidak dapat menyertakan subkueri skalar.
  • Fungsi agregat, fungsi spasial, fungsi nondeterministik, dan fungsi yang ditentukan pengguna (UDF) tidak didukung.

Membuat properti komputasi

Setelah properti komputasi dibuat, Anda dapat menjalankan kueri yang mereferensikan properti dengan menggunakan metode apa pun, termasuk semua kit pengembangan perangkat lunak (SDK) dan Azure Data Explorer di portal Azure.

Versi yang didukung Catatan
.NET SDK v3 >= 3.34.0-pratinjau Properti komputasi saat ini hanya tersedia dalam versi paket pratinjau.
Java SDK v4 >= 4.46.0 Properti komputasi saat ini berada di bawah versi pratinjau.
Python SDK >= v4.5.2b5 Properti komputasi saat ini berada di bawah versi pratinjau.

Membuat properti komputasi dengan menggunakan SDK

Anda dapat membuat kontainer baru yang memiliki properti komputasi yang ditentukan, atau Anda dapat menambahkan properti komputasi ke kontainer yang sudah ada.

Berikut adalah contoh cara membuat properti komputasi dalam kontainer baru:

ContainerProperties containerProperties = new ContainerProperties("myContainer", "/pk")
{
    ComputedProperties = new Collection<ComputedProperty>
    {
        new ComputedProperty
        {
            Name = "cp_lowerName",
            Query = "SELECT VALUE LOWER(c.name) FROM c"
        }
    }
};

Container container = await client.GetDatabase("myDatabase").CreateContainerAsync(containerProperties);

Berikut adalah contoh cara memperbarui properti komputasi pada kontainer yang sudah ada:

var container = client.GetDatabase("myDatabase").GetContainer("myContainer");

// Read the current container properties
var containerProperties = await container.ReadContainerAsync();
// Make the necessary updates to the container properties
containerProperties.Resource.ComputedProperties = new Collection<ComputedProperty>
    {
        new ComputedProperty
        {
            Name = "cp_lowerName",
            Query = "SELECT VALUE LOWER(c.name) FROM c"
        },
        new ComputedProperty
        {
            Name = "cp_upperName",
            Query = "SELECT VALUE UPPER(c.name) FROM c"
        }
    };
// Update the container with changes
await container.ReplaceContainerAsync(containerProperties);

Tip

Setiap kali Anda memperbarui properti kontainer, nilai lama ditimpa. Jika Anda memiliki properti komputasi yang sudah ada dan ingin menambahkan properti baru, pastikan Anda menambahkan properti komputasi baru dan yang sudah ada ke koleksi.

Membuat properti komputasi dengan menggunakan Data Explorer

Anda dapat menggunakan Data Explorer untuk membuat properti komputasi untuk kontainer.

  1. Buka kontainer yang sudah ada di Data Explorer.

  2. Navigasi ke bagian Pengaturan untuk kontainer Anda. Kemudian, navigasikan ke sub bagian *Properti Komputasi.

  3. Edit definisi properti komputasi JSON untuk kontainer Anda. Dalam contoh ini, JSON ini digunakan untuk menentukan properti komputasi untuk membagi SKU string untuk produk ritel menggunakan pemisah - .

    [
      {
        "name": "cp_splitSku",
        "query": "SELECT VALUE StringSplit(p.sku, \"-\") FROM products p"
      }
    ]
    

    Cuplikan layar editor JSON properti komputasi di antarmuka Data Explorer.

  4. Simpan properti komputasi.

Menggunakan properti komputasi dalam kueri

Properti komputasi dapat direferensikan dalam kueri dengan cara yang sama seperti properti yang bertahan direferensikan. Nilai untuk properti komputasi yang tidak diindeks dievaluasi selama runtime dengan menggunakan definisi properti komputasi. Jika properti komputasi diindeks, indeks digunakan dengan cara yang sama seperti yang digunakan untuk properti yang dipertahankan, dan properti komputasi dievaluasi sesuai kebutuhan. Kami menyarankan agar Anda menambahkan indeks pada properti komputasi Anda untuk biaya dan performa terbaik.

Contoh berikut menggunakan himpunan data produk mulai cepat yang tersedia di Data Explorer di portal Azure. Untuk memulai, pilih Luncurkan mulai cepat dan muat himpunan data di kontainer baru.

Cuplikan layar yang mengilustrasikan cara memuat sampel himpunan data ke dalam database dan kontainer.

Berikut adalah contoh item:

{
  "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
  "categoryId": "bbbbbbbb-1111-2222-3333-cccccccccccc",
  "categoryName": "Bikes, Touring Bikes",
  "sku": "BK-T79U-50",
  "name": "Touring-1000 Blue, 50",
  "description": "The product called \"Touring-1000 Blue, 50\"",
  "price": 2384.07,
  "tags": [
    {
      "id": "cccccccc-2222-3333-4444-dddddddddddd",
      "name": "Tag-61"
    }
  ],
  "_rid": "n7AmAPTJ480GAAAAAAAAAA==",
  "_self": "dbs/n7AmAA==/colls/n7AmAPTJ480=/docs/n7AmAPTJ480GAAAAAAAAAA==/",
  "_etag": "\"01002683-0000-0800-0000-6451fb4b0000\"",
  "_attachments": "attachments/",
  "_ts": 1683094347
}

Proyeksi

Jika properti komputasi perlu diproyeksikan, properti tersebut harus direferensikan secara eksplisit. Proyeksi kartubebas seperti SELECT * mengembalikan semua properti yang bertahan, tetapi tidak menyertakan properti komputasi.

Berikut adalah contoh definisi properti komputasi untuk mengonversi properti menjadi name huruf kecil:

{ 
  "name": "cp_lowerName", 
  "query": "SELECT VALUE LOWER(c.name) FROM c" 
} 

Properti ini kemudian dapat diproyeksikan dalam kueri:

SELECT 
    c.cp_lowerName 
FROM 
    c

Klausul WHERE

Properti komputasi dapat direferensikan dalam predikat filter seperti properti yang bertahan. Kami menyarankan agar Anda menambahkan indeks tunggal atau komposit yang relevan saat Anda menggunakan properti komputasi dalam filter.

Berikut adalah contoh definisi properti komputasi untuk menghitung diskon harga 20 persen:

{ 
  "name": "cp_20PercentDiscount", 
  "query": "SELECT VALUE (c.price * 0.2) FROM c" 
} 

Properti ini kemudian dapat difilter untuk memastikan bahwa hanya produk di mana diskon akan kurang dari $50 yang dikembalikan:

SELECT 
    c.price - c.cp_20PercentDiscount as discountedPrice, 
    c.name 
FROM 
    c 
WHERE 
    c.cp_20PercentDiscount < 50.00

klausa GROUP BY

Seperti halnya properti yang bertahan, properti komputasi dapat direferensikan dalam klausul GROUP BY dan menggunakan indeks jika memungkinkan. Untuk performa terbaik, tambahkan indeks tunggal atau komposit yang relevan.

Berikut adalah contoh definisi properti komputasi yang menemukan kategori utama untuk setiap item dari categoryName properti:

{
  "name": "cp_primaryCategory",
  "query": "SELECT VALUE SUBSTRING(c.categoryName, 0, INDEX_OF(c.categoryName, ',')) FROM c"
}

Anda kemudian dapat mengelompokkan menurut cp_primaryCategory untuk mendapatkan jumlah item di setiap kategori utama:

SELECT 
    COUNT(1), 
    c.cp_primaryCategory 
FROM 
    c 
GROUP BY 
    c.cp_primaryCategory

Tip

Meskipun Anda juga dapat mencapai kueri ini tanpa menggunakan properti komputasi, menggunakan properti komputasi sangat menyederhanakan penulisan kueri dan memungkinkan peningkatan performa karena cp_primaryCategory dapat diindeks. SUBSTRING () dan INDEX_OF() memerlukan pemindaian penuh semua item dalam kontainer, tetapi jika Anda mengindeks properti komputasi, maka seluruh kueri dapat dilayani dari indeks sebagai gantinya. Kemampuan untuk melayani kueri dari indeks alih-alih mengandalkan pemindaian penuh meningkatkan performa dan menurunkan biaya unit permintaan kueri (RU).

Klausul ORDER BY

Seperti halnya properti yang bertahan, properti komputasi dapat direferensikan dalam klausa ORDER BY, dan properti tersebut harus diindeks agar kueri berhasil. Dengan menggunakan properti komputasi, Anda dapat MEMESAN BERDASARKAN hasil fungsi logika atau sistem yang kompleks, yang membuka banyak skenario kueri baru saat Anda menggunakan Azure Cosmos DB.

Berikut adalah contoh definisi properti komputasi yang mendapatkan bulan dari _ts nilai:

{
  "name": "cp_monthUpdated",
  "query": "SELECT VALUE DateTimePart('m', TimestampToDateTime(c._ts*1000)) FROM c"
}

Sebelum anda dapat ORDER BY cp_monthUpdated, Anda harus menambahkannya ke kebijakan pengindeksan Anda. Setelah kebijakan pengindeksan diperbarui, Anda dapat memesan berdasarkan properti komputasi.

SELECT
    *
FROM
    c
ORDER BY
    c.cp_monthUpdated

Mengindeks properti komputasi

Properti komputasi tidak diindeks secara default dan tidak tercakup oleh jalur kartubebas dalam kebijakan pengindeksan. Anda dapat menambahkan indeks tunggal atau komposit pada properti komputasi dalam kebijakan pengindeksan dengan cara yang sama seperti Anda akan menambahkan indeks pada properti yang dipertahankan. Kami menyarankan agar Anda menambahkan indeks yang relevan ke semua properti komputasi. Kami merekomendasikan indeks ini karena bermanfaat dalam meningkatkan performa dan mengurangi unit permintaan (RU). Ketika properti komputasi diindeks, nilai aktual dievaluasi selama operasi penulisan item untuk menghasilkan dan mempertahankan istilah indeks.

Ada beberapa pertimbangan untuk mengindeks properti komputasi, termasuk:

  • Properti komputasi dapat ditentukan dalam jalur yang disertakan, jalur yang dikecualikan, dan jalur indeks komposit
  • Properti komputasi tidak dapat memiliki indeks spasial yang ditentukan pada properti tersebut
  • Jalur kartubebas di bawah pekerjaan jalur properti komputasi seperti yang mereka lakukan untuk properti reguler
  • Indeks terkait pada properti yang dihapus dan diindeks juga harus dihilangkan

Catatan

Semua properti komputasi ditentukan di tingkat atas item. Jalur selalu /<computed property name>.

Tip

Setiap kali Anda memperbarui properti kontainer, nilai lama ditimpa. Jika Anda memiliki properti komputasi yang sudah ada dan ingin menambahkan properti baru, pastikan Anda menambahkan properti komputasi baru dan yang sudah ada ke koleksi.

Catatan

Ketika definisi properti komputasi terindeks dimodifikasi, itu tidak secara otomatis diindeks ulang. Untuk mengindeks properti komputasi yang dimodifikasi, Anda harus terlebih dahulu menghilangkan properti komputasi dari indeks. Kemudian setelah pengindeksan ulang selesai, tambahkan properti komputasi kembali ke kebijakan indeks.

Jika Anda ingin menghapus properti komputasi, Anda harus terlebih dahulu menghapusnya dari kebijakan indeks.

Menambahkan indeks tunggal untuk properti komputasi

Untuk menambahkan indeks tunggal untuk properti komputasi bernama cp_myComputedProperty:

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

Menambahkan indeks komposit untuk properti komputasi

Untuk menambahkan indeks komposit pada dua properti di mana, satu dihitung sebagai cp_myComputedProperty, dan yang lainnya dipertahankan sebagai myPersistedProperty:

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/\"_etag\"/?"
    }
  ],
  "compositeIndexes": [
    [
      {
        "path": "/cp_myComputedProperty"
      },
      {
        "path": "/path/to/myPersistedProperty"
      }
    ]
  ]
}

Memahami konsumsi unit permintaan

Menambahkan properti komputasi ke kontainer tidak menggunakan RU. Operasi tulis pada kontainer yang memiliki properti komputasi yang ditentukan mungkin memiliki sedikit peningkatan RU. Jika properti komputasi diindeks, RU pada operasi tulis meningkat untuk mencerminkan biaya untuk pengindeksan dan evaluasi properti komputasi.