すべてのプロダクト
Search
ドキュメントセンター

Lindorm:列指向データへのアクセス

最終更新日:Jan 14, 2025

列指向ストレージは、列ごとにデータを格納および処理するデータ管理方法です。Lindorm コンピュートエンジンは、半構造化データと構造化データを格納するために列指向ストレージを提供します。行指向ストレージと比較して、列指向ストレージはクエリ応答時間を短縮し、I/O リソースを節約します。このトピックでは、コンピューティングエンジンを使用して Lindorm 列指向データにアクセスする方法について説明します。

背景情報

Lindorm 列指向ストレージは、列指向の分散ストレージサービスです。列指向ストレージは、車載インターネット (IoV)、モノのインターネット (IoT)、注文、ログなどのシナリオで大量の半構造化データと構造化データを格納するのに適しています。列指向ストレージは、次のコア機能を提供します。

  • コンピューティングと分析

    Lindorm コンピュートエンジンは、列指向データにアクセスして、インタラクティブな分析とオンラインコンピューティングを実行できます。列指向ストレージは、データ分散機能と豊富なインデックス機能を提供し、計算プロセスにおけるデータの位置特定と配置を効果的に高速化できます。SQL ステートメントを使用して、大量の主キーデータを追加、削除、変更、およびクエリできます。

  • 高スループット

    列指向ストレージは水平方向のスケーリングをサポートし、1 分あたりテラバイトのデータを読み書きする機能を提供します。これにより、IoV データの迅速なインポート、モデル トレーニング データセット アクセス、大規模なレポート分析と生成などの高スループット データシナリオに適しています。

  • 費用対効果

    Lindorm は、列指向の高圧縮率アルゴリズム、高密度低コストメディア、ホットデータとコールドデータの分離、圧縮エンコーディング、コールドデータアーカイブストレージなどのテクノロジーを実装しています。自己管理型ストレージと比較して、Lindorm 列指向ストレージはストレージコストを大幅に削減し、大量のデータを低コストでアーカイブおよび保存できます。

  • 高可用性

    イレージャーコーディングなどのテクノロジーを使用することにより、Lindorm 列指向ストレージは分散データセットの高可用性を確保し、単一障害点 (SPOF) のリスクを排除します。

  • オープンソースサービスとの互換性

    列指向ストレージは、Iceberg API などの複数のオープンソース標準 API と互換性があります。列指向ストレージは、Spark や Flink などのコンピューティングエンジンにも接続できます。このようにして、列指向ストレージを主流のデータエコシステムにシームレスに統合できます。

  • ホットデータとコールドデータの分離

    ビジネス要件に基づいて、ホットデータとコールドデータを異なるストレージメディアに保存できます。これにより、コールドデータへのアクセスによって発生するパフォーマンスオーバーヘッドを削減しながら、ストレージコストを効果的に削減できます。

前提条件

機能説明

DDL

名前空間

名前空間 (データベース) を作成します。

USE lindorm_columnar;
CREATE NAMESPACE mydb;

名前空間 (データベース) を削除します。

USE lindorm_columnar;
DROP NAMESPACE mydb;

テーブル

テーブルを作成します。

USE lindorm_columnar;
CREATE TABLE mydb.mytable (
  id INT NOT NULL,
  city STRING NOT NULL,
  name STRING,
  score INT)
PARTITIONED BY (city, bucket(128,id))
TBLPROPERTIES(
  'primary-key' = 'id,city');

次のセクションでは、主キーとデータパーティション分割方法について説明します。

主キー

テーブルを作成するときに、主キーを指定して主キーテーブルを作成するか、主キーを指定せずに非主キーテーブルを作成できます。次のリストは、主キーテーブルと非主キーテーブルを作成する方法、およびテーブルを作成するときに従う必要があるルールについて説明しています。

  • 主キーテーブルを作成します。テーブルを作成するときは、TBLPROPERTIES 句で primary-key パラメーターを指定します。テーブルの主キーフィールドのみを指定する必要があります。主キーテーブルは、次の要件を満たしている必要があります。

    • 複数のフィールドはコンマ (,) で区切られます。BOOLEAN、BYTE、SHORT、INT、LONG、FLOAT、DOUBLE、STRING、BINARY のデータ型がサポートされています。

    • 列指向テーブルの主キーは一意です。

    • 主キーが複数回書き込まれた場合、新しいデータは古いデータを上書きします。

    • パーティションを指定する必要があります。テーブルパーティション式フィールドは主キーフィールドである必要があります。最終レベルのパーティションはバケットパーティションである必要があります。

  • 非主キーテーブルを作成します。テーブルを作成するときは、TBLPROPERTIES 句で primary-key パラメーターを指定しないでください。非主キーテーブルはパーティション分割を必要とせず、データの一意性を保証しません。この場合、重複データが存在する可能性があります。

