SQL запрос таблицы медленный в Apache Ignite - PullRequest
0 голосов
/ 01 мая 2020

Мы постоянно получаем эти предупреждения для выполнения запроса select.

[20:30:16,798][WARNING][query-#75][IgniteH2Indexing] Long running query is finished [duration=5534ms, type=MAP, distributedJoin=false, enforceJoinOrder=false, lazy=false, schema=PUBLIC, sql='SELECT
"__Z0"."ID" "__C0_0",
"__Z0"."URL" "__C0_1",
"__Z0"."SCORE" "__C0_2",
"__Z0"."APPNAME_ID" "__C0_3"
FROM "PUBLIC"."URLS" "__Z0"
WHERE "__Z0"."APPNAME_ID" = ?1
ORDER BY 3 FETCH FIRST ?2 ROWS ONLY', plan=SELECT
    __Z0.ID AS __C0_0,
    __Z0.URL AS __C0_1,
    __Z0.SCORE AS __C0_2,
    __Z0.APPNAME_ID AS __C0_3
FROM PUBLIC.URLS __Z0
    /* PUBLIC.URLS.__SCAN_ */
    /* scanCount: 1541722 */
WHERE __Z0.APPNAME_ID = ?1
ORDER BY 3
FETCH FIRST ?2 ROWS ONLY, node=TcpDiscoveryNode [id=9b49bd18-a35d-44b9-a6d7-e28444b061cc, consistentId=9b49bd18-a35d-44g9-a6d7-e280b4b061cc, addrs=ArrayList [0:0:0:0:0:0:0:1%lo0, 127.0.0.1, 192.168.32.10], sockAddrs=HashSet [/192.168.32.10:0, /0:0:0:0:0:0:0:1%lo0:0, /127.0.0.1:0], discPort=0, order=3, intOrder=3, lastExchangeTime=1188336578528, loc=false, ver=8.7.10#20191227-sha1:c481141d, isClient=true], reqId=39750, segment=0]

SQL оператор создания равен

CREATE TABLE IF NOT EXISTS URLS (" +
                        " ID LONG PRIMARY KEY, URL VARCHAR, SCORE DOUBLE, APPNAME_ID LONG) " +
                        " WITH \"TEMPLATE=PARTITIONED,ATOMICITY=ATOMIC,WRITE_SYNCHRONIZATION_MODE=PRIMARY_SYNC,BACKUPS=0\"

оператор создания индекса равен

CREATE INDEX IF NOT EXISTS IDX_2_URLS ON URLS (APPNAME_ID, SCORE)

Когда записи достигают большего числа, мы получаем предупреждения. Может кто-нибудь предложить какую-нибудь идею для повышения производительности?

1 Ответ

1 голос
/ 01 мая 2020

У вас есть условие только для APPNAME_ID, поэтому ваш индекс не может быть использован, поэтому вся таблица сканируется последовательно. Позиция полей в индексе важна.

Вам нужен индекс на (APPNAME_ID) или (APPNAME_ID, SCORE), если хотите. Только один индекс может использоваться во время выполнения SELECT и только для тех столбцов, которые появляются в индексе на первом месте. Как только у следующего поля в индексе нет условия в WHERE, все остальные игнорируются.

...