メインコンテンツまでスキップ

SQL

SQL

このトピックでは、SQLに関するよくある質問に対する回答を提供します。

マテリアライズドビューをビルドする際に「メモリの割り当てに失敗しました。」というエラーが発生する

この問題を解決するには、be.confファイルでmemory_limitation_per_thread_for_schema_changeパラメータの値を増やしてください。このパラメータは、単一のタスクで変更スキーマのために割り当てられる最大ストレージを指します。最大ストレージのデフォルト値は2 GBです。

StarRocksはクエリの結果をキャッシュしますか?

StarRocksは直接最終のクエリ結果をキャッシュしません。v2.5以降、StarRocksはクエリキャッシュ機能を使用して、最初の段階の集計の中間結果をキャッシュに保存します。以前のクエリと意味的に同等の新しいクエリは、キャッシュされた計算結果を再利用して計算を高速化することができます。クエリキャッシュはBEメモリを使用します。詳細については、クエリキャッシュを参照してください。

Nullを含んだ計算では、ISNULL()関数以外の関数の計算結果は正しくありません

標準のSQLでは、Null値を含むオペランドの計算はすべてNullを返します。

BIGINTデータ型の値を等価クエリの値に引用符で括ると、クエリ結果が正しくありません。なぜですか?

問題の説明

次の例を参照してください。

select cust_id,idno 

from llyt_dev.dwd_mbr_custinfo_dd

where Pt= ‘2021-06-30’

and cust_id = ‘20210129005809043707’

limit 10 offset 0;
+---------------------+-----------------------------------------+

| cust_id | idno |

+---------------------+-----------------------------------------+

| 20210129005809436 | yjdgjwsnfmdhjw294F93kmHCNMX39dw= |

| 20210129005809436 | sdhnswjwijeifme3kmHCNMX39gfgrdw= |

| 20210129005809436 | Tjoedk3js82nswndrf43X39hbggggbw= |

| 20210129005809436 | denuwjaxh73e39592jwshbnjdi22ogw= |

| 20210129005809436 | ckxwmsd2mei3nrunjrihj93dm3ijin2= |

| 20210129005809436 | djm2emdi3mfi3mfu4jro2ji2ndimi3n= |

+---------------------+-----------------------------------------+
select cust_id,idno

from llyt_dev.dwd_mbr_custinfo_dd

where Pt= ‘2021-06-30’

and cust_id = 20210129005809043707

limit 10 offset 0;
+---------------------+-----------------------------------------+

| cust_id | idno |

+---------------------+-----------------------------------------+

| 20210189979989976 | xuywehuhfuhruehfurhghcfCNMX39dw= |

+---------------------+-----------------------------------------+

解決方法

STRINGデータ型とINTEGERデータ型を比較する際には、これらの2つの型のフィールドがDOUBLEデータ型に変換されます。そのため、引用符を追加することはできません。そうしないと、WHERE句で定義された条件がインデックス化されなくなります。

StarRocksはDECODE関数をサポートしていますか?

StarRocksはOracleデータベースのDECODE関数をサポートしていません。StarRocksはMySQLと互換性がありますので、CASE WHEN文を使用することができます。

StarRocksのプライマリキーテーブルにデータをロードした後、最新のデータを即座にクエリできますか?

はい。StarRocksはGoogle Mesaを参照してデータをマージします。StarRocksでは、BEがデータのマージをトリガーし、2つの種類の圧縮方式でデータをマージします。データマージが完了していない場合、クエリ実行時に完了されます。したがって、データローディング後に最新のデータを読み取ることができます。

StarRocksに格納されたutf8mb4の文字は切り捨てられるか文字化けが表示されますか?

いいえ。

alter tableコマンドを実行すると「table's state is not normal」というエラーが発生する

このエラーは、以前の変更が完了していないために発生します。次のコードを実行して、以前の変更のステータスを確認することができます。

show tablet from lineitem where State="ALTER";

変更操作にかかる時間はデータのボリュームに関係します。通常、数分で変更が完了します。StarRocksのテーブルを変更している間は、データのロードを停止することをおすすめします。データのロードは変更が完了する速度を低下させるためです。

Apache Hiveの外部テーブルをクエリする際に「get partition detail failed: org.apache.doris.common.DdlException: get hive partition meta data failed: java.net.UnknownHostException:hadooptest」というエラーが発生する

このエラーは、Apache Hiveパーティションのメタデータを取得できない場合に発生します。この問題を解決するには、core-sit.xmlhdfs-site.xmlfe.confファイルとbe.confファイルにコピーしてください。

データをクエリする際に「planner use long time 3000 remaining task num 1」というエラーが発生する

