2008-11-13 3 views
1
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 строк текста.Oracle SQL Optimization: SQL-запрос занимает очень много времени

+0

Как правило, индекс не поможет при тестировании на NULLness. – dkretz 2008-11-13 19:57:34

+1

Это может помочь при проверке * NOT * NULLness – cagcowboy 2008-11-13 20:01:35

+1

Я бы предложил вам получить план выполнения запроса и опубликовать его, что позволит людям давать вам лучшие ответы. – 2008-11-13 20:26:19

ответ

0

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

0

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

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

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

0

Хммм ... избавление от DISTINCT может помочь рассматривать этот код как ОСНОВНОЙ КЛЮЧ. Я не думаю, что это то, что вызывает серьезные проблемы с обработкой. Если вы считаете, что RPAD и т. Д. Вызывает большую часть задержки запроса.

Показатели в основном ASCEND - поле CODE. Это единственные релевантные индексы на столе.

0

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

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

0

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

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

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

На локальном хосте старый классический ASP стоит около 30 секунд.

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

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

2

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

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

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) 
/

Пожалуйста, обновите ваш оригинальный пост с результатами тех.

0

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

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

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) будет включать все записи, которые вы хотите вернуть. Если вам нужна еще большая скорость, вы могли бы создать материализованное представление о результатах запроса, но это было бы скорее последним усилием.

0

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

3

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

Создайте индекс (код, 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) 
Смежные вопросы