質問

私は2つのテーブルのMASSIVE CROSS JOINを作成するプロセスを移植しています。結果のテーブルには、15メートルの記録(プロセスは、30メートルのクロスは、2600行のテーブルと12000行のテーブルと結合して、それを半分に分割しなければならないいくつかのグループ分けを行いますように見えます)が含まれています。行は比較的狭いです - ちょうど6列。これは、完成の兆候で5時間稼動しています。私はちょうど間のカウントの不一致に気づい良い知られており、私はクロスのために期待するものに参加、私の出力は、最終的なテーブルを半減しますグループ化や重複除去を持たないように - しかし、いずれかを完了することはないだろうように、これはまだいるようです時間すぐます。

まず、私はすべての可能な場合、プロセスからこのテーブルを排除するために見に行くよ - 明らかにそれが個別に両方のテーブルに結合することによって置き換えることができますが、今、私はそれが使用されている他の場所への可視性を持っていません<。 / P>

しかし、既存のプロセスは、(FOCUS言語を使用して、非力なマシンで短い時間で、)それをしないことを考えると、SQL Serverの(2005)に大CROSS JOINsのパフォーマンスを向上させるための任意のオプションは、(ハードウェアは実際にはないがありますオプションで、このボックスはRAMの32-GB)と、64ビットの8ウェイである

詳細ます:

これは、(私はCROSSは、SQLに参加されているのと同じ出力を生成しようとしている)FOCUSでこのように書かれています:

JOIN CLEAR *
DEFINE FILE COSTCENT
  WBLANK/A1 = ' ';
  END
TABLE FILE COSTCENT
  BY WBLANK BY CC_COSTCENT
  ON TABLE HOLD AS TEMPCC FORMAT FOCUS
  END

DEFINE FILE JOINGLAC
  WBLANK/A1 = ' ';
  END
TABLE FILE JOINGLAC
  BY WBLANK BY ACCOUNT_NO BY LI_LNTM
  ON TABLE HOLD AS TEMPAC FORMAT FOCUS INDEX WBLANK

JOIN CLEAR *
JOIN WBLANK IN TEMPCC TO ALL WBLANK IN TEMPAC
DEFINE FILE TEMPCC
  CA_JCCAC/A16=EDIT(CC_COSTCENT)|EDIT(ACCOUNT_NO);
  END
TABLE FILE TEMPCC
  BY CA_JCCAC BY CC_COSTCENT AS COST CENTER BY ACCOUNT_NO
  BY LI_LNTM
  ON TABLE HOLD AS TEMPCCAC
  END

だから、必要な出力が本当にCROSSが(それはそれぞれの側からの空欄に参加しています)に参加されます。

SQLでます:

