Arhn - архитектура программирования

Избегание хеш-соединения с предложением IN и подзапросом в Spanner

У меня есть следующая проблема оптимизации запросов в Spanner, и я надеюсь, что мне не хватает уловки, которая поможет мне подчинить планировщик запросов моей воле.

Вот упрощенная схема:

create table T0 (
  key0  int64 not null,
  value int64,
  other int64 not null,
) primary key (key0);

create table T1 {
  key1  int64 not null,
  other int64 not null
} primary key (key1);

И запрос с подзапросом в предложении IN:

select value from T0 t0
where t0.other in (
  select t1.other from T1 t1 where t1.key1 in (42, 43, 44)  -- note: this subquery is a good deal more complex than this
)

Что создает набор из 10 элементов через хеш-соединение T0 с выходом подзапроса:

Operator                     Rows  Executions
-----------------------      ----- ----------
Serialize Result               10          1
Hash Join                      10          1
  Distributed union         10000          1
    Local distributed union 10000          1
    Table Scan: T0          10000          1
  Distributed cross apply:      5          1
   ...lots moar T1 subquery stuff...

Обратите внимание: хотя подзапрос сложен, на самом деле он создает очень маленький набор. К сожалению, он также сканирует целиком T1 для передачи в хеш-соединение, что очень медленно.

Однако, если я возьму результат подзапроса на T1 и вручную вставлю его в предложение IN:

select value from T0
where other in (5, 6, 7, 8, 9)  -- presume this `IN` clause to be the output of the above subquery

Это значительно быстрее, по-видимому, потому, что он просто попадает в индекс T0 один раз для каждой записи, не используя хеш-соединение для всего содержимого:

Operator                Rows Executions
----------------------- ---- ----------
Distributed union         10          1
Local distributed union   10          1
Serialize Result          10          1
Filter                    10          1
Index Scan:               10          1

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

Также: я еще не совсем доказал это, но в некоторых случаях я опасаюсь, что вывод подзапроса из 10 элементов может взорваться до нескольких тысяч элементов (T1 будет расти более или менее неограниченно, легко до миллионов). Я вручную протестировал несколько сотен элементов в выделенном предложении IN, и, похоже, он работает приемлемо, но меня немного беспокоит, что это может выйти из-под контроля.

Обратите внимание, что я также пробовал присоединиться к подзапросу, например:

select t0.other from T0 t0
join (
  -- Yes, this could be a simple join rather than a subquery, but in practice it's complex
  -- enough that it can't be expressed that way.
  select t1.other from T1 t1 where t1.key = 42
) sub on sub.other = t0.other

Но в планировщике запросов произошла поистине ужасающая вещь, которую я даже не буду пытаться здесь объяснять.


  • Написанный подзапрос немного сбивает с толку: вы хотели сказать key1 вместо key? Также: как написано, подзапрос может вернуть только один результат, поскольку key1 является полным первичным ключом; возможно, вам нужно иметь два первичных ключа для T1, или вы могли бы сказать t1.key1 IN (42, 43, 44)? 13.06.2017
  • Упс, извините - только что заметил этот комментарий. Да, это ошибка, которую я совершил, пытаясь абстрагироваться от проблемы. Его следует читать в основном так, как вы предлагаете. Я отредактирую его, чтобы отразить это, чтобы избежать путаницы в будущем. 14.06.2017

Ответы:


1

Использует ли ваш фактический подзапрос в предложении IN какие-либо переменные из T0? Если нет, что произойдет, если вы попробуете запрос на соединение с переупорядоченными таблицами (и добавлением отдельных для правильности, если вы не знаете, что значения будут разными)?

SELECT t0.other FROM  (
      -- Yes, this could be a simple join rather than a subquery, but in practice it's complex
      -- enough that it can't be expressed that way.
      SELECT DISTINCT t1.other FROM T1 t1 WHERE t1.key = 42
    ) sub 
JOIN T0 t0
ON sub.other = t0.other
12.06.2017
  • Спасибо, Майк, отлично! Мы только что пришли примерно к такому же ответу за выходные (за исключением части distinct, которая, я думаю, также может быть необходима). Это сканирует строки примерно O(sub-query), на что я и рассчитывал. 13.06.2017
  • Пожалуйста. На самом деле я просто передаю ответ от кого-то из нашей команды, у которого нет учетной записи SO, но мы рады, что это сработало! 14.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..