Результат запроса содержит повторяющиеся данные из двух объединенных таблиц и соображения по оптимизации. - PullRequest
0 голосов
/ 29 января 2019

У меня есть две огромные таблицы BigQuery (скажем, ~ 20 ГБ каждая), из которых я хотел бы найти две сессии, которые имели одинаковые теги от разных работодателей.Другими словами, найдите все сеансы, чьи теги (за исключением всего, что имеет «default») совпадают с другими сеансами, которые были выполнены сотрудниками другого работодателя.

Так как нет скрипки BigQuery, я реплицировалпроблема в MySQL.Ниже запрос, который я написал, получает данные, но имеет две основные проблемы:

  1. Это слишком медленно (конечно, из-за 2 выберите все запросы данных).
  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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...