Вложенная команда sqlite очень медленная (примерно 30 секунд) - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь получить некоторые полные результаты, используя эту команду:

select ClientId, ClientName,ClientLastName,Client_Address,ClientCity, 
ClientPhone,ClientMail,
GROUP_CONCAT('[id:' || EID || '] [' ||  HDT || ']  ' ||  ECMT, '

') as Comments,LastCallDate, LastTalpan, LastCallResults,NextTimeToCall, 
ClientStatus
from (  

select DISTINCT CLIENT.ID as ClientId, 
 CLIENT.NAME as ClientName
 ,CLIENT.LAST_NAME as ClientLastName
 ,CLIENT.ADDRESS as Client_Address
 ,CLIENT.CITY as ClientCity
 , CLIENT.STATUS as ClientStatus
 ,GROUP_CONCAT(DISTINCT  PHONE_NUMBERS.PHONE_NUMBER) as ClientPhone
 ,GROUP_CONCAT(DISTINCT  MAIL.EMAIL) as ClientMail,  
 EVENT.ID as EID, 
 HISTORY.DATE as HDT, 
 EVENT.COMMENTS as ECMT,
 CALL_LATER.WANTED_NEXT_CALL as NextTimeToCall,
 SHIPPING_COMMANTS.SHIPPING_COMMANTS as HANCHAIA,
 SUBSCRIBE_RELATED.MORE_TO_SHEEP as MORE_TO_SHEEP,
 SUBSCRIBE_RELATED.TOKEF as TOKEF,
 TALPAN_RELATED_DATA.LAST_CALL_DATE as LastCallDate,
 TALPAN_RELATED_DATA.LAST_TALPAN as LastTalpan,
 TALPAN_RELATED_DATA.CALL_RESULTS as LastCallResults

from CLIENT

left join PHONE_NUMBERS on ClientId = PHONE_NUMBERS.CLIENT_ID AND 
PHONE_NUMBERS.PHONE_STATUS=1
left join MAIL on ClientId = MAIL.CLIENT_ID AND MAIL.MAIL_STATUS=1
left join TAGS  on ClientId = TAGS.CLIENT_ID  
left join HISTORY  on HISTORY.CLIENT_ID=CLIENT.ID AND HISTORY.ACTIVE=1
left join EVENT  on HISTORY.EVENT_ID= EVENT.ID
left join CALL_LATER  on CALL_LATER.CLIENT_ID= ClientId
left join SHIPPING_COMMANTS  on SHIPPING_COMMANTS.CLIENT_ID= ClientId AND 
SHIPPING_COMMANTS.ACTIVE=1
left join SUBSCRIBE_RELATED  on SUBSCRIBE_RELATED.CLIENT_ID= ClientId 
left join TALPAN_RELATED_DATA on TALPAN_RELATED_DATA.CLIENT_ID= ClientId
where  TAGS.TAG_NAME = 'TEST_TAG'
AND CLIENT.STATUS = 'CALL_LATER'
AND CLIENT.ALLOCATED = 0
GROUP BY ClientId
order by EID DESC)
GROUP BY ClientId;

У меня есть несколько таблиц, ID которых из таблицы CLIENT является их соединителем

таблица constract:

  • КЛИЕНТ: "ID" "ИМЯ" "LAST_NAME" "АДРЕС" "ГОРОД" "СТАТУС" "ВЫДЕЛЕНО"

  • PHONE_NUMBERS: "ИД" "CLIENT_ID"" PHONE_NUMBER "" COMMANTS "" PHONE_STATUS "

  • EVENT:" ID "" EVENT_NAME "" COMMENTS "

  • история:" ID ""CLIENT_ID" "EVENT_ID" "ДАТА" "АКТИВНЫЙ"

  • CALL_LATER: "ID" "CLIENT_ID" "TALPAN_MADE_LAST_CALL" "WANTED_NEXT_CALL" "ACTIVE"

  • SHIPPING_COMMANTS: "ID" "CLIENT_ID" "SHIPPING_COMMANTS" "ACTIVE"

  • SUBSCRIBE_RELATED: "ID" "CLIENT_ID" "MORE_TO_SHEEP" "TOKEF"

    * 10341036 * TALPAN_RELATED_DATA: "ID" "CLIENT_ID" "LAST_CALL_DATE" "LAST_TALPAN" "CALL_RESULTS"

Я хочу получить все комментарии (комментарии к событиям), которые относятся к конкретному client_id иd сортировать его в обратном направлении (т. е. LIFO).

Эта команда работает, но она очень медленная (может занять более 40 секунд.выполнить и получить результаты).

Я уверен, что я делаю что-то здесь, и поэтому это занимает так много времени, я действительно ценю баллы за мои ошибки и примеры лучших команд, которые достигают тех же результатовБыстрее.

Мой план запроса:

selectid | order | from | 
"1" "0" "0" "SCAN TABLE CLIENT USING INDEX sqlite_autoindex_CLIENT_1"
"1" "1" "1" "SEARCH TABLE PHONE_NUMBERS USING AUTOMATIC COVERING INDEX (PHONE_STATUS=? AND CLIENT_ID=?)"
"1" "2" "2" "SEARCH TABLE MAIL USING AUTOMATIC COVERING INDEX (MAIL_STATUS=? AND CLIENT_ID=?)"
"1" "3" "3" "SEARCH TABLE TAGS USING AUTOMATIC COVERING INDEX (TAG_NAME=? AND CLIENT_ID=?)"
"1" "4" "4" "SEARCH TABLE HISTORY USING AUTOMATIC COVERING INDEX (ACTIVE=?)"
"1" "5" "5" "SEARCH TABLE EVENT USING INTEGER PRIMARY KEY (rowid=?)"
"1" "6" "6" "SEARCH TABLE CALL_LATER USING AUTOMATIC COVERING INDEX (CLIENT_ID=?)"
"1" "7" "7" "SEARCH TABLE SHIPPING_COMMANTS USING INDEX sqlite_autoindex_SHIPPING_COMMANTS_1 (CLIENT_ID=?)"
"1" "8" "8" "SCAN TABLE SUBSCRIBE_RELATED"
"1" "9" "9" "SEARCH TABLE TALPAN_RELATED_DATA USING AUTOMATIC COVERING INDEX (CLIENT_ID=?)"
"1" "0" "0" "USE TEMP B-TREE FOR DISTINCT"
"1" "0" "0" "USE TEMP B-TREE FOR ORDER BY"
"0" "0" "0" "SCAN SUBQUERY 1"
"0" "0" "0" "USE TEMP B-TREE FOR GROUP BY"

Мой полный код для создания схемы схемы:

    CREATE TABLE `CALL_LATER` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `TALPAN_MADE_LAST_CALL` TEXT NOT NULL,
    `WANTED_NEXT_CALL`  TEXT NOT NULL,
    `ACTIVE`    INTEGER NOT NULL
);
CREATE TABLE `CLIENT` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
    `NAME`  TEXT,
    `LAST_NAME` TEXT,
    `ADDRESS`   TEXT,
    `CITY`  TEXT,
    `STATUS`    TEXT NOT NULL,
    `ALLOCATED` INTEGER NOT NULL
);
CREATE TABLE `EVENT` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `EVENT_NAME`    TEXT NOT NULL,
    `COMMENTS`  TEXT
);
CREATE TABLE `HISTORY` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
    `CLIENT_ID` TEXT NOT NULL,
    `EVENT_ID`  TEXT NOT NULL,
    `DATE`  TEXT NOT NULL,
    `ACTIVE`    INTEGER NOT NULL
);
CREATE TABLE `MAIL` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `EMAIL` TEXT NOT NULL UNIQUE,
    `MAIL_STATUS`   INTEGER NOT NULL
);
CREATE TABLE `PHONE_NUMBERS` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `PHONE_NUMBER`  TEXT NOT NULL UNIQUE,
    `COMMANTS`  TEXT,
    `PHONE_STATUS`  INTEGER NOT NULL
);
CREATE TABLE `SHIPPING_COMMANTS` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL UNIQUE,
    `SHIPPING_COMMANTS` TEXT,
    `ACTIVE`    INTEGER NOT NULL
);
CREATE TABLE `SUBSCRIBE_RELATED` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` TEXT NOT NULL UNIQUE,
    `MORE_TO_SHEEP` TEXT NOT NULL,
    `TOKEF` TEXT
);
CREATE TABLE `TAGS` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `TAG_NAME`  TEXT NOT NULL
);
CREATE TABLE `TALPAN_RELATED_DATA` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `LAST_CALL_DATE`    TEXT,
    `LAST_TALPAN`   TEXT,
    `CALL_RESULTS`  TEXT
);
CREATE TABLE `TALPAN_RELATED_DATA` (
    `ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `CLIENT_ID` INTEGER NOT NULL,
    `LAST_CALL_DATE`    TEXT,
    `LAST_TALPAN`   TEXT,
    `CALL_RESULTS`  TEXT
);

