2015-10-19 4 views
1

У меня есть две таблицы в Microsoft Access: T_DATAS (около 200 000 строк) и T_REAF (около 1000 строк).SQL-запрос Оптимизация JOIN несколько столбцов

T_DATAS имеет много столбцов (около 30 столбцов), а T_REAF имеет около 10 столбцов.

Я должен сказать вам, что мне не разрешено изменять эти таблицы и создавать другие таблицы. Мне нужно с этим работать.

Обе таблицы имеют 6 столбцов, которые являются одинаковыми. Мне нужно присоединиться к таблицам в этих 6 столбцах, чтобы выбрать ВСЕ столбцы из T_DATAS И столбцы, которые находятся в T_REAF, но не в T_DATAS.

Мой запрос:

SELECT A.*, B.CARROS_NEW, B.SEGT_NEW, B.ATTR INTO FINALTABLE FROM T_DATAS A LEFT JOIN T_REAF B ON A.REGION LIKE B.REGION AND A.PAYS LIKE B.PAYS AND A.MARQUE LIKE B.MARQUE AND A.MODELE LIKE B.MODELE AND A.CARROS LIKE B.CARROS AND A.SEGT LIKE B.SEGT

У меня есть результат, что нужно, но проблема в том, что этот запрос принимает слишком долго, чтобы дать результат (около 3 минут). Я знаю, что T_DATAS содержит много строк (200 000), но я думаю, что 3 минуты слишком длинны для этого запроса.

Не могли бы вы рассказать мне, что не так в этом вопросе?

Большое спасибо за вашу помощь

+3

Почему вы используете ** как ** здесь, в запросе? – pedram

+0

Кроме того, рассмотрите возможность размещения некоторых индексов над таблицами для ускорения запроса – Veljko89

ответ

3

Два шага для этого. Один из них меняет запрос на использование =. Я не уверен на 100%, если это необходимо, но это не может повредить. Второй - создать индекс.

Итак:

SELECT D.*, R.CARROS_NEW, R.SEGT_NEW, R.ATTR 
INTO FINALTABLE 
FROM T_DATAS D LEFT JOIN 
    T_REAF R 
    ON D.REGION = R.REGION AND 
     D.PAYS = R.PAYS AND 
     D.MARQUE = R.MARQUE AND 
     D.MODELE = R.MODELE AND 
     D.CARROS = R.CARROS AND 
     D.SEGT = R.SEGT; 

Во-вторых, вы хотите индекс на T_REAF:

CREATE INDEX IDX_REAF_6 ON T_REAF(REGION, PAYS, MARQUE, MODELE, CARROS, SEGT); 

MS Access может затем использовать индекс для JOIN, ускоряя запрос.

Обратите внимание, что я изменил псевдонимы таблицы, чтобы быть сокращениями для имен таблиц. Это упрощает отслеживание логики в запросе.

+0

Спасибо! Переход с «LIKE» на «AND» сделал запрос быстрее (около 30 секунд против 3 минут раньше). Я также создал индекс. Есть ли способ увидеть, действительно ли индекс используется в Access или мне нужно «доверять» его? –

2

Я полагаю, что эти 6 колонок такие же, могут иметь такой же тип данных также.

Примечание: Оператор равенства (=) - оператор сравнения, который сравнивает два значения для равенства. Поэтому в вашем запросе замените LIKE на = и посмотрите результат.

SELECT A.* 
     ,B.CARROS_NEW 
     ,B.SEGT_NEW 
     ,B.ATTR 
     INTO FINALTABLE 
FROM T_DATAS A 
     LEFT JOIN T_REAF B 
      ON A.REGION = B.REGION 
       AND A.PAYS = B.PAYS 
       AND A.MARQUE = B.MARQUE 
       AND A.MODELE = B.MODELE 
       AND A.CARROS = B.CARROS 
       AND A.SEGT = B.SEGT 
Смежные вопросы