2012-03-16 2 views
2

Это меня заводит в тупик, поэтому я подумал, что посмотрю, столкнулся ли кто-нибудь с этой проблемой и/или знает об обходном пути.Внутренняя ошибка Oracle, когда запрос запрашивается с предложением ORDER BY

У меня есть следующий SELECT заявление:

SELECT * FROM TPM_VIEWSEARCH_EXPORT VS WHERE (PROJECTTYPEID IN (1)) 

Это прекрасно работает, хотя это довольно медленный запрос, который возвращает около 3000 строк. Тем не менее, я хочу заказать результаты. Поэтому я стараюсь:

SELECT * FROM TPM_VIEWSEARCH_EXPORT VS WHERE (PROJECTTYPEID IN (1)) ORDER BY PROJECTID, VERSIONID 

Когда я делаю это, запрос выполняется в течение примерно 25 секунд, а затем возвращает:

ORA-00600: внутренний код ошибки, аргументы: [kokegPinLob1], [], [], [], [], [], [], [], [], [], [], []

можно также перемещать пункт ORDER BY в само определение вида, и получить ту же ошибку. Досадно, что это репродуцируется только на нашем производственном сервере (который работает на Linux), а не на моем сервере разработки, который работает локально в Windows. Однако он воспроизводит 100% времени.

Определение VIEW может или не может иметь значение, но здесь это все равно:

