Как сделать эффективное соединение при запросе огромного стола с маленьким столом - PullRequest
1 голос
/ 28 марта 2019

У меня есть 2 таблицы, рассмотрим ТАБЛИЦУ А и ТАБЛИЦУ Б. В ТАБЛИЦЕ А записано 5 миллионов записей, а в ТАБЛИЦЕ Б - 20 тыс. Записей. Я соединяю большую таблицу с маленькой таблицей, где я проверяю запись ТАБЛИЦЫ А с каждой записью таблицы Б.

DECLARE @Large TABLE (INN BIGINT,OUTT BIGINT )
INSERT INTO @Large (INN,OUTT)values (11356686,2101189)
INSERT INTO @Large (INN,OUTT)values (11369336,2101301)
INSERT INTO @Large (INN,OUTT)values (11358687,2101487)
INSERT INTO @Large (INN,OUTT)values (11369337,2101609)

DECLARE @small TABLE (INN BIGINT,OUTT BIGINT )
INSERT INTO @small (INN,OUTT)values (11356686,2101189)
INSERT INTO @small (INN,OUTT)values (11369337,2101609)

БОЛЬШОЙ:

INN          OUTT
11356686    2101189
11369336    2101301
11358687    2101487
11369337    2101609

МАЛЕНЬКИЙ:

INN          OUTT
11356686    2101189
11369337    2101609

Мой запрос:

Select CASE WHEN T.INN IS NULL THEN O ELSE 1 END from  @LARGE T
LEFT JOIN @SMALLTT
ON T.INN = TT.INN AND T.OUTT = TT.OUTT

Что касается таблиц, они хорошо проиндексированы, и в плане выполнения даже нет намеков на добавление дополнительных индексов. Может ли кто-нибудь подсказать мне, что мне делать на уровне запросов, чтобы быстрее получать результаты, такие как CROSS APPLY, HASH JOIN и т. Д .;

1 Ответ

0 голосов
/ 28 марта 2019

Если цель состоит в том, чтобы просто определить, какие записи являются общими для таблиц И вы можете изменить таблицу @Large, то попробуйте сохранить флаг @Large, обновив его совпадениями:

DECLARE @Large TABLE (INN BIGINT, OUTT BIGINT, HasMatch BIT DEFAULT(0))
INSERT INTO @Large (INN,OUTT)values (11356686,2101189)
INSERT INTO @Large (INN,OUTT)values (11369336,2101301)
INSERT INTO @Large (INN,OUTT)values (11358687,2101487)
INSERT INTO @Large (INN,OUTT)values (11369337,2101609)

DECLARE @small TABLE (INN BIGINT,OUTT BIGINT )
INSERT INTO @small (INN,OUTT)values (11356686,2101189)
INSERT INTO @small (INN,OUTT)values (11369337,2101609)

UPDATE @Large SET HasMatch = 0

UPDATE l
   SET l.HasMatch = 1
  FROM @Large l INNER JOIN @Small s ON l.INN = s.INN AND l.OUTT = s.OUTT

SELECT INN, OUTT, HasMatch FROM @Large

Опятьэто предполагает, что вы имеете некоторый контроль над структурой / данными таблицы и можете выполнить операторы UPDATE, чтобы заполнить столбец HasMatch.

Преимущество - вы можете воспользоваться преимуществом INNER JOIN и всеми егонеотъемлемые выгоды (есть неотъемлемые выгоды, верно?).

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