TiFlash互換性に関する注意事項

TiFlash は、次の状況では TiDB と互換性がありません。

  • TiFlash計算レイヤー内:

    • オーバーフローした数値のチェックはサポートされていません。たとえば、 BIGINTの 2 つの最大値を加算すると、 9223372036854775807 + 9223372036854775807 。 TiDB でのこの計算の予期される動作は、 ERROR 1690 (22003): BIGINT value is out of rangeエラーを返すことです。ただし、この計算がTiFlashで実行される場合、エラーなしでオーバーフロー値-2が返されます。

    • ウィンドウ機能はサポートされていません。

    • TiKV からのデータの読み取りはサポートされていません。

    • 現在、 TiFlashのsum関数は文字列型の引数をサポートしていません。ただし、TiDB はコンパイル中に文字列型の引数がsum関数に渡されたかどうかを識別できません。したがって、 select sum(string_col) from tのようなステートメントを実行すると、 TiFlash は[FLASH:Coprocessor:Unimplemented] CastStringAsReal is not supported.エラーを返します。この場合にこのようなエラーを回避するには、この SQL ステートメントをselect sum(cast(string_col as double)) from tに変更する必要があります。

    • 現在、TiFlash の小数除算計算は TiDB のものと互換性がありません。たとえば、10 進数を除算する場合、 TiFlash は常にコンパイルから推測される型を使用して計算を実行します。ただし、TiDB は、コンパイルから推測される型よりも正確な型を使用してこの計算を実行します。したがって、小数除算を含む一部の SQL ステートメントは、 TiDB + TiKV と TiDB + TiFlashで実行すると異なる実行結果を返します。例えば:

      mysql> create table t (a decimal(3,0), b decimal(10, 0)); Query OK, 0 rows affected (0.07 sec) mysql> insert into t values (43, 1044774912); Query OK, 1 row affected (0.03 sec) mysql> alter table t set tiflash replica 1; Query OK, 0 rows affected (0.07 sec) mysql> set session tidb_isolation_read_engines='tikv'; Query OK, 0 rows affected (0.00 sec) mysql> select a/b, a/b + 0.0000000000001 from t where a/b; +--------+-----------------------+ | a/b | a/b + 0.0000000000001 | +--------+-----------------------+ | 0.0000 | 0.0000000410001 | +--------+-----------------------+ 1 row in set (0.00 sec) mysql> set session tidb_isolation_read_engines='tiflash'; Query OK, 0 rows affected (0.00 sec) mysql> select a/b, a/b + 0.0000000000001 from t where a/b; Empty set (0.01 sec)

      上の例では、コンパイルから推測されるa/bの型は、 TiDB とTiFlashの両方でDecimal(7,4)です。 Decimal(7,4)による制約により、 a/bの戻り値の型は0.0000になる必要があります。 TiDB では、 a/bの実行時精度はDecimal(7,4)よりも高いため、元のテーブル データはwhere a/b条件によってフィルターされません。ただし、 TiFlashでは、 a/bの計算では結果のタイプとしてDecimal(7,4)が使用されるため、元のテーブル データはwhere a/b条件によってフィルターされます。

このページは役に立ちましたか?