У меня есть две огромные таблицы BigQuery (скажем, ~ 20 ГБ каждая), из которых я хотел бы найти две сессии, которые имели одинаковые теги от разных работодателей.Другими словами, найдите все сеансы, чьи теги (за исключением всего, что имеет «default») совпадают с другими сеансами, которые были выполнены сотрудниками другого работодателя.
Так как нет скрипки BigQuery, я реплицировалпроблема в MySQL.Ниже запрос, который я написал, получает данные, но имеет две основные проблемы:
- Это слишком медленно (конечно, из-за 2 выберите все запросы данных).
- Повторяет данные сеансовдве такие совпадающие сессии.Обратите внимание, что все теги сеанса имеют повторяющиеся данные first_session_id
Актуальной проблемой является медлительность.Я выполняю этот запрос в задании демона из сценария ruby / rake, который генерирует отчеты, проблема заключается в том, что соединение истекло и данные отсутствуют даже при настройке его на 5 попыток.
Увеличение времени ожиданияЭто тоже не поможет, и мне интересно, есть ли другой способ написать этот запрос.
Вот SQL Fiddle для детальной проверки:
MySQL 5.6Настройка схемы :
CREATE TABLE session_infos(
session_uuid varchar(255),
session_tag varchar(255) DEFAULT 'default'
);
CREATE TABLE employee_sessions(
employer_id int(11),
employee_id int(11),
session_uuid varchar(255)
);
INSERT INTO session_infos
(session_uuid, session_tag)
VALUES
('dcv3erwfw', 'search'),
('aefd4erww', 'default_search'),
('slkjdvbh8', 'game_default'),
('kjdshvo93', 'client'),
('sdvife333', 'client'),
('dvvnjer54', 'search'),
('lsdvkJHd=', 'fiddle'),
('Udbwjw=23', 'fiddle'),
('jKHDJFWJ1', 'search');
INSERT INTO employee_sessions
(employer_id, employee_id, session_uuid)
VALUES
(1, 1, 'dcv3erwfw'),
(1, 2, 'aefd4erww'),
(2, 1, 'slkjdvbh8'),
(2, 1, 'kjdshvo93'),
(1, 2, 'sdvife333'),
(2, 2, 'dvvnjer54'),
(3, 1, 'lsdvkJHd='),
(2, 1, 'Udbwjw=23'),
(4, 1, 'jKHDJFWJ1');
Запрос 1 :
SELECT
first_table.session_tag AS session_tag,
first_table.sid AS first_session_id,
second_table.sid AS second_session_id
FROM
(
SELECT
si.session_tag AS session_tag,
es.employer_id AS employer_id,
es.session_uuid AS sid
FROM session_infos AS si
JOIN employee_sessions AS es
ON es.session_uuid = si.session_uuid
WHERE
si.session_tag NOT LIKE '%default%'
) first_table
INNER JOIN
(
SELECT
ssi.session_tag AS session_tag,
ses.employer_id AS employer_id,
ses.session_uuid AS sid
FROM session_infos AS ssi
JOIN employee_sessions AS ses
ON ses.session_uuid = ssi.session_uuid
WHERE
ssi.session_tag NOT LIKE '%default%'
) second_table
ON first_table.session_tag = second_table.session_tag
WHERE first_table.employer_id != second_table.employer_id
-- GROUP BY first_table.session_tag, first_table.sid, second_table.sid
Результаты :
| session_tag | first_session_id | second_session_id |
|-------------|------------------|-------------------|
| search | dcv3erwfw | dvvnjer54 |
| search | dcv3erwfw | jKHDJFWJ1 |
| client | kjdshvo93 | sdvife333 |
| client | sdvife333 | kjdshvo93 |
| search | dvvnjer54 | dcv3erwfw |
| search | dvvnjer54 | jKHDJFWJ1 |
| fiddle | lsdvkJHd= | Udbwjw=23 |
| fiddle | Udbwjw=23 | lsdvkJHd= |
| search | jKHDJFWJ1 | dcv3erwfw |
| search | jKHDJFWJ1 | dvvnjer54 |