سؤال

أنا ترقية عملية يخلق ضخمة CROSS JOIN اثنين من الجداول.الجدول الناتج يحتوي على 15m السجلات (يبدو أن عملية يجعل 30m عبر الانضمام مع 2600 صف الجدول و 12000 صف الجدول ثم يفعل بعض المجموعات التي يجب تقسيمها إلى نصفين).الصفوف ضيقة نسبيا - فقط 6 أعمدة.إنه تم تشغيل لمدة 5 ساعات مع أي علامة على الانتهاء.انا فقط لاحظت عدد التناقض بين جيدة معروفة و ما أتوقع عبر الانضمام لذا الإخراج لا يكون التجمع أو deduping التي النصف النهائي الجدول - ولكن هذا لا يزال يبدو انها لن كاملة في أي وقت قريب.

أولا أنا ذاهب لننظر إلى القضاء على هذا الجدول من العملية إذا كان ذلك ممكنا - من الواضح أنه يمكن الاستعاضة عن انضمامه إلى كل الجداول بشكل فردي ، ولكن الآن ليس لدي الرؤية في أي مكان آخر يتم استخدامه.

ولكن بالنظر إلى أن العملية الحالية لا (في وقت أقل ، على أقل قوة الجهاز ، باستخدام التركيز اللغة), هل هناك أي خيارات لتحسين أداء كبير CROSS JOINs في SQL Server (2005) (الأجهزة ليست خيارا هذا الصندوق هو 64 بت 8-طريقة مع 32 غيغابايت من ذاكرة الوصول العشوائي)?

التفاصيل:

هو مكتوب هذا الطريق في التركيز (أنا أحاول أن تنتج نفس الناتج ، وهو عبر المشاركة في SQL):

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

وبالتالي فإن الناتج المطلوب حقا هو عبر الانضمام إلى (انها الانضمام إلى عمود فارغ من كل جانب).

في 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 JOINجي الطاولات الكبيرة مثل ذلك في الوقت المناسب (خاصة أن العملية الحالية في التركيز قادرة على القيام بذلك بسرعة أكبر).بهذه الطريقة أتمكن من التحقق من صحة المبنى من استبدال الاستعلام ثم في وقت لاحق عامل بها مع وجهات النظر أو أيا كان.

أنا أيضا في استبعاد UDFs و التلاعب سلسلة وأداء الصليب الانضمام إلى أول من كسر هذه العملية قليلا.

النتائج حتى الآن:

اتضح أن UDFs لا تسهم كثيرا (سلبا) على الأداء.ولكن يبدو أن هناك أيضا فرق كبير بين 15m صف الصليب الانضمام و حتى عمق 30 متر صف الصليب الانضمام.ليس لدي SHOWPLAN حقوق (بوو هوو) ، لذلك لا أستطيع أن أقول ما إذا كانت الخطة هي استخدام أفضل أو أسوأ بعد تغيير الفهارس.لم ريفاكتوريد بعد لكن أنا أتوقع الجدول بأكمله أن تذهب بعيدا في وقت قريب.

هل كانت مفيدة؟

المحلول

دراسة هذا الاستعلام يظهر عمود واحد فقط من جدول واحد و اثنين فقط من الأعمدة المستخدمة من الجدول الآخر.بسبب انخفاض أعداد الأعمدة المستخدمة ، يمكن أن يكون هذا الاستعلام بسهولة معززة مع تغطية الفهارس:

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

هنا هي بلدي الأسئلة لمزيد من التحسين:

عندما كنت وضعت الاستعلام في "محلل استعلام" و اضرب "إظهار المقدرة في خطة التنفيذ" زر سوف تظهر تمثيل رسومي من ما هو ذاهب الى القيام به.

الانضمام نوع:يجب أن يكون هناك حلقة متداخلة الانضمام إلى هناك.(الخيارات الأخرى هي دمج و التجزئة).إذا كنت ترى حلقة متداخلة ، ثم موافق.إذا كنت ترى دمج أو التجزئة, اسمحوا لنا أن نعرف.

ترتيب الجدول الوصول:يذهب كل في طريقة إلى الأعلى و قم بالتمرير إلى اليمين.ينبغي أن تكون الخطوة الأولى في الوصول إلى الجدول.والتي الجدول هو أن ما يتم استخدام طريقة(مؤشر مسح فهرس متفاوت المسافات مسح)?ما هو أسلوب يستخدم للوصول إلى غيرها من الجدول ؟

التوازي:يجب أن ترى القليل jaggedy السهام على ما يقرب من جميع الرموز في خطة مشيرا إلى أن التوازي يتم استخدامه.إذا كنت لا ترى هذا ، هناك مشكلة كبيرة!

أن udf_BUPDEF يقلقني.هل قراءة إضافية من الجداول ؟ Util.PADLEFT يهمني أقل, ولكن لا يزال..ما هو ؟ إذا لم يكن كائن قاعدة بيانات ، ثم النظر في استخدام هذا بدلا من ذلك:

RIGHT('z00000000000000000000000000' + columnName, 7)

هل هناك أي يطلق على JOINCCAC?ماذا عن المؤشرات?مع إدراج هذه الكبيرة, سوف تحتاج إلى إسقاط جميع المشغلات و الفهارس في هذا الجدول.

نصائح أخرى

المستمر على الآخرين ما يقولون ، ديسيبل الوظائف التي ترد على الاستفسارات التي تستخدم في تحديد دائما الاستفسارات بلدي بطيئة للغاية.من على قمة رأسي ، أعتقد أنني كان الاستعلام تعمل في 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