Запретить запрос Select с условием Exists для повторной оценки каждый раз - PullRequest
0 голосов
/ 30 августа 2018

У нас есть запрос SQL, который запускается с использованием механизма JET db для базы данных Access. К сожалению, мы не можем создать какие-либо хранимые процедуры или перейти на SQL Server, что было бы моим предпочтением. [Facepalm].

Проблема в том, что запрос очень медленный. Обработка запроса занимает около 2 минут, и мы должны выполнить это для 4 разных таблиц, поэтому его обработка занимает 8 минут. Когда мы запускаем каждый оператор select независимо, они занимают 1-2 секунды Когда мы собираем их вместе и используем предложение EXISTS, оно замедляется. У нас есть БД с двумя таблицами, первая таблица примерно 3000 строк, а вторая примерно 5000 строк. Мы хотим выбрать все строки в первой таблице, где значение (FieldName) существует в строке другой таблицы. Нам не нужны никакие поля из второй таблицы, только чтобы знать, что FieldName существует где-то в столбце VBScript. Я полагаю, что при написании этого слова он выполняет запрос ко всей второй таблице для каждой строки (3000 * 5000). Можно ли как-нибудь изменить этот запрос, чтобы он не выполнял столько поисков?

SELECT A1.* 
FROM 
    (SELECT * 
     FROM tblEncompasstoCB CB
     WHERE ((NOT CB.VBScript IS NULL) AND (CB.VBScript <> ''))) AS A1
WHERE 
    EXISTS (SELECT * FROM tblMapping
            WHERE (tblMapping.VBScript <> '')
              AND (InStr(tblMapping.VBScript, IIF(INSTR(A1.FieldName, '~') > 0, MID(A1.FieldName, 1, INSTR(A1.FieldName, '~') - 1), A1.FieldName)) > 0))
    OR
    EXISTS (SELECT * FROM tblCustomMapping
            WHERE (tblCustomMapping.VBScript <> '')
              AND (InStr(tblCustomMapping.VBScript, IIF(INSTR(A1.FieldName, '~') > 0, MID(A1.FieldName, 1, INSTR(A1.FieldName, '~') - 1), A1.FieldName)) > 0))

1 Ответ

0 голосов
/ 30 августа 2018

Использовать только SELECT TOP 1 в существующем

...