このエラーは、通常ガベージコレクション(GC)がフルに実行されたことによるものです。バックエンドの監視とfe.gcログを使用して確認できます。この問題を解決するには、次のいずれかの操作を実行してください。

  • SQLのクライアントが複数のフロントエンド(FE)に同時にアクセスできるようにすることで負荷を分散させます。
  • fe.confファイルでJava仮想マシン(JVM)のヒープサイズを8GBから16GBに変更し、メモリを増やしてフルGCの影響を軽減します。

列Aのカーディナリティが小さい場合、select B from tbl order by A limit 10のクエリ結果は毎回異なります

SQLは列Aが順序付けられることを保証することができますが、列Bの順序が各クエリごとに同じであることを保証することはできません。MySQLはスタンドアロンのデータベースであるため、列Aと列Bの順序を保証することができます。

StarRocksは分散データベースであり、基礎となるテーブルに保存されるデータはシャーディングパターンを持っています。列Aのデータは複数のマシンに分散されているため、複数のマシンから返される列Bの順序はクエリごとに異なる場合があります。この問題を解決するには、select B from tbl order by A,B limit 10に変更してください。

SELECT *とSELECTの効率の差が大きいのはなぜですか?

この問題を解決するには、プロファイルを確認し、MERGEの詳細を確認します。

  • ストレージ層の集計が時間を多く取っていないか確認してください。
  • インジケータカラムが多すぎる場合は確認してください。これにより、何百万行の何百以上の列を集計することになります。
MERGE:

- aggr: 26s270ms

- sort: 15s551ms

DELETEはネストされた関数をサポートしていますか?

ネストされた関数はサポートされていません。たとえば、DELETE from test_new WHERE to_days(now())-to_days(publish_time) >7;のような形式のto_days(now())はサポートされていません。

何百のテーブルが含まれるデータベースの使用効率を向上させるにはどうすればよいですか?

効率を向上させるためには、MySQLのクライアントサーバに接続する際に-Aパラメータを追加します: mysql -uroot -h127.0.0.1 -P8867 -A。MySQLのクライアントサーバはデータベース情報を事前に読み込みません。

BEログとFEログが占めるディスクスペースを減らすにはどうすれば良いですか?

ログレベルとそれに対応するパラメータを調整してください。詳細については、パラメータの設定を参照してください。

レプリケーション数を変更する際に「table *** is colocate table, cannot change replicationNum」というエラーが発生する

コロケートテーブルを作成する場合は、groupプロパティを設定する必要があります。したがって、単一のテーブルのレプリケーション数を変更することはできません。次の手順でグループ内のすべてのテーブルのレプリケーション数を変更できます。

  1. グループ内のすべてのテーブルのgroup_withemptyに設定します。
  2. グループ内のすべてのテーブルに適切なreplication_numを設定します。
  3. group_withを元の値に戻します。

VARCHARを最大値に設定するとストレージに影響がありますか?

VARCHARは可変長のデータ型で、実際のデータの長さに合わせて変更することができる指定長さを持っています。テーブルを作成する際に異なるvarchar長さを指定しても、同じデータに対するクエリのパフォーマンスにほとんど影響はありません。

Truncateコマンドを実行すると「create partititon timeout」というエラーが発生する

テーブルを切り捨てるには、対応するパーティションを作成してから入れ替える必要があります。作成する必要があるパーティションが多すぎる場合、このエラーが発生します。また、多くのデータロードタスクがある場合、コンパクションプロセス中にロックが長時間維持されます。そのため、テーブルの作成時にロックを取得できません。データロードタスクが多すぎる場合は、be.confファイルでtablet_map_shard_size512に設定してロック競合を減らすことをおすすめします。

Apache Hiveの外部テーブルへのアクセス時に「Failed to specify server's Kerberos principal name」というエラーが発生する

次の情報をfe.confファイルとbe.confファイルのhdfs-site.xmlに追加してください。

<property>

<name>dfs.namenode.kerberos.principal.pattern</name>

<value>*</value>

</property>

"2021-10"はStarRocksの日付形式ですか?

いいえ。

"2021-10"をパーティションフィールドとして使用できますか?

いいえ、関数を使用して"2021-10"を"2021-10-01"に変更し、"2021-10-01"をパーティションフィールドとして使用します。

StarRocksのデータベースやテーブルのサイズはどこでクエリできますか?

SHOW DATAコマンドを使用できます。

SHOW DATA;は現在のデータベースのすべてのテーブルのデータサイズとレプリカ数を表示します。

SHOW DATA FROM <db_name>.<table_name>;は指定したデータベースの指定したテーブルのデータサイズ、レプリカ数、行数を表示します。