Перейти к основному содержимому
Версия: 2.0.x

SQL-запросы

В этом разделе приведены ответы на часто задаваемые вопросы о SQL.

Ошибка "fail to allocate memory." при создании материализованного представления

Чтобы решить эту проблему, увеличьте значение параметра memory_limitation_per_thread_for_schema_change в файле be.conf. Этот параметр относится к максимальному объёму хранилища, который может быть выделен для одной задачи изменения схемы. Значение по умолчанию максимального объёма хранилища составляет 2 ГБ.

Поддерживает ли Selena кэширование результатов запросов?

Selena не кэширует напрямую окончательные результаты запросов. Начиная с версии v1.5.2, Selena использует функцию Query Cache для сохранения промежуточных результатов агрегации первого этапа в кэше. Новые запросы, семантически эквивалентные предыдущим запросам, могут повторно использовать кэшированные результаты вычислений для ускорения вычислений. Кэш запросов использует память BE. Дополнительную информацию см. в разделе Кэш запросов.

Когда в вычисление включён Null, результаты вычислений функций ложны, за исключением функции ISNULL()

В стандартном SQL каждое вычисление, включающее операнд со значением NULL, возвращает NULL.

Поддерживает ли Selena функцию DECODE?

Selena не поддерживает функцию DECODE из базы данных Oracle. Selena совместима с MySQL, поэтому вы можете использовать оператор CASE WHEN.

Можно ли запросить последние данные сразу после загрузки данных в таблицу с первичным ключом Selena?

Да. Selena объединяет данные способом, основанным на Google Mesa. В Selena BE запускает слияние данных, и у него есть два типа компактификации для слияния данных. Если слияние данных не завершено, оно завершается во время вашего запроса. Поэтому вы можете читать последние данные после загрузки данных.

Усекаются ли или отображаются с искажениями символы utf8mb4, хранящиеся в Selena?

Нет.

Ошибка "table's state is not normal" возникает при выполнении команды alter table

Эта ошибка возникает потому, что предыдущее изменение не было завершено. Вы можете выполнить следующий код, чтобы проверить статус предыдущего изменения:

show tablet from lineitem where State="ALTER";

Время, затраченное на операцию изменения, зависит от объёма данных. В целом изменение может быть завершено за несколько минут. Рекомендуется прекратить загрузку данных в Selena во время изменения таблиц, поскольку загрузка данных снижает скорость завершения изменения.

Ошибка "get hive partition meta data failed: java.net.UnknownHostException:hadooptest" возникает при запросе внешних таблиц Apache Hive

Эта ошибка возникает, когда невозможно получить метаданные партиций Apache Hive. Чтобы решить эту проблему, скопируйте core-sit.xml и hdfs-site.xml в файл fe.conf и файл be.conf.

Ошибка "planner use long time 3000 remaining task num 1" возникает при запросе данных

Эта ошибка обычно возникает из-за полной сборки мусора (full GC), что можно проверить с помощью мониторинга бэкенда и журнала fe.gc. Чтобы решить эту проблему, выполните одно из следующих действий:

  • Позвольте SQL-клиенту обращаться к нескольким фронтендам (FE) одновременно для распределения нагрузки.
  • Измените размер кучи виртуальной машины Java (JVM) с 8 ГБ на 16 ГБ в файле fe.conf, чтобы увеличить память и уменьшить влияние полной сборки мусора.

Когда кардинальность столбца A мала, результаты запроса select B from tbl order by A limit 10 различаются каждый раз

SQL может гарантировать только то, что столбец A упорядочен, и не может гарантировать, что порядок столбца B будет одинаковым для каждого запроса. MySQL может гарантировать порядок столбцов A и B, потому что это автономная база данных.

Selena — это распределённая база данных, данные которой в базовой таблице хранятся в шардированном формате. Данные столбца A распределены по нескольким машинам, поэтому порядок столбца B, возвращаемый несколькими машинами, может быть разным для каждого запроса, что приводит к несогласованному порядку B каждый раз. Чтобы решить эту проблему, измените select B from tbl order by A limit 10 на select B from tbl order by A,B limit 10.

