共用方式為


Azure Cosmos DB for Apache Cassandra 中的具體化檢視 (預覽)

適用於: Cassandra

重要

Azure Cosmos DB for Cassandra 中的具體化檢視目前為預覽版。 您可以使用 Azure 入口網站來啟用此功能。 此具體化檢視的預覽版是在沒有服務等級協定的情況下提供。 目前不建議針對生產工作負載使用具體化檢視。 此預覽版可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用規定

具體化檢視定義時,有助於提供方法,以有效率地使用不是主索引鍵的篩選條件查詢基底資料表 (或 Azure Cosmos DB 中的容器)。 當使用者寫入基底資料表時,具體化檢視會自動在背景中建置。 此檢視可以有不同的主索引鍵來用於有效率的查閱。 檢視也會只包含基底資料表明確保護的資料行。 此檢視將是唯讀狀態。

您可以使用「次要索引」來查詢資料行存放區,而無須指定資料分割區索引鍵。 不過,查詢對高或低基數的資料行無效。 查詢可以掃描所有資料以取得小型結果集。 這類查詢最終會耗費大量資源,因為最後會不慎執行變成跨分割區查詢。

有了具體化檢視,您可以

  • 做為查閱或對應資料表來保存跨分割區掃描,否則會是昂貴的查詢。
  • 提供 SQL 型條件述詞,只填入符合預先條件的特定資料行和資料
  • 建立即時檢視,以簡化通常會使用變更摘要觸發程序儲存為個別集合的事件型案例。

具體化檢視的優點

具體化檢視有許多優點,包括但不限於:

  • 您可以使用具體化檢視來實作伺服器端反正規化。 使用伺服器端反正規化,您可以避免多個獨立資料表,並在用戶端應用程式中計算複雜的反正規化。
  • 具體化檢視自動更新檢視以便與基底資料表保持一致。 這個自動更新會使用 來抽象化用戶端應用程式的責任,通常會實作自訂邏輯,以對基底資料表和檢視執行雙重寫入。
  • 具體化檢視會從單一檢視讀取來優化讀取效能。
  • 您能夠獨立指定具體化檢視的輸送量。
  • 您可以設定具體化檢視建立器圖層,以對應至您的需求來凍結檢視。
  • 具體化檢視可改善寫入效能,因為寫入作業只需要寫入基底資料表。
  • 此外,具體化檢視的 Azure Cosmos DB 實作是以提取模型為基礎。 此實作不會影響寫入效能。

開始使用具體化檢視

使用 Azure CLI 為 Cassandra 帳戶建立新的 API,以使用原生命令或 REST API 作業來啟用具體化檢視功能。

  1. 登入 Azure 入口網站

  2. 瀏覽至您的 API for Cassandra 帳戶。

  3. 在資源功能表中,選取 [設定]

  4. 在 [設定] 區段中,選取「Cassandra API (預覽) 的具體化檢視」

  5. 在新的對話方塊中,選取 [啟用] 以啟用此帳戶的這項功能。

    Azure 入口網站 中已啟用具體化檢視功能的螢幕快照。

背後原理

Cassandra 的 API 會使用具體化檢視建立器計算層來維護檢視。

您可以根據延遲和延遲需求,彈性地設定檢視建立器的計算執行個體,以凍結檢視。 從技術觀點來看,即使資料大小很大且分割區數目很高,此計算層仍可協助以更有效率的方式管理資料分割之間的連線。

計算容器會在 Azure Cosmos DB 帳戶內的所有具體化檢視之間共用。 每個佈建的計算容器都會繁衍多個工作,這些工作會從基底資料表分割區讀取變更摘要,並將資料寫入目標具體化檢視。 計算容器會針對帳戶中的每個具體化檢視,根據具體化檢視定義來轉換資料。

建立具體化檢視建立器

建立具體化檢視建立器,以自動轉換資料並寫入具體化檢視。

  1. 登入 Azure 入口網站

  2. 瀏覽至您的 API for Cassandra 帳戶。

  3. 在資源功能表中,選取 [具體化檢視建立器]

  4. 在 [具體化檢視建立器] 頁面上,設定建立器的 SKU 和執行個體數目。

    注意

    只有針對帳戶啟用具體化檢視功能時,才會顯示此資源功能表選項和頁面。

  5. 選取 [儲存]。

建立具體化檢視