CREATE VIEW TPM_VIEWSEARCH_EXPORT AS 
    SELECT 
     V.PROJECTID, V.VERSIONID, V.NAME, V.STAGEID, V.REQUESTTYPE, V.PRIORITY, V.HEALTH, V.TRAININGDELIVERYSTART, V.TRAININGDELIVERYEND, V.MEASUREMENTINFO, V.DESCRIPTION, V.BUSINESSSPONSORLEVELINVOLVE, 
     P.INITIATIVEID, P.LEADERSHIPONLY, P.BUSINESSLAUNCHDATE, P.EXPECTEDBUSINESSRESULTS, P.PROJECTTYPEID, 
     T.SHORTNAME as ProjectType, 
     I.NAME as InitiativeName, 
     C.NAME as TrainingCategory, 
     S.NAME as StageName, 
     PTO.FIRSTNAME as PTOFirst, PTO.LASTNAME as PTOLast, 
     STO.FIRSTNAME as STOFirst, STO.LASTNAME as STOLast, 
     LTS.FIRSTNAME as LTSFirst, LTS.LASTNAME as LTSLast, 
     R.FIRSTNAME as ReqFirst, R.LASTNAME as ReqLast, 
     BS.FIRSTNAME as BSFirst, BS.LASTNAME as BSLast, 
     (select WM_CONCAT(FIRSTNAME || ' ' || LASTNAME) from TPM_PROJECTVERSIONSME inner join TPM_USER USING (USERID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as SME, 
     (select WM_CONCAT(NAME) from TPM_PROJECTAREAS inner join TPM_AREAS USING (AREAID) where PROJECTID=V.PROJECTID) as Areas, 
     (select WM_CONCAT(NAME) from TPM_PROJECTWORKGROUPS inner join TPM_WORKGROUPS USING (WORKGROUPID) where PROJECTID=V.PROJECTID) as Workgroups, 
     (select WM_CONCAT(NAME) from TPM_PROJECTVERSIONSYSTEMS inner join TPM_SYSTEMS USING (SYSTEMID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as Systems, 
     (select WM_CONCAT(NAME) from TPM_PROJECTVERSIONTEAMS inner join TPM_DEVELOPMENTTEAMS USING (TEAMID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as SupportingDevTeams 
    FROM TPM_PROJECTVERSION V 
    INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID 
    INNER JOIN TPM_PROJECTTYPES T ON T.PROJECTTYPEID = P.PROJECTTYPEID 
    INNER JOIN TPM_INITIATIVES I ON I.INITIATIVEID = P.INITIATIVEID 
    INNER JOIN TPM_PROJECTSTAGE S ON S.STAGEID = V.STAGEID 
    INNER JOIN TPM_PROJECTCATEGORIES PC ON (PC.PROJECTID=V.PROJECTID) 
    INNER JOIN TPM_TRAININGCATEGORIES C ON (C.CATEGORYID=PC.CATEGORYID) 
    INNER JOIN TPM_USER R ON (V.REQUESTOR=R.USERID) 
    INNER JOIN TPM_USER BS ON (V.BUSINESSSPONSOR=BS.USERID) 
    LEFT JOIN TPM_USER PTO ON PTO.USERID = V.PRIMARYTRAININGOWNER 
    LEFT JOIN TPM_USER STO ON (V.SECONDARYTRAININGOWNER=STO.USERID) 
    LEFT JOIN TPM_USER LTS ON (V.LEADTRAININGSPONSOR=LTS.USERID) 

В АБД, запускаемые требование производства сервера это известная ошибка Oracle, однако не патч не доступен. Действительно ли это ошибка Oracle, или эта проблема имеет какое-то отношение к определению представления или данным в базе данных.

UPDATE:

Oracle версия (Dev машина, которая работает):

Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta 
PL/SQL Release 11.2.0.2.0 - Beta 
CORE 11.2.0.2.0 Production 
TNS for 32-bit Windows: Version 11.2.0.2.0 - Beta 
NLSRTL Version 11.2.0.2.0 - Production 

Oracle версия (производство):

TNS for Solaris: Version 11.2.0.2.0 - Production 
PL/SQL Release 11.2.0.2.0 - Production 
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 
NLSRTL Version 11.2.0.2.0 - Production 
CORE 11.2.0.2.0 Production 
+2

Является ли план запросов одинаковым в обеих средах? Знаете ли вы, какая ошибка, с которой полагаются администраторы баз данных, вызывает ошибку? Не переходя через Metalink и глядя на созданный файл трассировки, я предполагаю, что проблема, по крайней мере, частично связана с использованием недокументированной функции WM_CONCAT. Могли бы вы использовать другой метод для агрегации строк? Если вы используете 11.2, можете ли вы использовать функцию 'LISTAGG'? –

+0

@JustinCave - Я добавил обе версии к сообщению. Я * кажется * имею LISTAGG для обоих, но не могу понять правильный синтаксис, чтобы заставить его работать с этим запросом. –

+1

@JustinCave - Серьезно, если вы когда-либо находитесь в районе Сиэтла, я должен вам выпить. Переход на LISTAGG не только исправляет ошибку, но и ускоряет мой запрос с 46 минут до 30 секунд! Святое дерьмо .. –

ответ

2

Решение, которое Джастин Пещере рекомендовал в комментарии, должен был перейти к LISTAGG функции вместо WM_CONCAT. Этот метод не только предотвращает крах, но также увеличивает скорость запроса от примерно 46 минут до примерно 30 секунд. Обновленный код:

(select LISTAGG(LASTNAME || ', ' || FIRSTNAME, '; ') WITHIN GROUP (ORDER BY LASTNAME, FIRSTNAME) from TPM_PROJECTVERSIONSME inner join TPM_USER USING (USERID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as SME, 
    (select LISTAGG(NAME, '; ') WITHIN GROUP (ORDER BY NAME) from TPM_PROJECTAREAS inner join TPM_AREAS USING (AREAID) where PROJECTID=V.PROJECTID) as Areas, 
    (select LISTAGG(NAME, '; ') WITHIN GROUP (ORDER BY NAME) from TPM_PROJECTWORKGROUPS inner join TPM_WORKGROUPS USING (WORKGROUPID) where PROJECTID=V.PROJECTID) as Workgroups, 
    (select LISTAGG(NAME, '; ') WITHIN GROUP (ORDER BY NAME) from TPM_PROJECTVERSIONSYSTEMS inner join TPM_SYSTEMS USING (SYSTEMID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as Systems, 
    (select LISTAGG(NAME, '; ') WITHIN GROUP (ORDER BY NAME) from TPM_PROJECTVERSIONTEAMS inner join TPM_DEVELOPMENTTEAMS USING (TEAMID) where PROJECTID=V.PROJECTID and VERSIONID=V.VERSIONID) as SupportingDevTeams 
0

Это общий номер внутренней ошибки для Исключения программ Oracle. Это указывает на то, что процесс столкнулся с невысоким уровнем неожиданности. Причины этого сообщения включают в себя:

таймаут

файл с коррупцией

неудачные проверки данных в памяти

аппаратное обеспечение, память, или ошибки ввода/вывода

неправильно Восстановленные файлы

Первый аргумент - это номер внутреннего сообщения. Другими аргументами являются различные числа, имена и символьные строки. Номера могут изменять значения между различными версиями Oracle.

Действие: Сообщить об этой ошибке в Oracle Customer Support после сбора следующей информации:

+0

Спасибо! Мы подали запрос на обслуживание с Oracle, поэтому, возможно, им будет интересно взглянуть. Из этого списка я бы сказал, что тайм-аут будет лучшим предположением, поскольку это такой сложный запрос. –