データパーティション分割方法

テーブルを作成するときは、PARTITIONED BY([標準パーティション式],{bucket(bucketNum,bucketCol)}) 句を使用して、データパーティション分割方法を指定します。

  • バケットパーティション式

    • bucketNum パラメーターはシャードの数を指定します。これは、データの書き込みとスキャンの同時実行性に直接影響します。

      説明

      異なるバケットパーティションは異なるパーティション ID を持ち、これは bucket_index パラメーターによって指定されます。bucketNum パラメーターは、標準パーティション内のバケットパーティションの数を決定します。

      • bucket_index パラメーターの値を取得するには、ハッシュ関数を使用して特定のパーティションフィールドのハッシュ値を取得し、次に Hash 値を bucketNum パラメーターの値で除算した剰余を取得します。たとえば、mydb.mytable テーブルでは、バケットインデックスは bucket_index = hash(id)%128 として計算されます。

      • 基になるストレージは、bucket_index パラメーターの値に基づいてパーティション分割されます。テーブルを作成する前にデータの総量を評価し、bucketNum パラメーターを適切に指定して、単一のバケットパーティション内のデータ量が 50 ~ 512 MB になるようにすることをお勧めします。

    • bucketCol パラメーターはバケットパーティションフィールドを指定します。

      重要

      データの偏りを避けるために、bucketCol パラメーターの値が離散的であることを確認してください。

    テーブルを作成するときにバケットパーティションのみを指定します。

    • 例 1:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id');
    • 例 2:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        timestamp LONG NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (bucket(512,timestamp))
      TBLPROPERTIES(
        'primary-key' = 'id,timestamp');
  • 標準パーティション式

    標準パーティション式の場合、個別の値ごとに、基になるストレージに物理パーティションが作成されます。このパーティション分割メカニズムは、データプルーニングによってクエリのパフォーマンスを最適化するのに役立ちます。

    重要

    標準パーティション式の値が集中していることを確認してください。一般的なパーティションフィールドには、日付、都市、性別などがあります。標準パーティション式にタイムスタンプなどの離散値が含まれている場合、大量の列指向メタデータが生成される可能性があります。

    テーブルを作成するときに、標準パーティションとバケットパーティションを同時に指定します。

    • 例 1:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        year STRING NOT NULL,
        month STRING NOT NULL,
        day STRING NOT NULL,
        city STRING,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (year, month, day, bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id, year, month, day');
    • 例 2:

      USE lindorm_columnar;
      CREATE TABLE mydb.mytable (
        id INT NOT NULL,
        date STRING NOT NULL,
        city STRING NOT NULL,
        name STRING,
        score DOUBLE)
      PARTITIONED BY (date, city, bucket(1024,id))
      TBLPROPERTIES(
        'primary-key' = 'id,date,city');

現在の名前空間内のテーブルを表示します。

USE lindorm_columnar;
USE mydb;
SHOW TABLES;

既存のテーブルを表示します。

次の SQL ステートメントを実行して、テーブルスキーマを表示できます。

USE lindorm_columnar;
SHOW CREATE TABLE mydb.mytable;
DESC mydb.mytable;

特定のテーブルを削除します。

USE lindorm_columnar;
-- テーブルを削除し、データファイルを保持します。
DROP TABLE mydb.mytable;
-- テーブルとデータファイルを削除します。
DROP TABLE mydb.mytable PURGE;

テーブル内のデータをクリアします。

USE lindorm_columnar;
TRUNCATE TABLE mydb.mytable;

パーティション

パーティションを削除します。

WHERE 句を指定して DELETE FROM ステートメントを実行することで、パーティションを削除できます。例:

USE lindorm_columnar;
DELETE FROM mydb.mytable WHERE city = 'beijing';

DML

テーブル

テーブルにデータを挿入します。

  • 例 1:

    USE lindorm_columnar;
    INSERT INTO mydb.mytable VALUES (0, 'beijing', 'zhang3', 99);
  • 例 2:

    USE lindorm_columnar;
    INSERT INTO mydb.mytable SELECT id, city, name, score FROM another_table;

テーブル内のデータをクエリします。

  • 例 1:

    USE lindorm_columnar;
    SELECT * from mydb.mytable where id=0;
  • 例 2:

    USE lindorm_columnar;
    SELECT count(1), sum(score) from mydb.mytable where city = 'beijing';

パーティション内のデータの書き換え

一定期間、列指向パーティションにデータを書き込んだ後、rewrite_data_files コマンドまたは rewrite_manifest コマンドを実行してデータを書き換えることができます。たとえば、小さなファイルを大きなファイルに結合して、データまたはメタデータの冗長性を削減し、データクエリの パフォーマンスを向上させることができます。詳細については、「rewrite_data_files」および「rewrite_manifest」をご参照ください。

説明

rewrite_data_files コマンドまたは rewrite_manifest コマンドを実行すると、データベースリソースが消費されます。オフピーク時にコマンドを実行することをお勧めします。

  • 例 1:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');
  • 例 2:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');
  • 例 3:

    USE lindorm_columnar;
    CALL lindorm_columnar.system.rewrite_manifest('mydb.mytable'); 

ホットデータとコールドデータのストレージ

ほとんどの場合、頻繁にアクセスされるデータは高 パフォーマンス ストレージに保存され、アクセス頻度の低い履歴データは低コストストレージに移行されます。これにより、ストレージコストを削減し、 パフォーマンス を向上させることができます。Lindorm は、L1、L2、L3 の 3 つのレベルでホットデータとコールドデータの分離をサポートしています。ビジネス要件に基づいて、ホットデータとコールドデータ間の変換ポリシーを開発できます。データレイクサービスを使用して、ホットデータストレージとコールドデータストレージ間でデータを自動的にダンプできます。これにより、主要サービスの応答時間を延長することなく、ストレージコストを効果的に管理できます。

重要

Lindorm で列指向データの自動ホットコールド変換機能を有効にするには、Lindorm テクニカルサポート (DingTalk ID: s0s3eg3) にお問い合わせください。

パラメーター

列指向テーブルを作成するときは、コールドまたはホットストレージ (CHS) 属性を定義して、列指向テーブルの時間パーティションに基づいてコールドストレージとホットストレージ間でデータをダンプする方法を指定できます。次の表に、CHS パラメーターの構成方法を示します。

パラメーター

説明

CHS

コールドデータとホットデータの分離機能を有効にするかどうかを指定します。次のリストは、このパラメーターを指定する方法について説明しています。

  • 1 つの長い整数。単位: 秒。

    • パーティションのデータ時間と現在の時間との差が値以下の場合、データは L1 に保存されます。

    • パーティションのデータ時間と現在の時間との差が値より大きい場合、データは自動的に L2 にダンプされます。

    説明

    このパラメーターが 259200 に設定されている場合、コールドデータとホットデータは 2 つのレイヤーに個別に保存されます。

    • パーティションデータ時間と現在の時間との差が 259,200 秒以下の場合、データは L1 に保存されます。

    • パーティションデータ時間と現在の時間との差が 259,200 秒より大きい場合、データは自動的に L2 にダンプされます。

  • 2 つの長い整数。単位: 秒。2 つの長い整数をコンマで区切ります。例: num0, num1。ここで、num0 は num1 より小さくなければなりません

    • パーティションのデータ時間と現在の時間との差が最初の値以下の場合、データは L1 に保存されます。

    • パーティションのデータ時間と現在の時間との差が最初の値より大きく、2 番目の値以下の場合、データは自動的に L2 にダンプされます。

    • パーティションのデータ時間と現在の時間との差が 2 番目の値より大きい場合、データは自動的に L3 にダンプされます。

    説明

    このパラメーターが 259200, 864000 に設定されている場合、コールドデータとホットデータは 3 つのレイヤーに個別に保存されます。

    • パーティションデータ時間と現在の時間との差が 259,200 秒以下の場合、データは L1 に保存されます。

    • パーティションデータ時間と現在の時間との差が 259,200 秒より大きく、864,000 秒以下の場合、データは自動的に L2 にダンプされます。

    • パーティションデータ時間と現在の時間との差が 864,000 秒より大きい場合、データは自動的に L3 にダンプされます。

CHS_L1

L1 のストレージタイプを指定します。形式: 'CHS_L1'='storagetype=<目的のストレージタイプ>'

説明

テーブルを作成するときにこのパラメーターを指定しない場合、デフォルトのストレージタイプは Capacity ストレージです。

クラウドにデータを保存する場合、目的のストレージタイプを次のいずれかの値に設定できます。

  • CAPACITY_CLOUD_STORAGE (デフォルト): Capacity ストレージにデータを保存します。

  • STANDARD_CLOUD_STORAGE: 標準ストレージにデータを保存します。

  • PERFORMANCE_CLOUD_STORAGE: パフォーマンス ストレージにデータを保存します。

  • CLOUD_ARCHIVE_STORAGE: アーカイブストレージにデータを保存します。

    説明

    アーカイブストレージは内部プレビュー中です。アーカイブストレージを使用するには、Lindorm テクニカルサポート (DingTalk ID: s0s3eg3) にお問い合わせください。

ローカルディスクにデータを保存する場合、目的のストレージタイプを次のいずれかの値に設定できます。

  • CAPACITY_CLOUD_STORAGE (デフォルト): Capacity ストレージにデータを保存します。

  • LOCAL_SSD_STORAGE: ローカル SSD にデータを保存します。

  • LOCAL_HDD_STORAGE: 大量のデータを保存します。

  • LOCAL_EBS_STORAGE: ローカル ESSD にデータを保存します。

CHS_L2

L2 のストレージタイプを指定します。CHS_L2 の形式と有効な値は CHS_L1 と同じです。

説明

CHS_L2 パラメーターを指定する必要があります。

CHS_L3

L3 のストレージタイプを指定します。CHS_L3 の形式と有効な値は CHS_L1 と同じです。

説明

CHS パラメーターに 2 つの長い整数を設定する場合は、CHS_L3 パラメーターを指定する必要があります。

CHS_EXP

パーティションデータ時間の取得方法を指定します。形式: toSec(${column0},${pattern0},${column1},${pattern1},...${columnN},${patternN})

説明:

  • columnN: 時間パーティションフィールド。サポートされているデータ型は、INTEGER、LONG、STRING、DATE です。

  • patternN: 対応する時間パーティションフィールドの形式。有効な値:

    • yyyy: 年

    • MM: 月

    • dd: 日

    • HH: 時

    • mm: 分

  • toSec: 対応する時間パーティションの最大データ時間を計算するシステム関数。例:

    • 時間パーティションフィールドが年、月、日であるとします。year=2023, month=10, day=2 パーティションの場合、toSec(year, yyyy) は 2023-12-31 23:59:59 を返し、toSec(year, yyyy, month, MM) は 2023-10-31 23:59:59 を返し、toSec(year, yyyy, month, MM,day,'dd') は 2023-10-02 23:59:59 を返します。

    • 時間パーティションフィールドが日付であるとします。date=2023-10-02 パーティションの場合、toSec(date, yyyy-MM-dd) は 2023-10-02 23:59:59 を返します。

Lindorm コンピュートエンジンは、CHS_EXP パラメーターから返された最大パーティションデータ時間を取得し、CHS パラメーターで指定された値に基づいてパーティションデータを対応するストレージにダンプします。

  • 例 1:

    table0 という名前のテーブルを作成します。パーティションフィールド名は、年、月、日です。指定したホットデータとコールドデータの分離ポリシーに基づいて、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされます。次のステートメントを実行してテーブルを作成できます。

    CREATE TABLE table0 (col0 INT,year STRING,month STRING,day STRING)
    PARTITIONED BY  (year,month)
    TBLPROPERTIES 
    'CHS'='2592000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)'
    );
  • 例 2:

    table0 のホットデータとコールドデータの分離ポリシーを変更します。変更後、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされ、3 か月 (5,184,000 秒) 前に保存されたデータは自動的にアーカイブストレージにダンプされます。次のステートメントを実行してテーブルを更新できます。

    ALTER TABLE table0
    SET TBLPROPERTIES (
    'CHS'='2592000,5184000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE',
    'CHS_EXP'='toSec(year,yyyy,month,MM,day,dd)'
    );
  • 例 3:

    table1 という名前のテーブルを作成します。パーティションフィールド名は dt です。例: 2020/12/1。指定したホットデータとコールドデータの分離ポリシーに基づいて、1 か月 (2,592,000 秒) 前に保存されたデータは自動的に Capacity ストレージにダンプされ、3 か月 (5,184,000 秒) 前に保存されたデータは自動的にアーカイブストレージにダンプされます。次のステートメントを実行してテーブルを作成できます。

    CREATE TABLE table1 (col0 INT,dt STRING)
    PARTITIONED BY  (dt)
    TBLPROPERTIES (
    'CHS'='2592000,5184000',
    'CHS_L2'='storagetype=CAPACITY_CLOUD_STORAGE',
    'CHS_L3'='storagetype=CLOUD_ARCHIVE_STORAGE',
    'CHS_EXP'='toSec(dt,yyyy/MM/dd)'
    );
