2012-03-16 16 views
2

これは私に困惑しているので、他の誰かがこの問題に遭遇したか、回避策を知っているかどうかは分かりませんでした。ビューがORDER BY句で照会されたときの内部Oracleエラー

は、私は次のSELECTの文を持っている:それは約3000行を返すかなりスロークエリですけれども

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

これは、正常に動作します。しかし、私は結果を注文したい。だから私は試してみてください。私はこれを行うと

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

は、クエリが約25秒間実行され、その後、返します

ORA-00600:内部エラー・コード、引数:[kokegPinLob1]、[]、 []、 []、[]、[]、[]、[]、[]、[]、[]、[]

Iはまた、ビュー定義自体にORDER BY句を移動させることができ、そして同じエラーが発生します。この厄介なことは、私たちのプロダクションサーバ(Linux上で動作します)上のreprosだけであり、Windows上でローカルに動作する私の開発サーバ上ではありません。しかし、それは時間の100%を再現します。

VIEW定義がか重要でない場合がありますが、ここでは、とにかくです:本番サーバーを実行して、DBAは、これは、既知のOracleバグであると主張

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のバグか、この問題はビュー定義やデータベース内のデータと関係がありますか?

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

クエリプランは両方の環境で同じですか? DBAがエラーを引き起こしていると思われるバグを知っていますか? Metalinkを通らず、生成されるトレースファイルを調べることなく、文書化されていない 'WM_CONCAT'関数を少なくとも部分的に使って問題が発生していると思います。文字列集約を行うために別の手法を使用する可能性はありますか?もしあなたが11.2であれば、代わりに 'LISTAGG'関数を使うことができますか? –

+0

@JustinCave - 両方のバージョンを投稿に追加しました。私は*両方にLISTAGGを持っているようですが、そのクエリで作業するための正しい構文を理解することはできません。 –

+1

@JustinCave - シアトルエリアにいると真面目に飲みます。 LISTAGGに切り替えるとバグは修正されるだけでなく、クエリが46分から30秒に短縮されます。大変だよ.. –

答えて

2

コメントにジャスティンの洞窟で推奨されたソリューション、代わりにWM_CONCATLISTAGG機能に切り替えることでした。この方法はクラッシュを回避するだけでなく、クエリーの速度を約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プログラムの例外。プロセスが低レベルの予期しない状態に遭遇したことを示します。このメッセージの原因は、次のとおりです。

ハードウェア、メモリ、またはI/Oエラー

間違って復元されたファイル

メモリ内のデータチェックに失敗しました

ファイルの破損

タイムアウトを最初の引数は内部メッセージ番号です。他の引数は、さまざまな数字、名前、および文字列です。この数値は、Oracleの異なるバージョン間の意味を変更する可能性があります。

処置:以下の情報を収集した後、Oracleカスタマ・サポートにこのエラーを報告:

+0

ありがとう! Oracleにサービスリクエストを提出しましたので、おそらく彼らは見てみることに興味があるでしょう。そのリストから、私はそれがそのような重大なクエリであるため、タイムアウトが最良の推測であると言いたいと思います。 –

関連する問題