Почему существует большая разница в эффективности столбцов между SELECT * и SELECT?

Чтобы решить эту проблему, проверьте профиль и посмотрите детали MERGE:

  • Проверьте, не занимает ли агрегация на уровне хранилища слишком много времени.

  • Проверьте, нет ли слишком много столбцов индикаторов. Если да, агрегируйте сотни столбцов миллионов строк.

MERGE:

- aggr: 26s270ms

- sort: 15s551ms

Поддерживает ли DELETE вложенные функции?

Вложенные функции не поддерживаются, такие как to_days(now()) в DELETE from test_new WHERE to_days(now())-to_days(publish_time) >7;.

Как повысить эффективность использования базы данных, когда в ней сотни таблиц?

Для повышения эффективности добавьте параметр -A при подключении к клиентскому серверу MySQL: mysql -uroot -h127.0.0.1 -P8867 -A. Клиентский сервер MySQL не будет предварительно считывать информацию о базе данных.

Как уменьшить дисковое пространство, занимаемое журналами BE и FE?

Настройте уровень журналирования и соответствующие параметры. Дополнительную информацию см. в разделе Конфигурация параметров.

Ошибка "table *** is colocate table, cannot change replicationNum" возникает при изменении количества replica

При создании колоцированных таблиц необходимо установить свойство group. Поэтому вы не можете изменить количество replica для одной таблицы. Вы можете выполнить следующие шаги, чтобы изменить количество replica для всех таблиц в группе:

  1. Установите group_with в empty для всех таблиц в группе.
  2. Установите правильное значение replication_num для всех таблиц в группе.
  3. Верните group_with к исходному значению.

Влияет ли установка максимального значения VARCHAR на хранилище?

VARCHAR — это тип данных переменной длины с указанной длиной, которая может изменяться в зависимости от фактической длины данных. Указание разной длины varchar при создании таблицы мало влияет на производительность запросов к одним и тем же данным.

Ошибка "create partititon timeout" возникает при усечении таблицы

Для усечения таблицы необходимо создать соответствующие партиции, а затем поменять их местами. Если необходимо создать большое количество партиций, возникает эта ошибка. Кроме того, если много задач загрузки данных, блокировка будет удерживаться долго во время процесса компактификации. Поэтому блокировка не может быть получена при создании таблиц. Если слишком много задач загрузки данных, установите tablet_map_shard_size в 512 в файле be.conf, чтобы уменьшить конкуренцию за блокировки.

Ошибка "Failed to specify server's Kerberos principal name" возникает при доступе к внешним таблицам Apache Hive

Добавьте следующую информацию в hdfs-site.xml в файле fe.conf и файле be.conf:

<property>

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

<value>*</value>

</property>

Является ли "2021-10" форматом даты в Selena?

Нет.

Можно ли использовать "2021-10" в качестве поля партиции?

Нет, используйте функции для преобразования "2021-10" в "2021-10-01", а затем используйте "2021-10-01" в качестве поля партиции.

Где можно запросить размер базы данных или таблицы Selena?

Вы можете использовать команду SHOW DATA.

SHOW DATA; отображает размер данных и replica всех таблиц в текущей базе данных.

SHOW DATA FROM <db_name>.<table_name>; отображает размер данных, количество replica и количество строк в указанной таблице указанной базы данных.

В Selena на ES при создании внешней таблицы Elasticsearch, если длина строки слишком велика (превышает 256), и Elasticsearch использует динамическое сопоставление, использование оператора select приведёт к невозможности запросить этот столбец

При динамическом сопоставлении тип данных Elasticsearch:

          "k4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}

Selena использует тип данных keyword для преобразования оператора запроса. Поскольку длина keyword столбца превышает 256, столбец невозможно запросить.

Решение: Удалите сопоставление поля

            "fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}

