Оптимизация Oracle SQL: запрос SQL занимает очень много времени

SELECT DISTINCT 
    'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
     rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL

Это, по-видимому, основная причина того, почему я не могу экспортировать эти записи в текстовый файл в своей среде разработки. Есть ли способ ускорить выполнение этого запроса? Он возвращает примерно 2000+ строк текста.

Обычно индекс не помогает при тестировании на NULLness.

dkretz 13.11.2008 22:57

Это может помочь при проверке НЕТ NULLness

cagcowboy 13.11.2008 23:01

Я бы посоветовал вам получить план выполнения запроса и опубликовать его, чтобы люди могли дать вам более точные ответы.

Dave Costa 13.11.2008 23:26

По моему опыту, тестирование на NULLness эквивалентно тестированию на NULLness по индексу. Оптимизатор достаточно умен, чтобы знать это; и, судя по опыту, это не работает.

dkretz 13.11.2008 23:30

упс - s / тестирование на NULLness / тестирование на NOT NULL /

dkretz 13.11.2008 23:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
13 148
10

Ответы 10

Если у вас еще нет индексов для столбцов L_code и licensing_no, я бы попробовал это.

Если есть много записей с L_code = '1000' и единственный дополнительный тест - это NOT NULL, у вас, вероятно, проблема с количеством элементов. Индексам сложно выбрать значение NULL или нет.

Количество возвращаемых строк неважно - вопрос в количестве проверенных строк.

Какие есть индексы?

Избавьтесь от ОТЛИЧИТЕЛЬНОГО.

И вы предполагаете, что он не хочу DISTINCT?

dkretz 13.11.2008 23:05

Хммм ... избавление от DISTINCT может помочь, учитывая, что код является ПЕРВИЧНЫМ КЛЮЧОМ. Я не думаю, что это является причиной основных проблем обработки. Если вы считаете, что RPAD и т. д. Вызывают большую часть задержки запроса.

Индексы в основном восходят к полю КОД. Это единственные релевантные индексы в таблице.

Если вы думаете, что это RPAD, попробуйте тот же запрос, просто выбрав столбцы: SELECT code, licensing_no WHERE L_code = '1000' И licensing_no IS NOT NULL. Я серьезно сомневаюсь, что это так.

Dave Costa 13.11.2008 23:28

Вы можете предварительно построить производное значение RECORD во вторичной таблице, представлении или столбце, используя триггер и запрос, которые вместо создания его на лету, если к таблице часто запрашиваются.

Возможно, вам будет полезно узнать размер стола. Если у вас есть большой столбец или много записей, это может быть что-то, связанное с вводом-выводом или кешем.

Мне жаль всех, кто смотрит на этот SQL, но это ошеломляющая проблема с сервером или что-то в этом роде. Сценарий, кажется, исчерпал себя, и я считаю, что это проблема доступности данных относительно того, где находится БД, но кто-то может дать мне некоторое представление.

На своем Localhost запускаю код, работает мгновенно. Я экспортирую данные, которые он дает мне, из таблицы данных в текстовый файл менее чем за секунду ... готово.

В нашей среде разработки такая же страница находится в старом ASP. Половина нашего сайта находится в классическом ASP, поскольку мы конвертируемся в .NET. Проблема, похоже, в том, что на сайте DEV классическая страница ASP работает отлично, быстро и выполняется менее чем за секунду. Когда я загрузил недавно преобразованный файл ASPX, он завис на этом запросе около 30 секунд.

На Localhost старый классический ASP зависает примерно на 30 секунд.

Итак, у меня наоборот проблема в том, что классический ASP висит не на сайте DEV, а на моей машине, в то время как моя собственная страница ASPX висит на сайте DEV, но НЕ на моей машине. Разница в том, что я считаю, что данные извлекаются в моем собственном коде на сайте DEV, в то время как страница ASP извлекает данные из кода, который находится на старом сервере сайта DEV, который переносит результаты на сайт DEV. Таким образом, технически код не запускается на одном сервере. Классический код ASP находится на нашем старом сервере сайта.

Я предполагаю, что между двумя сайтами есть какая-то проблема со скоростью или проблема с сервером.

Проверьте планы выполнения в двух средах

David Aldridge 16.11.2008 06:17

Вы не сможете диагностировать эту проблему, если не знаете, как оптимизируется запрос.

Попробуй это:

explain plan for SELECT DISTINCT 
'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
 rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL
/

select * from table(dbms_xplan.display)
/

Теперь попробуйте это тоже ... это поможет вам обнаружить проблему со статистикой:

explain plan for SELECT /*+ dynamic_sampling(4) */ DISTINCT 
'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
 rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE L_code = '1000' AND licensing_no IS NOT NULL
/

select * from table(dbms_xplan.display)
/

Пожалуйста, обновите исходное сообщение результатами тех.

Как указано в большинстве ответов здесь, ваш вопрос звучит как вопрос оптимизации. Ваш последующий ответ существенно меняет характер вопроса. Я предлагаю опубликовать его как новый вопрос или изменить исходный вопрос, чтобы задать то, что вы действительно хотите знать.

Я не могу помочь вам с проблемой ASP / ASPX, но если бы это был вопрос оптимизации, я бы предложил создать индекс на основе функций для нового предложения WHERE следующим образом:

SELECT DISTINCT 
    'LRS-TECH  1' || rpad(code,7) || rpad('APPTYPE',30) || 
     rpad(licensing_no,30) || rpad(' ',300) AS RECORD 
FROM APPS
WHERE DECODE(L_code,'1000',licensing_no,NULL) IS NOT NULL;

Индекс на основе функции DECODE (L_code, '1000', licensing_no, NULL) будет включать все записи, которые вы хотите вернуть. Если вам нужна еще большая скорость, вы могли бы создать материализованное представление результатов запроса, но это было бы скорее последней попыткой.

Интересно, связано ли это с тем, что оракул использует другой индекс (или вообще не использует) для запроса со страницы aspx. Я бы посоветовал обновить статистику в таблице, чтобы увидеть, имеет ли это значение. См. этот вопрос, чтобы узнать, как это сделать (и комментарии о том, что «вычислять статистику» устарели, вместо этого заменены пакетом)

Решение простое.

Создайте индекс для (code, licensing_no) и индекс для (l_code, licensing_no), чтобы быстрее получать записи. Сделайте «украшение» позже в приложении или просто во внешней оболочке, например:

SELECT    'LRS-TECH  1'
       || RPAD (code, 7)
       || RPAD ('APPTYPE', 30)
       || RPAD (licensing_no, 30)
       || RPAD (' ', 300) AS RECORD
  FROM (SELECT DISTINCT code, licensing_no
                   FROM apps
                  WHERE l_code = '1000' AND licensing_no IS NOT NULL)

Другие вопросы по теме