設定您的帳戶和具體化檢視建立器之後,您應該就能夠使用 CQLSH 建立具體化檢視:

注意

如果您尚未安裝獨立 CQLSH 工具,請參閱安裝 CQLSH 工具。 您也應該更新工具中的連接字串

以下是一些建立具體化檢視的範例命令:

  1. 首先,建立 keyspace 名稱 uprofile

    CREATE KEYSPACE IF NOT EXISTS uprofile WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };
    
  2. 接下來,在 keyspace 內建立名稱為 user 的資料表。

    CREATE TABLE IF NOT EXISTS uprofile.USER (user_id INT PRIMARY KEY, user_name text, user_bcity text);
    
  3. 現在,在相同的 Keyspace 內建立名稱為 user_by_bcity 的具體化檢視。 使用查詢指定資料從基底資料表投影到檢視的方式。

    CREATE MATERIALIZED VIEW uprofile.user_by_bcity AS 
    SELECT
        user_id,
        user_name,
        user_bcity 
    FROM
        uprofile.USER 
    WHERE
        user_id IS NOT NULL 
        AND user_bcity IS NOT NULL PRIMARY KEY (user_bcity, user_id);
    
  4. 在基底資料表中插入資料列。

    INSERT INTO
        uprofile.USER (user_id, user_name, user_bcity) 
    VALUES
        (
            101, 'johnjoe', 'New York' 
        );
    
    INSERT INTO
        uprofile.USER (user_id, user_name, user_bcity) 
    VALUES
        (
            102, 'james', 'New York' 
        );
    
  5. 檢視具體化查詢。

    SELECT * FROM user_by_bcity; 
    
  6. 觀察具體化檢視的輸出。

     user_bcity | user_id | user_name 
    ------------+---------+----------- 
       New York |     101 |   johnjoe 
       New York |     102 |     james 
    
    (2 rows) 
    

您也可以選擇使用資源提供者來建立或更新具體化檢視。

目前的限制

Cassandra 預覽實作具體化檢視的 API 有一些限制:

  • 在帳戶上啟用具體化檢視之前已存在的資料表上無法建立具體化檢視。 若要使用具體化檢視,請在啟用功能之後建立新的資料表。
  • 針對具體化檢視定義中的 WHERE 子句,目前只允許 IS NOT NULL 篩選條件。
  • 根據基底資料表建立具體化檢視之後,基底資料表架構上不允許 ALTER TABLE ADD 作業。 只有在具體化檢視的定義中未選取*任何具體化檢視時,才允許使用 ALTER TABLE APP
  • 分割區索引碼大小限制 (2 Kb),以及叢集金鑰大小的總長度 (1 Kb)。 如果超過此大小限制,則負責任訊息最終會位於有害訊息佇列中。
  • 如果基底資料表具有使用者定義型別 (UDT),而且具體化檢視定義有 SELECT * FROM 或其中一個投影資料行中的 UDT,則帳戶上不允許 UDT 更新。
  • 具體化檢視在自動區域容錯移轉之後,可能會與幾個資料列的基底資料表不一致。 若要避免這種不一致,請在容錯移轉之後重建具體化檢視。
  • 不支援使用 32 個核心建立具體化檢視建立器執行個體。 如有需要,您可以建立多個具有較小核心的建立器執行個體。

除了上述限制之外,請考慮下列額外限制:

  • 可用性區域
    • 具體化檢視無法在其區域已啟用可用性區域的帳戶上啟用。
    • 將帳戶上的 enableMaterializedViews 設定為 true 之後,將不支援新增具有可用性區域的新區域。
  • 定期備份和還原
    • 具體化檢視不會隨著還原程序自動還原。 您必須在還原程序完成後重新建立具體化檢視。 然後,您應該在還原的帳戶上設定 enableMaterializedViews,再重新建立具體化檢視和建立器。
  • Apache Cassandra
    • 不允許在具體化檢視上定義衝突解決原則。
    • 具體化檢視上不允許來寫入作業。
    • 具體化檢視上不支援跨文件查詢和使用彙總函式。
    • 具體化檢視的架構無法在建立之後修改。
    • 如果至少已定義一個具體化檢視,則不允許刪除基底資料表。 必須先刪除所有檢視,才能刪除基底資料表。
    • 不允許在具有靜態資料行的容器上定義具體化檢視

下一步