Я пытаюсь получить некоторые полные результаты, используя эту команду:
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 (объединить все остальные таблицы)
Это хороший план?Я бродю, если это сэкономит время при каждом поиске ...