Я добавил эти индексы:

create index where_client_index1 ON CLIENT(STATUS,ALLOCATED)
create index where_client_index2 ON CLIENT(ID,STATUS,ALLOCATED)
CREATE INDEX where_phone1 on PHONE_NUMBERS(CLIENT_ID,PHONE_STATUS)
CREATE INDEX where_mail1 on MAIL(CLIENT_ID,MAIL_STATUS)
CREATE INDEX where_history1 on HISTORY(CLIENT_ID,ACTIVE)
CREATE INDEX tags_basic on TAGS(TAG_NAME)
create index phone_1 ON PHONE_NUMBERS(CLIENT_ID,PHONE_STATUS);
CREATE INDEX history2 on HISTORY(ACTIVE)
CREATE INDEX history1 on HISTORY(CLIENT_ID,ACTIVE)
CREATE INDEX CALL1 on CALL_LATER(CLIENT_ID)
CREATE INDEX TALPAN_RELATED_1 on TALPAN_RELATED_DATA(CLIENT_ID)

Это мой новый план:

    "1" "0" "0" "SEARCH TABLE CLIENT USING INDEX where_client_index1 (STATUS=? AND ALLOCATED=?)"
"1" "1" "1" "SEARCH TABLE PHONE_NUMBERS USING INDEX phone_1 (CLIENT_ID=? AND PHONE_STATUS=?)"
"1" "2" "2" "SEARCH TABLE MAIL USING INDEX where_mail1 (CLIENT_ID=? AND MAIL_STATUS=?)"
"1" "3" "3" "SEARCH TABLE TAGS USING INDEX tags_basic (TAG_NAME=?)"
"1" "4" "4" "SEARCH TABLE HISTORY USING AUTOMATIC COVERING INDEX (ACTIVE=?)"
"1" "5" "5" "SEARCH TABLE EVENT USING INTEGER PRIMARY KEY (rowid=?)"
"1" "6" "6" "SEARCH TABLE CALL_LATER USING INDEX CALL1 (CLIENT_ID=?)"
"1" "7" "7" "SEARCH TABLE SHIPPING_COMMANTS USING INDEX sqlite_autoindex_SHIPPING_COMMANTS_1 (CLIENT_ID=?)"
"1" "8" "8" "SCAN TABLE SUBSCRIBE_RELATED"
"1" "9" "9" "SEARCH TABLE TALPAN_RELATED_DATA USING INDEX TALPAN_RELATED_1 (CLIENT_ID=?)"
"1" "0" "0" "USE TEMP B-TREE FOR DISTINCT"
"1" "0" "0" "USE TEMP B-TREE FOR ORDER BY"
"0" "0" "0" "SCAN SUBQUERY 1"
"0" "0" "0" "USE TEMP B-TREE FOR GROUP BY"

И все же требуется много времени, чтобы выполнить.

----------- Что я попробую ---------------------- Я думаю, что я объединю несколько таблиц в одну и тем самым уменьшу использование соединений

history: id, client_id, event_name, commant, date, active context (объединить телефон + почта): id, client_id, number, mail, number_active, mail_active client (объединить все остальные таблицы)

Это хороший план?Я бродю, если это сэкономит время при каждом поиске ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...