注意事項
  • テーブルを作成するときに CHS パラメーターを指定できます。ホットデータとコールドデータの分離ポリシーを変更する場合は、ALTER TABLE ...SET TBLPROPERTIES... ステートメントを実行できます。

  • CHS パラメーターを誤って指定した場合、テーブルは予期どおりに作成および更新できますが、コールドストレージとホットストレージ間でデータを自動的にダンプすることはできません。

  • ホットデータとコールドデータのダンプは非同期モードでトリガーされます。データダンプ中およびデータダンプ後もデータアクセスは影響を受けませんが、アクセス パフォーマンス はストレージメディアによって異なる場合があります。

  • 列指向テーブルの時間パーティションに基づいてのみ、ホットデータとコールドデータの分離ポリシーを実装できます。

ベストプラクティス

次の方法を使用して、データクエリまたはコンピューティングを高速化できます。

主キーを指定する

大量のデータセットがテーブルに保存されている場合は、主キーを指定してクエリを高速化できます。主キーデータの範囲が小さいほど、高速化の結果が向上します。

この例では、次のステートメントを実行してサンプルテーブルを作成します。

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE,
o_orderdate      STRING,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey');           
  • 例 1:

    USE lindorm_columnar;
    SELECT * FROM orders WHERE o_orderkey=18394;
  • 例 2:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_orderkey>100000 AND o_orderkey<200000;
  • 例 3:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_orderkey>100000;