чтобы использовать вместо него тип text.

Как быстро подсчитать размер баз данных и таблиц Selena и занимаемые ими дисковые ресурсы?

Вы можете использовать команду SHOW DATA для просмотра размера хранилища баз данных и таблиц.

SHOW DATA; отображает объём данных и количество replica всех таблиц в текущей базе данных.

SHOW DATA FROM <db_name>.<table_name>; отображает объём данных, количество replica и количество строк конкретной таблицы в указанной базе данных.

Почему использование функции для ключа партиции замедляет запросы?

Использование функции для ключа партиции может привести к неточной отсечке партиций, тем самым снижая производительность запросов.

Почему оператор DELETE не поддерживает вложенные функции?

mysql > DELETE FROM selena.ods_sale_branch WHERE create_time >= concat(substr(202201,1,4),'01') and create_time <= concat(substr(202301,1,4),'12');

SQL Error [1064][42000]: Right expr of binary predicate should be value

Предикаты BINARY должны быть типа column op literal и не могут быть выражениями. В настоящее время не планируется поддержка выражений в качестве значений сравнения.

Как именовать столбцы с зарезервированными ключевыми словами?

Зарезервированные ключевые слова (например, rank) необходимо экранировать, например, используя `rank`.

Как остановить выполняющийся SQL?

Вы можете использовать show processlist; для просмотра выполняющихся SQL и использовать kill <id>; для завершения соответствующего SQL. Вы также можете просматривать и управлять через SHOW PROC '/current_queries';.

Как очистить неактивные соединения?

Вы можете контролировать тайм-аут для неактивных соединений через сессионную переменную wait_timeout (единица измерения: секунды). MySQL автоматически очищает неактивные соединения примерно через 8 часов по умолчанию.

Выполняются ли несколько SQL-сегментов в UNION ALL параллельно?

Да, они выполняются параллельно.

Что делать, если SQL вызывает сбой BE?

  1. На основе стека ошибок be.out найдите query_id, который вызвал сбой.
  2. Найдите соответствующий SQL в fe.audit.log, используя query_id.

Пожалуйста, соберите и отправьте следующую информацию команде поддержки:

  • Журнал be.out
  • Выполните pstack $be_pid > pstack.log для выполнения SQL.
  • Файл Core Dump

Шаги для сбора Core-файлов:

  1. Получите соответствующий процесс BE:

    ps aux| grep be
  2. Установите лимит размера Core-файла на неограниченный.

    prlimit -p $bePID --core=unlimited:unlimited

    Проверьте, установлен ли лимит размера на неограниченный.

    cat /proc/$bePID/limits

Если значение не 0, система сгенерирует Core-файл в корневом каталоге развертывания BE при сбое процесса.

Как использовать Hints для управления поведением оптимизатора JOIN таблиц?

Поддерживаются подсказки broadcast и shuffle. Например:

  • select * from a join [broadcast] b on a.id = b.id;
  • select * from a join [shuffle] b on a.id = b.id;

Как увеличить параллелизм SQL-запросов?

Путём настройки сессионной переменной pipeline_dop.

Как проверить прогресс выполнения DDL?

  • Просмотр всех задач изменения столбцов в базе данных по умолчанию:

    SHOW ALTER TABLE COLUMN;
  • Просмотр последней задачи изменения столбцов для конкретной таблицы:

    SHOW ALTER TABLE COLUMN WHERE TableName="table1" ORDER BY CreateTime DESC LIMIT 1;

Почему сравнение чисел с плавающей точкой иногда приводит к несогласованным результатам запросов?

Прямое использование чисел с плавающей точкой = для сравнения может привести к нестабильности из-за ошибок. Рекомендуется использовать проверки диапазона.

Почему вычисления с плавающей точкой приводят к ошибкам?

Типы FLOAT/DOUBLE имеют ошибки точности в вычислениях avg, sum и других, что может привести к несогласованным результатам запросов. Для высокой точности используйте тип DECIMAL, но учтите, что производительность снизится в 2-3 раза.