CREATE TABLE [COSTCENT](
       [COST_CTR_NUM] [int] NOT NULL,
       [CC_CNM] [varchar](40) NULL,
       [CC_DEPT] [varchar](7) NULL,
       [CC_ALSRC] [varchar](6) NULL,
       [CC_HIER_CODE] [varchar](20) NULL,
 CONSTRAINT [PK_LOOKUP_GL_COST_CTR] PRIMARY KEY NONCLUSTERED
(
       [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [JOINGLAC](
       [ACCOUNT_NO] [int] NULL,
       [LI_LNTM] [int] NULL,
       [PR_PRODUCT] [varchar](5) NULL,
       [PR_GROUP] [varchar](1) NULL,
       [AC_NAME_LONG] [varchar](40) NULL,
       [LI_NM_LONG] [varchar](30) NULL,
       [LI_INC] [int] NULL,
       [LI_MULT] [int] NULL,
       [LI_ANLZ] [int] NULL,
       [LI_TYPE] [varchar](2) NULL,
       [PR_SORT] [varchar](2) NULL,
       [PR_NM] [varchar](26) NULL,
       [PZ_SORT] [varchar](2) NULL,
       [PZNAME] [varchar](26) NULL,
       [WANLZ] [varchar](3) NULL,
       [OPMLNTM] [int] NULL,
       [PS_GROUP] [varchar](5) NULL,
       [PS_SORT] [varchar](2) NULL,
       [PS_NAME] [varchar](26) NULL,
       [PT_GROUP] [varchar](5) NULL,
       [PT_SORT] [varchar](2) NULL,
       [PT_NAME] [varchar](26) NULL
) ON [PRIMARY]

CREATE TABLE [JOINCCAC](
       [CA_JCCAC] [varchar](16) NOT NULL,
       [CA_COSTCENT] [int] NOT NULL,
       [CA_GLACCOUNT] [int] NOT NULL,
       [CA_LNTM] [int] NOT NULL,
       [CA_UNIT] [varchar](6) NOT NULL,
 CONSTRAINT [PK_JOINCCAC_KNOWN_GOOD] PRIMARY KEY CLUSTERED
(
       [CA_JCCAC] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

SQLコードを使用してます:

INSERT  INTO [JOINCCAC]
       (
        [CA_JCCAC]
       ,[CA_COSTCENT]
       ,[CA_GLACCOUNT]
       ,[CA_LNTM]
       ,[CA_UNIT]
       )
       SELECT  Util.PADLEFT(CONVERT(varchar, CC.COST_CTR_NUM), '0',
                                     7)
               + Util.PADLEFT(CONVERT(varchar, GL.ACCOUNT_NO), '0',
                                       9) AS CC_JCCAC
              ,CC.COST_CTR_NUM AS CA_COSTCENT
              ,GL.ACCOUNT_NO % 900000000 AS CA_GLACCOUNT
              ,GL.LI_LNTM AS CA_LNTM
              ,udf_BUPDEF(GL.ACCOUNT_NO, CC.COST_CTR_NUM, GL.LI_LNTM, 'N') AS CA_UNIT
       FROM   JOINGLAC AS GL
       CROSS JOIN COSTCENT AS CC

このテーブルがその後使用されている方法に応じて、単にそれを構築するために使用される元のテーブルの両方に結合することによって、プロセスから除去することができなければなりません。しかし、これは非常に大きな移植努力がある、と私はいくつかの時間のためのテーブルの使用方法を見つけない場合がありますので、特に与えられたタイムリー(にそのような大きなテーブルをCROSS JOINingする任意のトリックがあった場合、私は思っていたこと、既存のプロセスFOCUSに)より迅速にそれを行うことが可能です。そのように私は交換用のクエリの私の建物の正しさを検証し、後でビューまたは何でそれをくくり出すことができます。

私はまた、UDFと文字列操作を因数分解し、CROSSは少しのプロセスを分割する最初の結合を実行する検討しています。

これまでの結果:

これは、UDFのパフォーマンスに多くのことを(マイナスの)貢献しないことが判明します。しかし、また、クロス結合15メートルの行と30メートルの行クロス参加の間には大きな違いがあるように見えます。私は(ホーブーイング)SHOWPLAN権限を持っていないので、私はそれが使用している計画は、インデックスを変更した後、良いか悪いかであるかどうかわかりません。私はまだそれをリファクタリングしていませんが、まもなく離れて行くために、テーブル全体を期待しています。

役に立ちましたか?

解決

そのクエリを調べる一つのテーブルから利用1列のみ、および他のテーブルからの使用のみ2つの列を示しています。使用される列の非常に低い数字に、このクエリは簡単にインデックスをカバーして向上させることができます:

CREATE INDEX COSTCENTCoverCross ON COSTCENT(COST_CTR_NUM)
CREATE INDEX JOINGLACCoverCross ON JOINGLAC(ACCOUNT_NO, LI_LNTM)

ここで更なる最適化のための私の質問があります:

あなたは、クエリアナライザでクエリを入れて、「ショー推定実行プラン」ボタンを打つときは、

、それはそれを行うために何が起こっているかをグラフィカルに表示します。

の種類に参加:そこに参加するネストされたループがあるはずです。 (他のオプションは、マージ結合やハッシュ結合しています)。あなたは、ネストされたループが表示された場合は、[OK]を。あなたは、マージ結合またはハッシュ結合、私たちに知らせます。

表示された場合

テーブルアクセスの順序は:トップにすべての道を行くと、右側にすべての方法をスクロールします。最初のステップは、テーブルにアクセスする必要があります。どのテーブルことで、どのような方法(インデックス・スキャン、クラスタ化インデックス・スキャン)が使用されていますか?どのような方法で、他のテーブルにアクセスするために使用されていますか?

並列:あなたは並列処理が使用されていることを示す計画で、ほとんどすべてのアイコンにはほとんどjaggedy矢印が表示されるはずです。あなたがこれを表示されない場合は、大きな問題があります!

udf_BUPDEFは私に関すること。それは追加のテーブルから読み込まれていますか? Util.PADLEFTはあまり私に関係するが、それでも...それは何ですか?

:これはデータベースオブジェクトでない場合は、代わりにこれを使用することを検討してください
RIGHT('z00000000000000000000000000' + columnName, 7)

JOINCCAC上の任意のトリガーがありますか?どのようにインデックスのでしょうか?挿入この大規模で、あなたはそのテーブルの上にすべてのトリガとインデックスを削除することをお勧めします。

他のヒント

いつも私のクエリが非常に遅い作っ選択に使用されるクエリを含んで他人ことわざ、DBの機能に引き続き。私の頭の上から、私は45秒で、クエリの実行を持っていたと信じて、私は機能を削除し、その後、結果は0秒でした:)

だから、udf_BUPDEFが任意のクエリをやっていないことを確認します。

それはシンプルな無地のクロスに参加するためにクエリをブレークダウンます。


   SELECT  CC.COST_CTR_NUM, GL.ACCOUNT_NO
              ,CC.COST_CTR_NUM AS CA_COSTCENT
              ,GL.ACCOUNT_NO AS CA_GLACCOUNT
              ,GL.LI_LNTM AS CA_LNTM
-- I don't know what is BUPDEF doing? but remove it from the query for time being
--              ,udf_BUPDEF(GL.ACCOUNT_NO, CC.COST_CTR_NUM, GL.LI_LNTM, 'N') AS CA_UNIT
       FROM   JOINGLAC AS GL
       CROSS JOIN COSTCENT AS CC

の簡単なクロスがどのように良いに参加されていますか? (その上に適用される任意の機能なし)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top