パーティションを追加する

Lindorm の列指向ストレージエンジンでは、パーティションは互いに物理的に分離されています。パーティションを追加して、データクエリを高速化できます。

この例では、次のステートメントを実行してサンプルテーブルを作成します。

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE,
o_orderdate      STRING NOT NULL,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderdate,o_orderkey');
  • 例 1:

    USE lindorm_columnar;
    SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate='2022-01-01' GROUP BY o_orderdate;
  • 例 2:

    USE lindorm_columnar;
    SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate>='2022-01-01' AND o_orderdate<='2022-01-07' GROUP BY o_orderdate;

クエリ高速化

特定のテーブルまたはテーブルの特定のパーティション内のデータを書き換えることができます。これにより、データの秩序とコンパクトさが向上し、データスキャン パフォーマンス が向上します。

この例では、次のステートメントを実行してサンプルテーブルを作成します。

CREATE TABLE mydb.mytable (
  id INT NOT NULL, 
  city STRING NOT NULL, 
  name STRING, 
  score INT)
partitioned by (city, bucket(4, id))
tblproperties('primary-key' = 'id,city');
  • 例 1: mydb.mytable テーブル内のデータを書き換えます。

    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable');
  • 例 2: 特定のパーティション内のデータを書き換えます。

    CALL lindorm_columnar.system.rewrite_data_files(table => 'mydb.mytable', where => 'city=\"beijing\"');