Почему ORDER BY в подзапросе не работает?

При распределённом выполнении, если ORDER BY не указан во внешнем слое подзапроса, глобальный порядок не может быть гарантирован. Это ожидаемое поведение.

Почему результат row_number() несогласован при нескольких выполнениях?

Если поле ORDER BY имеет дубликаты (например, несколько строк с одинаковым createTime), стандарты SQL не гарантируют стабильную сортировку. Рекомендуется включить уникальное поле (например, employee_id) в ORDER BY для обеспечения стабильности.

Какая информация нужна для оптимизации SQL или устранения неполадок?

  • EXPLAIN COSTS <SQL> (включает статистику)

  • EXPLAIN VERBOSE <SQL> (включает типы данных, nullable, стратегии оптимизации)

  • Query Profile (доступен через веб-интерфейс FE по адресу http://<fe_ip>:<fe_http_port>, вкладка Queries)

  • Query Dump (получается через HTTP API)

    wget --user=${username} --password=${password} --post-file ${query_file} http://${fe_host}:${fe_http_port}/api/query_dump?db=${database} -O ${dump_file}

Query Dump включает следующую информацию:

  • Оператор запроса
  • Схема таблицы, на которую ссылается запрос
  • Сессионные переменные
  • Количество BE
  • Статистика (значения Min, Max)
  • Информация об исключениях (стек исключений)

Как проверить перекос данных?

Используйте ADMIN SHOW REPLICA DISTRIBUTION FROM <table> для просмотра распределения tablet.

Как устранить ошибки, связанные с памятью?

Есть три распространённых сценария:

  • Превышен лимит памяти для одного запроса:
    • Ошибка: Mem usage has exceed the limit of single query, You can change the limit by set session variable exec_mem_limit.
    • Решение: Настройте exec_mem_limit
  • Превышен лимит памяти пула запросов:
    • Ошибка: Mem usage has exceed the limit of query pool
    • Решение: Оптимизируйте SQL.
  • Превышен общий лимит памяти BE:
    • Ошибка: Mem usage has exceed the limit of BE
    • Решение: Проанализируйте использование памяти.

Методы анализа памяти:

curl -XGET -s http://BE_IP:BE_HTTP_PORT/metrics | grep "^selena_be_.*_mem_bytes\|^selena_be_tcmalloc_bytes_in_use"
curl -XGET -s http://BE_IP:BE_HTTP_PORT/mem_tracker

Что делать при ошибке Selena planner use long time xxx ms in logical phase?

  1. Проанализируйте fe.gc.log, чтобы проверить наличие Full GC.

  2. Если план выполнения SQL сложен, увеличьте new_planner_optimize_timeout (единица измерения: мс):

    set global new_planner_optimize_timeout = 6000;

Как устранить Unknown Error?

Попробуйте настроить следующие параметры по одному и затем повторно выполните SQL:

set disable_join_reorder = true;
set enable_global_runtime_filter = false;
set enable_query_cache = false;
set cbo_enable_low_cardinality_optimize = false;

Затем соберите EXPLAIN COSTS, EXPLAIN VERBOSE, PROFILE и Query Dump и предоставьте их команде поддержки.

Какой часовой пояс возвращает select now()?

Он возвращает часовой пояс, указанный системной переменной time_zone. Журналы FE/BE используют локальный часовой пояс машины.

Почему SQL замедляется при высоком параллелизме, даже когда ресурсы в норме?

Причина — высокая задержка сети или RPC. Вы можете настроить параметр BE brpc_connection_type на pooled и затем перезапустить BE.

Как отключить сбор статистики?

  • Отключить автоматический сбор:

    enable_statistic_collect = false;
  • Отключить сбор, запускаемый импортом:

    enable_statistic_collect_on_first_load = false;
  • Для версий, обновлённых до v1.5.2 и выше, вручную установите:

    set global analyze_mv = "";