Как получить результат SQL более эффективно - PullRequest
0 голосов
/ 30 января 2019

У меня проблема с моим запросом SQL в базе данных DB2.Я должен получить записи из одной таблицы на основе количества записей из второй таблицы, которая связана через некоторые поля.Мой запрос работает очень, очень, очень медленно.Я пытался найти более эффективный способ сделать это, даже использовать внутреннее соединение, но оно все равно было.

SELECT * FROM table1

WHERE

    table1.field1 = '9' AND
    table1.field2 <= CURRENT DATE - 1 YEAR AND
    (
    SELECT COUNT(*) FROM table2
    WHERE 
        table2.field1 = '0' AND
        table1.field3 = table2.field2 AND
        table1.field4 = table2.field3 AND
                table1.field5 = table2.field4 AND
        table1.field6 = table2.field5 AND
        table1.field7 = table2.field6 
    ) = 0
WITH UR

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я думаю, что это может быть лучше.Во-первых, измените запрос на использование NOT EXISTS:

SELECT *
FROM table1
WHERE table1.field1 = '9' AND  -- do not use single quotes if field1 is a number!
      table1.field2 <= CURRENT DATE - 1 YEAR AND
      NOT EXISTS (SELECT 1
                  FROM table2
                  WHERE table2.field1 = '0' AND
                        table1.field3 = table2.field2 AND
                        table1.field4 = table2.field3 AND
                        table1.field5 = table2.field4 AND 
                        table1.field6 = table2.field5 AND
                        table1.field7 = table2.field6 
                  ) ;

Во-вторых, убедитесь, что в сравнениях используются правильные типы '9' или 9?'0' или 0?

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

  • table1(field1, field2)
  • table2(field2, field3, field4, field5, field6, field1)

порядок для первых пяти полей для индекса table2 является произвольным;однако field1 должен последовать за ними.

0 голосов
/ 30 января 2019

Первая попытка, которую я бы попробовал:

SELECT * FROM table1
WHERE
  table1.field1 = '9' AND
  table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS
(
   SELECT 1 FROM table2
   WHERE 
    table2.field1 = '0' AND
    table1.field3 = table2.field2 AND
    table1.field4 = table2.field3 AND
            table1.field5 = table2.field4 AND
    table1.field6 = table2.field5 AND
    table1.field7 = table2.field6 
)
WITH UR

Хотя невозможно делать прогнозы без схем, данных и планов выполнения

...