データを書き換えた後、クエリの効率をさらに向上させたい場合は、次のステートメントを実行してテーブルパラメーターを指定できます。

ALTER TABLE mydb.mytable SET TBLPROPERTIES ('read.scan-major-rewritten-files-only' = true);

パラメーターの説明

read.scan-major-rewritten-files-only: クエリのデータ範囲を指定します。データ型は BOOLEAN です。有効な値:

  • true: 書き換えられたデータのみをクエリします。書き換えられていない増分データはクエリしません。

  • false (デフォルト): すべてのデータをクエリします。

非主キークエリ

パーティション内のデータを書き換えると、データは列指向テーブルの主キーでソートされます。テーブルを作成した後、要件に基づいてソートキーを指定して、非主キークエリの高速化できます。

重要

ソートキーを指定した後、パーティション内のデータを書き換えて、高速化 パフォーマンス を確保する必要があります。書き換えられたデータのみをクエリでき、増分データはクエリできません。

この例では、次のステートメントを実行してサンプルテーブルを作成します。

USE lindorm_columnar;
CREATE TABLE orders (
o_orderkey       INT NOT NULL,
o_custkey        INT,
o_orderstatus    STRING,
o_totalprice     DOUBLE ,
o_orderdate      STRING ,
o_orderpriority  STRING,
o_clerk          STRING,
o_shippriority   INT,
o_comment        STRING)
PARTITIONED BY (bucket(1024,o_orderkey))
TBLPROPERTIES(
'primary-key' = 'o_orderkey',
'read.scan-major-rewritten-files-only' = 'true');

次のステートメントを実行して、ソートキーを指定します。

ALTER TABLE orders WRITE ORDERED BY o_shippriority,o_totalprice;

次のステートメントを実行して、データを書き換えます。

CALL lindorm_columnar.system.rewrite_data_files(table => 'orders');

次の SQL ステートメントを実行して、書き換えられたデータをクエリできます。

  • 例 1:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_shippriority=0;
  • 例 2:

    USE lindorm_columnar;
    SELECT count(*) FROM orders WHERE o_shippriority=0 AND o_totalprice>999.9;