Tuesday 9 January 2018

T - sql الحركة من المتوسط


دعونا نقول لديك جدول مع حوالي 5 ملايين السجلات والعمود نفارتشار (ماكس) يسكن مع بيانات النص كبيرة. تريد تعيين هذا العمود إلى نول إذا سوموثيركولومن 1 في أسرع طريقة ممكنة. القوة الغاشمة أوبديت لا يعمل بشكل جيد جدا هنا لأنه سيخلق صفقة كبيرة ضمنية واتخاذ إلى الأبد. القيام التحديثات في دفعات صغيرة من سجلات 50K في وقت يعمل ولكن لا يزال يأخذ 47 ساعة لإكمال على بيفي 32 core64GB الخادم. هل هناك أي طريقة للقيام بهذا التحديث بشكل أسرع هل هناك أي خيارات الجدول تلميحات الاستعلام السحري أن التضحيات شيء آخر (مثل التزامن) في مقابل السرعة ملاحظة: إنشاء جدول تيمب أو عمود مؤقت ليس خيارا لأن هذا نفارتشار (ماكس) العمود يتضمن الكثير من البيانات وهكذا يستهلك الكثير من الفضاء بس: نعم، فهرسة سوميثوراكولومن بالفعل. وأنا أتفق، ونحن بانتظام القيام بتحديثات مثل هذا على الجداول مع 50 مليون أو حتى 500 مليون السجلات ويحدث في ثوان. وأود أن أعتقد أن خطة الاستعلام المحدد ليست الأمثل جدا وأخذ الكثير من الوقت. لقد حدث هذا لي عندما يكون هناك قيود مفتاح أجنبي على جدول آخر على عمود غير مفهرسة. بعد النظر في خطة الاستعلام أدركنا أنه كان لمسح الجدول الآخر لكل حذف الذي كان الجاني. كان هذا 23 مليون الصفوف، وفهرسة الجدول الآخر جلب حذف أسفل إلى أقل من 5 ثوان. نداش كوبسف يونيو 7 10 في 10:46 من كل شيء أستطيع أن أرى أنه لا يبدو أن المشاكل الخاصة بك ترتبط الفهارس. يبدو أن المفتاح في حقيقة أن الحقل نفارتشار (ماكس) يحتوي على الكثير من البيانات. فكر في ما يجب القيام به سكل من أجل تنفيذ هذا التحديث. بما أن العمود الذي تقوم بتحديثه يحتمل أن يكون أكثر من 8000 حرف يتم تخزينه خارج الصفحة، مما يعني جهدا إضافيا في قراءة هذا العمود عندما لا يكون نول. عند تشغيل دفعة من 50000 التحديثات سكل لديه لوضع هذا في معاملة ضمنية من أجل جعل من الممكن التراجع في حالة وجود أي مشاكل. من أجل التراجع لديها لتخزين القيمة الأصلية للعمود في سجل المعاملات. على افتراض (للبساطة) أن كل عمود يحتوي على متوسط ​​10000 بايت من البيانات، وهذا يعني أن 50،000 صف تحتوي على حوالي 500 ميغابايت من البيانات، والتي يجب أن يتم تخزينها مؤقتا (في وضع الاسترداد البسيط) أو بشكل دائم (في وضع الاسترداد الكامل). لا توجد طريقة لتعطيل السجلات لأنها سوف تضر بسلامة قاعدة البيانات. ركضت اختبارا سريعا على كلبي ببطء سطح المكتب، وتشغيل دفعات من 10،000 حتى يصبح بطيئا بشكل محتمل، ولكن جلب حجم وصولا الى 1000 الصفوف، مما يعني وجود حجم سجل مؤقت من حوالي 10MB، عملت لطيفا. أنا تحميل جدول مع 350،000 الصفوف ووضع علامة 50،000 منهم للتحديث. هذا الانتهاء في حوالي 4 دقائق، وبما أنه جداول خطيا يجب أن تكون قادرا على تحديث الخاص بك 5 ملايين الصفوف بأكملها على بلدي الكلب سطح المكتب بطيئة في حوالي 6 ساعات على بلدي 1 معالج 2GB سطح المكتب، لذلك أتوقع شيئا أفضل بكثير على الخادم الخاص بك بيفي المدعومة بواسطة سان أو شيء. قد تحتاج إلى تشغيل عبارة التحديث كخيار، وتحديد المفتاح الأساسي فقط وعمود نفارتشار كبير، وضمان تشغيل هذا بأسرع ما تتوقع. بالطبع عنق الزجاجة قد تكون المستخدمين الآخرين تأمين الأشياء أو الخلاف على التخزين أو الذاكرة على الخادم، ولكن بما أنك لم تذكر المستخدمين الآخرين وسوف نفترض لديك دب في وضع المستخدم واحد لهذا الغرض. وكتحسين يجب التأكد من أن سجلات المعاملات على مجموعة قرص قرص فعلي مختلف عن البيانات لتقليل أوقات البحث. هذا ساعدني حقا. ذهبت من 2 ساعة إلى 20 دقيقة مع هذا. في تجربتي، العمل في مسكل 2005، تتحرك يوميا (تلقائيا) 4 مليون 46-بايت السجلات (لا نفارتشار (ماكس) على الرغم من جدول واحد في قاعدة بيانات إلى جدول آخر في قاعدة بيانات مختلفة يستغرق حوالي 20 دقيقة في كوادكور 8GB ، 2Ghz الخادم وأنه لا يضر أداء التطبيق. بالانتقال أعني إنزيرت إنتو سيليكت ثم ديليت. استخدام وحدة المعالجة المركزية أبدا يذهب أكثر من 30، حتى عندما يتم حذف الجدول لديها سجلات 28M ويجعل باستمرار حول 4K إدراج في الدقيقة الواحدة ولكن لا توجد تحديثات. حسنا، هذه هي حالتي، قد تختلف اعتمادا على تحميل الخادم الخاص بك. يحدد أن البيانات (تحديثاتك) يمكنها قراءة الصفوف التي تم تعديلها بواسطة معاملات أخرى ولكن لم يتم الالتزام بها بعد. في حالتي، السجلات هي قراءة. أنا لا أعرف ما يعني رغ-تسكل ولكن هنا سوف تجد معلومات عن مستويات العزلة المعاملات في مسكل. كن حذرا دائما وتأكد من فهمك لآثار قراءة المعاملات غير الملغاة. نعم لن تضطر العملية الخاصة بك إلى انتظار المعاملات المفتوحة لارتكابها قبل حذف العناصر، ولكن بالطبع إذا لم يتم تنفيذ المعاملة بعد كل هذا يعني أنك حذف الصف بشكل غير صحيح. نداش كوبسف يونيو 7 10 في 10:43 إذا كنت تقوم بتشغيل بيئة الإنتاج مع عدم وجود مساحة كافية لتكرار كل ما تبذلونه من الجداول، وأعتقد أن كنت تبحث عن المتاعب عاجلا أو آجلا. إذا قمت بتوفير بعض المعلومات حول عدد الصفوف مع someOtherColumn1، ربما يمكننا أن نفكر طريقة أخرى، ولكن أقترح: 0) النسخ الاحتياطي الجدول الخاص بك 1) فهرس العمود العلم 2) تعيين الخيار الجدول إلى أي سجل. إذا بوسيبل 3) كتابة الإجراء المخزن لتشغيل التحديثات أجاب يونيو 2 10 في 3:17 بتو. أنت ذاهب إلى الحاجة لتشغيل هذا الإجراء أكثر من مرة في الحياة نداش الدكتور بيليساريوس يونيو 2 10 في 3:24 كيف يمكنك تعيين خيار الجدول إلى سجل كوتنو ترانديكتيونسكوت نداش user356004 جون 7 10 في 9:56 إجابتك 2017 المكدس الصرف ، إنكموست الناس على دراية هذه العبارة، كوتيسيس سيقتل طائرين مع واحد ستونكوت. إذا لم تكن كذلك، فإن المرحلة تشير إلى نهج يعالج هدفين في إجراء واحد. (للأسف، فإن التعبير نفسه غير سارة إلى حد ما، كما أن معظمنا don39t تريد رمي الحجارة على الحيوانات البريئة) اليوم I39m الذهاب لتغطية بعض الأساسيات على اثنين من الميزات الرائعة في سكل سيرفر: مؤشر كولومنستور (متوفر فقط في سكل سيرفر المؤسسة) و مخزن الاستعلام سكل. نفذت ميكروسوفت فعلا مؤشر كولومنستور في سكل 2012 المؤسسة، على الرغم من أنها 39ve تعزيزه في آخر إصدارين من سكل سيرفر. عرضت ميكروسوفت مخزن الاستعلام في سكل سيرفر 2016. لذلك، ما هي هذه الميزات والسبب في أنها مهمة حسنا، لدي تجريبي من شأنها أن أعرض كل من الميزات وتبين كيف يمكن أن تساعدنا. قبل أن أذهب أبعد من ذلك، وأنا أيضا تغطية هذا (وغيرها من سكل 2016 الميزات) في بلدي مجلة مجلة كود على الميزات الجديدة سكل 2016. كمقدمة أساسية، يمكن أن يساعد مؤشر كولومنستور تسريع الاستعلامات التي سكاناجريغات على كميات كبيرة من البيانات، و يخزن "مخزن طلبات البحث" عمليات تنفيذ الاستعلام وخطط التنفيذ وإحصاءات وقت التشغيل التي تحتاج عادة إلى جمعها يدويا. ثق بي عندما أقول، هذه هي الميزات الرائعة. لهذا العرض، I39ll باستخدام قاعدة بيانات تجريبي مستودع بيانات ميكروسوفت كونتوسو التجزئة. يتحدث فضفاضة، كونتوسو دو مثل حصة كبيرة حقا أدفنتورورسكوت، مع الجداول التي تحتوي على الملايين من الصفوف. (أكبر جدول أدفنتوروركس يحتوي على ما يقرب من 100،000 الصفوف على الأكثر). يمكنك تنزيل قاعدة بيانات كونتوسو دو هنا: ميكروسوفت-usdownloaddetails. aspxid18279. يعمل كونتوسو دو بشكل جيد جدا عندما تريد اختبار الأداء على الاستعلامات ضد الجداول الكبيرة. كونتوسو دو يحتوي على مستودع البيانات القياسية جدول الحقائق يسمى فاكتونلينزاليس، مع 12.6 مليون الصفوف. that39s بالتأكيد ليست أكبر مستودع مستودع البيانات في العالم، ولكن it39s لا child39s اللعب سواء. لنفترض أنني أريد تلخيص كمية مبيعات المنتجات لعام 2009، وترتيب المنتجات. قد استعلم جدول الحقائق والانضمام إلى جدول "أبعاد المنتج" واستخدام الدالة رانك، مثل ذلك: Here39s مجموعة نتيجة جزئية من أعلى 10 صفوف، من إجمالي المبيعات. على جهاز الكمبيوتر المحمول (i7، 16 غيغابايت من ذاكرة الوصول العشوائي)، الاستعلام يأخذ أي مكان من 3-4 ثوان لتشغيل. قد لا يبدو ذلك وكأنه نهاية العالم، ولكن بعض المستخدمين قد يتوقعون نتائج قريبة من لحظة (الطريقة التي قد ترى نتائج شبه فورية عند استخدام إكسيل مقابل مكعب أولاب). الفهرس الوحيد الموجود حاليا على هذا الجدول هو فهرس متفاوت المسافات لمفتاح المبيعات. إذا نظرنا إلى خطة التنفيذ، سكل سيرفر يجعل اقتراح لإضافة فهرس تغطية إلى الجدول: الآن، فقط لأن سكل سيرفر يقترح فهرس، يعني tn39 يجب عليك إنشاء الفهارس عمياء على كل رسالة اقتباس إندكسكوت. ومع ذلك، في هذه الحالة، يكتشف سكل سيرفر أننا تصفية استنادا إلى السنة، واستخدام مفتاح المنتج ومبلغ المبيعات. لذلك، يقترح سكل سيرفر مؤشر تغطية، مع داتيكي كحقل مفتاح الفهرس. السبب الذي نسميه هذا مؤشر كوتوفرينجكوت لأن سكل سيرفر سوف كوتبرينغ على طول الحقول غير المفتاحكوت استخدمنا في الاستعلام، كوتور ريديكوت. وبهذه الطريقة، سكل سيرفر لا تحتاج إلى استخدام الجدول أو الفهرس متفاوت المسافات في كافة محركات قاعدة البيانات يمكن ببساطة استخدام مؤشر تغطية الاستعلام. تغطية المؤشرات تحظى بشعبية في بعض البيانات تخزين البيانات والإبلاغ سيناريوهات، على الرغم من أنها لا تأتي بتكلفة محرك قاعدة البيانات الحفاظ عليها. ملاحظة: تغطي الفهارس حول لفترة طويلة، لذلك أنا haven39t حتى الآن غطت مؤشر كولومنستور ومخزن الاستعلام. لذلك، سأقوم بإضافة مؤشر التغطية: إذا قمت بإعادة تنفيذ نفس الاستعلام ركضت قبل لحظة (تلك التي جمعت كمية المبيعات لكل منتج)، الاستعلام في بعض الأحيان يبدو لتشغيل حوالي ثانية أسرع، وأحصل على خطة تنفيذ مختلفة، واحدة التي تستخدم مؤشر تسعى بدلا من فهرس المسح الضوئي (باستخدام مفتاح التاريخ على مؤشر تغطية لاسترداد المبيعات لعام 2009). لذلك، قبل مؤشر كولومنستور، يمكن أن يكون هذا طريقة واحدة لتحسين هذا الاستعلام في الإصدارات القديمة من سكل سيرفر. تشغيله أسرع قليلا من أول واحد، وأنا الحصول على خطة التنفيذ مع مؤشر تسعى بدلا من مسح الفهرس. ومع ذلك، هناك بعض القضايا: واثنين من مشغلي التنفيذ كوتيندكس سيكوت و كوتهاش المباراة (مجموع) كوت على حد سواء تعمل أساسا عن طريق روكوت. تخيل ذلك في جدول يحتوي على مئات الملايين من الصفوف. ذات الصلة، والتفكير في محتويات جدول الحقائق: في هذه الحالة، قيمة مفتاح تاريخ واحد أندور قيمة مفتاح منتج واحد قد تتكرر عبر مئات الآلاف من الصفوف (تذكر، يحتوي الجدول حقيقة أيضا مفاتيح للجغرافيا والترويج، بائع ، وما إلى ذلك) لذلك، عندما كوتندكس سيكوت و كوتهاش ماتشكوت صف العمل حسب الصف، وأنها تفعل ذلك على القيم التي قد تتكرر عبر العديد من الصفوف الأخرى. هذا هو عادة حيث I39d سيجو إلى سكل سيرفر كولومنستور الفهرس الذي يقدم سيناريو لتحسين أداء هذا الاستعلام بطرق مذهلة. ولكن قبل أن أفعل ذلك، Let39s العودة في الوقت المناسب. Let39s العودة إلى عام 2010، عندما قدمت مايكروسوفت وظيفة إضافية ل إكسيل المعروفة باسم بويربيفوت. قد يتذكر الكثير من الناس مشاهدة العروض التوضيحية ل بويربيفوت ل إكسيل، حيث يمكن للمستخدم قراءة الملايين من الصفوف من مصدر بيانات خارجي إلى إكسيل. سوف بويربيفوت ضغط البيانات، وتوفير محرك لإنشاء الجداول المحورية ومخططات البيفوت التي أجريت بسرعة مذهلة ضد البيانات المضغوطة. يستخدم بويربيفوت تقنية في الذاكرة التي وصفتها ميكروسوفت كوفرتيباكوت. هذه التكنولوجيا في الذاكرة في بويربيفوت سوف تتخذ أساسا مكررة القيم الرئيسية كييفورين الأعمال وضغط عليها وصولا إلى ناقلات واحدة. كما أن التكنولوجيا الموجودة في الذاكرة سوف تقوم بتقسيم هذه القيم بالتوازي، في كتل عدة مئات في المرة الواحدة. وخلاصة القول هو أن مايكروسوفت خبز كمية كبيرة من تحسينات الأداء في ميزة فيرتيباق في الذاكرة بالنسبة لنا لاستخدام، والحق من مربع المثل. لماذا أنا أخذ هذا نزهة صغيرة أسفل حارة الذاكرة لأنه في سكل سيرفر 2012، نفذت ميكروسوفت واحدة من أهم الميزات في تاريخ محرك قاعدة البيانات الخاصة بهم: مؤشر كولومنستور. الفهرس هو في الحقيقة فهرس بالاسم فقط: هو طريقة لاتخاذ جدول سكل سيرفر وإنشاء مخزن عمود مضغوط في الذاكرة يقوم بضغط قيم المفتاح الخارجي المكرر وصولا إلى قيم متجه واحد. أنشأت ميكروسوفت أيضا تجمع الاحتياطي الجديد لقراءة هذه القيم متجه مضغوط بالتوازي، وخلق إمكانات لتحقيق مكاسب أداء ضخمة. لذلك، I39m الذهاب إلى إنشاء فهرس العمودية على الطاولة، و I39ll نرى كم أفضل (وأكثر كفاءة) تشغيل الاستعلام، مقابل الاستعلام الذي يتم تشغيله ضد مؤشر التغطية. لذلك، I39ll إنشاء نسخة مكررة من فاكتونلينزاليس (I39ll نسميها فاكتونلينزاليسديتايلنكس)، و I39ll إنشاء فهرس العمودية على الجدول مكررة بهذه الطريقة أنا won39t تتداخل مع الجدول الأصلي ومؤشر تغطي بأي شكل من الأشكال. بعد ذلك، I39ll إنشاء فهرس العمودية على الجدول الجديد: لاحظ عدة أشياء: I39ve المحدد عدة أعمدة المفتاح الأجنبي، فضلا عن مبلغ المبيعات. تذكر أن فهرس الأعمدة ليس مثل فهرس مخزن الصف التقليدي. ليس هناك كوتيكوت. نحن ببساطة تشير إلى الأعمدة التي يجب ضغط سكل سيرفر ووضعها في مخزن عمود في الذاكرة. لاستخدام تشبيه بويربيفوت ل إكسيل عندما نقوم بإنشاء فهرس عمود، we39re نقول سكل سيرفر أن تفعل أساسا نفس الشيء الذي فعلت بويربيفوت عندما استوردنا 20 مليون صف في إكسيل باستخدام بويربيفوت لذلك، I39ll إعادة تشغيل الاستعلام، وهذه المرة باستخدام جدول فاكتونلينزاليسديتايلنكس مكرر الذي يحتوي على فهرس مخزن العمود. يتم تشغيل هذا الاستعلام على الفور في أقل من ثانية. ويمكنني أيضا أن أقول أنه حتى لو كان الجدول مئات الملايين من الصفوف، فإنه لا يزال يعمل في كوتابات المثل من إيلاشكوت. يمكننا أن ننظر في خطة التنفيذ (وفي لحظات قليلة، ونحن سوف)، ولكن الآن الوقت 39s لتغطية ميزة مخزن الاستعلام. تخيل للحظة، أننا أجرينا كلا الاستعلامات بين عشية وضحاها: الاستعلام الذي استخدم الجدول فاكتونلينزاليس العادية (مع مؤشر التغطية) ثم الاستعلام الذي استخدم الجدول المكررة مع فهرس العمود. عند تسجيل الدخول في صباح اليوم التالي، نحن نرغب في رؤية خطة التنفيذ لكل من الاستعلامات عند حدوثها، فضلا عن إحصاءات التنفيذ. وبعبارة أخرى، we39d ترغب في رؤية نفس الإحصاءات التي we39d تكون قادرة على معرفة ما إذا كنا ركض كل من الاستفسارات بشكل تفاعلي في ستوديو إدارة سكل، تحولت في تايم وإحصاءات إو، وعرضت خطة التنفيذ مباشرة بعد تنفيذ الاستعلام. حسنا، أن 39s ما مخزن الاستعلام يسمح لنا القيام به يمكننا تشغيل (تمكين) مخزن الاستعلام لقاعدة بيانات، والذي سيؤدي سكل سيرفر لتخزين تنفيذ الاستعلام والتخطيط الإحصاءات حتى نتمكن من عرضها في وقت لاحق. لذلك، I39m الذهاب إلى تمكين مخزن الاستعلام على قاعدة بيانات كونتوسو مع الأمر التالي (و I39ll أيضا مسح أي التخزين المؤقت): ثم I39ll تشغيل اثنين من الاستعلامات (و كوتريبندكوت التي ركضتها قبل ساعات): الآن Let39s تدعي أنها ركضت ساعات منذ. وفقا لما قلته، فإن مخزن الاستعلام التقاط إحصاءات التنفيذ. فكيف أرى لهم لحسن الحظ، أن 39s من السهل جدا. إذا قمت بتوسيع قاعدة بيانات كونتوسو دو، I39ll راجع مجلد "استعلام مخزن". مخزن الاستعلام لديه وظائف هائلة و I39ll محاولة لتغطية الكثير من ذلك في المشاركات بلوق لاحقة. ولكن في الوقت الراهن، أريد عرض إحصاءات التنفيذ على الاستعلامات اثنين، وعلى وجه التحديد فحص مشغلي التنفيذ لمؤشر المخازن. لذلك I39ll انقر بزر الماوس الأيمن فوق أعلى استعلامات الموارد المستهلك وتشغيل هذا الخيار. هذا يعطيني الرسم البياني مثل واحد أدناه، حيث أستطيع أن أرى مدة تنفيذ التنفيذ (بالمللي ثانية) لجميع الاستعلامات التي تم تنفيذها. في هذه الحالة، كان الاستعلام 1 الاستعلام ضد الجدول الأصلي مع فهرس التغطية، وكان الاستعلام 2 ضد الجدول مع فهرس الأعمدة. أرقام don39t تكمن مؤشر مخزن تجاوزت أداء مؤشر تابلكوفرينغ الأصلي بعامل ما يقرب من 7 إلى 1. يمكنني تغيير المقياس للنظر في استهلاك الذاكرة بدلا من ذلك. في هذه الحالة، لاحظ أن الاستعلام 2 (استعلام الفهرس عمود مخزن) استخدام ذاكرة أكثر بكثير. هذا يوضح بوضوح لماذا مؤشر العمودية يمثل التكنولوجيا كوتين-ميموريكوت تحميل سكل سيرفر مؤشر مخزن العمود بأكمله في الذاكرة ويستخدم تجمع المخزن المؤقت مختلفة تماما مع مشغلي التنفيذ المحسنة لمعالجة الفهرس. موافق، لذلك لدينا بعض الرسوم البيانية لعرض إحصائيات التنفيذ يمكن أن نرى خطة التنفيذ (ومشغلي التنفيذ) المرتبطة بكل تنفيذ نعم، يمكننا إذا قمت بالنقر فوق شريط العمودي للاستعلام الذي استخدم فهرس العمود، you39ll انظر التنفيذ خطة أدناه. أول شيء نراه هو أن سكل سيرفر إجراء فحص فهرس العمود، والتي تمثل ما يقرب من 100 من تكلفة الاستعلام. قد تكون تقول، كوتايت دقيقة واحدة، الاستعلام الأول يستخدم مؤشر تغطية وأداء فهرس تسعى فكيف يمكن أن يكون مسح فهرس العمودية يكون أسرع من أن 39s سؤالا مشروعا، ولحسن الحظ هناك 39s الجواب. حتى عندما يقوم الاستعلام الأول بإجراء فهرس، فإنه لا يزال تنفيذ كوترو بواسطة روكوت. إذا وضعت الماوس فوق عامل المسح الضوئي عامل مسح الفهرس، أرى تلميح (مثل واحد أدناه)، مع إعداد واحد مهم: وضع التنفيذ هو باتش (على عكس رو، وهو ما كان لدينا مع الاستعلام الأول باستخدام تغطي المؤشر). هذا الوضع باتش يخبرنا أن سكل سيرفر معالجة ناقلات مضغوط (لأي القيم مفتاح أجنبي التي يتم تكرارها، مثل مفتاح المنتج ومفتاح التاريخ) في دفعات ما يقرب من 1000، بالتوازي. لذلك سكل سيرفر لا يزال قادرا على معالجة مؤشر عمود أكثر من ذلك بكثير بكفاءة. بالإضافة إلى ذلك، إذا وضعت الماوس فوق مهمة هاش ماتش (التجميع)، أرى أيضا أن سكل سيرفر يتم تجميع فهرس مخزن العمود باستخدام وضع دفعة (على الرغم من أن المشغل نفسه يمثل مثل هذه النسبة الصغيرة من تكلفة الاستعلام) وأخيرا، أنت قد يسأل، كوتوك، لذلك سكل سيرفر ضغط القيم في البيانات، يعامل القيم كمتجهات، وقراءتها في كتل ما يقرب من ألف القيم بالتوازي ولكن الاستعلام الخاص بي يريد فقط البيانات لعام 2009. لذلك هو سكل سيرفر المسح الضوئي فوق مجموعة كاملة من داتاكوت مرة أخرى، سؤال جيد. الجواب هو، كوتنوت ريليكوت. لحسن الحظ بالنسبة لنا، تجمع مخزن المخزن المؤقت مخزن عمود جديد وظيفة أخرى تسمى كوتسيجمنت إكستراكتيونكوت. في الأساس، سيقوم سكل سيرفر بفحص قيم المتجهات للعمود مفتاح التاريخ في فهرس العمود، وإزالة الشرائح التي تقع خارج نطاق عام 2009. I39ll توقف هنا. في المشاركات بلوق لاحق I39ll تغطية كل من مخزن عمود ومخزن الاستعلام بمزيد من التفصيل. أساسا، ما رأينا هنا اليوم هو أن مؤشر كولومنستور يمكن أن تسرع إلى حد كبير الاستعلامات التي سكاناجريغات على كميات كبيرة من البيانات، ومخزن الاستعلام التقاط عمليات تنفيذ الاستعلام والسماح لنا لفحص التنفيذ وإحصاءات الأداء في وقت لاحق. في النهاية، we39d ترغب في إنتاج مجموعة النتائج التي تبين ما يلي. لاحظ ثلاثة أشياء: الأعمدة أساسا محورية كل من أسباب العودة المحتملة، بعد عرض مبلغ المبيعات مجموعة النتائج تحتوي على المجاميع الفرعية بحلول نهاية الأسبوع (الأحد) التاريخ عبر جميع العملاء (حيث العميل هو نول) مجموعة النتائج يحتوي على المجموع الكلي صف (حيث العميل والتاريخ على حد سواء نول) أولا، قبل أن ندخل في نهاية سكل يمكننا استخدام القدرة بيفوتماتريكس ديناميكية في سرس. سنحتاج ببساطة إلى الجمع بين مجموعتي النتائج من عمود واحد ثم يمكننا تغذية النتائج إلى مراقبة مصفوفة سرس، والتي سوف تنتشر أسباب العودة عبر محور الأعمدة من التقرير. ومع ذلك، لا يستخدم الجميع سرس (على الرغم من أن معظم الناس ينبغي). ولكن حتى في هذه الحالة، يحتاج المطورون أحيانا إلى استهلاك مجموعات النتائج في شيء آخر غير أداة الإبلاغ. لذلك لهذا المثال، Let39s نفترض أننا نريد أن ننتج مجموعة النتائج لصفحة شبكة ويب وربما المطور يريد كوتستريب استبعاد الصفوف المجموع الفرعي (حيث لدي قيمة ريسولتسستنوم 2 و 3) ووضعها في شبكة ملخص. حتى الخط السفلي، ونحن بحاجة لتوليد الناتج أعلاه مباشرة من إجراء المخزنة. و كما أضاف تويست الأسبوع المقبل يمكن أن يكون سبب العودة X و Y و Z. لذلك نحن don39t معرفة عدد أسباب العودة يمكن أن يكون هناك. نحن نريد بسيط الاستعلام إلى محورية القيم المحتملة المحتملة لسبب الإرجاع. هنا حيث T - سكل بيفوت لديه قيود نحن بحاجة إلى توفيره القيم الممكنة. منذ أننا فاز 39t نعرف أنه حتى وقت التشغيل، ونحن بحاجة إلى إنشاء سلسلة الاستعلام ديناميكيا باستخدام نمط سكل الحيوي. يتضمن نمط سكل الديناميكي توليد بناء الجملة، قطعة قطعة، تخزينها في سلسلة، ثم تنفيذ السلسلة في النهاية. ديناميك سكل يمكن أن تكون صعبة، كما لدينا لتضمين بناء الجملة داخل سلسلة. ولكن في هذه الحالة، لدينا الخيار الحقيقي الوحيد إذا أردنا التعامل مع عدد متغير من أسباب العودة. I39ve وجدت دائما أن أفضل طريقة لإنشاء حل سكل الديناميكي هو من خلال معرفة ما كوتيدالكوت ولدت الاستعلام سيكون في النهاية (في هذه الحالة، نظرا لأسباب عودة نعرفها عن)، ثم عكس الهندسة ذلك عن طريق قطع معا جزء واحد في وقت واحد. وهكذا، هنا هو سكل نحن بحاجة إذا كنا نعرف أن أسباب العودة (A إلى D) كانت ثابتة ولن تتغير. يقوم الاستعلام بما يلي: دمج البيانات من ساليسداتا مع البيانات من ريتورداتا حيث نحن كوثارد-ويريكوت كلمة المبيعات كنوع إجراء شكل جدول المبيعات ثم قم باستخدام سبب الإرجاع من بيانات الإرجاع في نفس العمود أكتيونتيب. وهذا سيعطينا العمود أكتيونتيب نظيفة التي محور. نحن الجمع بين عبارات سيليكت اثنين إلى تعبير جدول مشترك (كت)، وهو أساسا الاستعلام الفرعي الجدول المشتقة التي نستخدمها لاحقا في العبارة التالية (إلى بيفوت) عبارة بيفوت ضد كت، التي تجمع الدولارات لنوع الإجراء في أحد قيم نوع الإجراء الممكنة. لاحظ أن هذا isn39t مجموعة النتيجة النهائية. نحن نضع هذا في كت التي تقرأ من كت الأولى. والسبب في ذلك هو أننا نريد أن نفعل مجموعات متعددة في النهاية. عبارة سيليكت النهائية التي تقرأ من بيفوتكت، ويجمعها مع استعلام لاحق ضد بيفوتكت نفسه، ولكن حيث نقوم أيضا بتنفيذ مجموعتين في ميزة مجموعات التجميع في سكل 2008: تجميع حسب تاريخ نهاية الأسبوع (dbo. WeekEndingDate) تجميع لجميع الصفوف () حتى إذا كنا نعرف على وجه اليقين أن we39d لم يكن لديك أكثر رموز العودة السبب، ثم هذا سيكون الحل. ومع ذلك، نحن بحاجة إلى حساب رموز السبب الأخرى. لذلك نحن بحاجة إلى إنشاء هذا الاستعلام بأكمله أعلاه سلسلة واحدة كبيرة حيث أننا بناء أسباب العودة المحتملة كقائمة واحدة مفصولة بفواصل. I39m الذهاب لإظهار كامل رمز سكل T لتوليد (وتنفيذ) الاستعلام المطلوب. ثم I39ll كسر بها إلى أجزاء وشرح كل خطوة. أولا، هنا 39s رمز كامل لتوليد حيوي ما حصلت I39ve أعلاه. وهناك في الأساس خمس خطوات نحتاج إلى تغطيتها. الخطوة 1 . ونحن نعلم أن في مكان ما في هذا المزيج، ونحن بحاجة إلى إنشاء سلسلة لهذا في الاستعلام: ساليسامونت، السبب A، السبب B، السبب C، السبب D0160016001600160 ما يمكننا القيام به هو بنيت التعبير الجدول المشترك المؤقت الذي يجمع بين الثابت كوتساليس السلكية عمود كولومكوت مع قائمة فريدة من رموز السبب المحتملة. مرة واحدة لدينا ذلك في كت، يمكننا استخدام خدعة صغيرة لطيفة ل شمل باث (3939) لانهيار تلك الصفوف في سلسلة واحدة، وضع فاصلة أمام كل صف أن يقرأ الاستعلام، ومن ثم استخدام ستوف لاستبدال المرحلة الأولى من فاصلة مع مساحة فارغة. هذا هو خدعة التي يمكنك أن تجد في مئات من بلوق سكل. لذلك هذا الجزء الأول يبني سلسلة تسمى أكتيونسترينغ التي يمكننا استخدامها أكثر إلى أسفل. الخطوة 2 . ونحن نعلم أيضا أن we39ll تريد أن سوم أعمدة سبب جيندربيفوتد، جنبا إلى جنب مع العمود المبيعات القياسية. لذلك we39ll بحاجة إلى سلسلة منفصلة لذلك، الذي I39ll استدعاء سومسترينغ. I39ll ببساطة استخدام أكتيونسترينغ الأصلي، ثم ريبلاس الأقواس الخارجية مع بناء جملة سوم، بالإضافة إلى الأقواس الأصلية. الخطوة 3: الآن يبدأ العمل الحقيقي. باستخدام هذا الاستعلام الأصلي كنموذج، نريد إنشاء الاستعلام الأصلي (بدءا من ونيون من الجدولين)، ولكن استبدال أي مراجع للأعمدة المحورية مع السلاسل التي تم إنشاؤها ديناميكيا أعلاه. أيضا، في حين لم يكن مطلوبا تماما، I39ve أيضا إنشاء متغير ببساطة أي تركيبات تغذية عود النقل التي نريد تضمينها في الاستعلام الذي تم إنشاؤه (لقراءة). لذلك we39ll بناء الاستعلام بأكمله إلى متغير يسمى سكلبيفوتكيري. الخطوة 4. ونحن نواصل بناء الاستعلام مرة أخرى، تسلسل بناء الجملة يمكننا كوثارد-ويريكوت مع أكتيونسيلكتسترينغ (التي ولدت ديناميكيا لعقد كل قيم سبب عودة المحتملة) الخطوة 5. وأخيرا، we39ll توليد الجزء الأخير من الاستعلام المحوري، الذي يقرأ من 2 التعبير الجدول المشترك (بيفوتكت، من النموذج أعلاه) ويولد سيليكت النهائي للقراءة من بيفوتكت ودمجها مع 2 الثانية قراءة ضد بيفوتكت إلى تنفيذ مجموعات التجميع. وأخيرا، يمكننا كوتكسكوتكوت السلسلة باستخدام نظام سكل المخزنة بروك سبيكسكوتسول لذلك نأمل أن ترى أن عملية التالية لهذا النوع من الجهد هو تحديد ما الاستعلام النهائي سيكون، استنادا إلى مجموعة الحالية من البيانات والقيم (أي بنيت نموذج الاستعلام) كتابة التعليمات البرمجية T-سكل اللازمة لإنشاء نموذج الاستعلام هذا كسلسلة. يمكن القول إن الجزء الأكثر أهمية هو تحديد مجموعة فريدة من القيم التي يمكنك بيفوت لك 39، ومن ثم طيها في سلسلة واحدة باستخدام وظيفة ستوف و ل شمل باث (3939) خدعة حتى ماذا يكون في ذهني اليوم حسنا، على الأقل 13 البنود اثنين قبل صيف، كتبت مشروع بر الذي ركز (جزئيا) على دور التعليم وقيمة خلفية الفنون الليبرالية جيدة ليس فقط لصناعة البرمجيات ولكن حتى بالنسبة للصناعات الأخرى كذلك. واحدة من مواضيع هذا بدر خاص أكد وجهة نظر محورية ومستنيرة من مهندس البرمجيات الشهير ألين هولوب فيما يتعلق الفنون الحرة. يعبر إل (بصدق) عن رسالته: سلط الضوء على أوجه الشبه بين البرمجة ودراسة التاريخ، من خلال تذكير الجميع بأن التاريخ هو القراءة والكتابة (وإضافة إل، وتحديد الأنماط)، وتطوير البرمجيات هو أيضا القراءة والكتابة (ومرة أخرى، تحديد الأنماط ). وهكذا كتبت مقالة رأي ركزت على هذا الموضوع وغيره من الموضوعات ذات الصلة. ولكن حتى اليوم، لم أحصل أبدا على إما نشره. كل ما في كثير من الأحيان إد التفكير في تنقيحه، و إد حتى الجلوس لبضع دقائق وإجراء بعض التعديلات عليه. ولكن بعد ذلك الحياة بشكل عام سوف تحصل في الطريق و إد أبدا الانتهاء منه. لذلك ما تغير قبل بضعة أسابيع، كتب الكاتب كود مجلة زميل وزعيم الصناعة تيد نيوارد قطعة في عموده العادي، المدرب المبرمج، التي لفتت انتباهي. عنوان المقال هو على الفنون الليبرالية. وأنا أوصي أن الجميع قراءتها. تيد يناقش قيمة خلفية الفنون الحرة، والانقسام كاذبة بين خلفية الفنون الليبرالية والنجاح في تطوير البرمجيات، والحاجة إلى وريتيكومونيكات جيدا. ويتحدث عن بعض لقاءاته السابقة مع إدارة شؤون العاملين في الموارد البشرية فيما يتعلق بخلفيته التعليمية. كما يشدد على الحاجة إلى قبول والتكيف مع التغيرات في صناعتنا، فضلا عن السمات المميزة لنجاح البرمجيات المهنية (موثوق بها، والتخطيط للمستقبل، والتعلم للحصول على الصراع الأولي الماضي مع أعضاء الفريق الآخرين). لذلك لها قراءة كبيرة، وكذلك تيدس مقالات كود الأخرى ومدونات بلوق. كما أعادتني إلى التفكير في آرائي حول هذا الموضوع (والمواضيع الأخرى)، ودفعني أخيرا إلى إنهاء افتتاحيةي الخاصة. لذلك، في وقت متأخر أفضل من أبدا، وهنا بلدي الحالي الخبازين عشرات من تأملات: لدي قول مأثور: يتجمد الماء في 32 درجة. إذا كنت في دور التدريب، قد تعتقد أنك تفعل كل شيء في العالم لمساعدة شخص ما في الواقع، انهم يشعرون فقط درجة حرارة 34 درجة، وبالتالي الأمور أرينت ترسيخ بالنسبة لهم. في بعض الأحيان يستغرق سوى القليل من الجهد أو محفز إيديتشيميكال آخر أو منظور جديد مما يعني أن أولئك الذين لديهم تعليم سابق يمكن أن تعتمد على مصادر مختلفة. يتجمد الماء عند 32 درجة. بعض الناس يمكن الحفاظ على مستويات عالية من التركيز حتى مع غرفة مليئة الناس صاخبة. أنا لا أحد منهم أحيانا أحتاج إلى بعض الخصوصية للتفكير من خلال قضية حرجة. بعض الناس يصفون هذا كما كنت تعلم فلدي على المشي بعيدا عن ذلك. وبطريقة أخرى، بحثا عن الهواء نادر. هذا الأسبوع الماضي قضيت ساعات في نصف مضاءة، غرفة هادئة مع السبورة، حتى فهمت تماما مشكلة. وعندئذ فقط يمكنني التحدث مع المطورين الآخرين حول الحل. الرسالة هنا هو عدم الوعظ كيف يجب أن تذهب حول عملك من حل المشاكل ولكن بدلا للجميع لمعرفة نقاط القوة وما يعمل، واستخدامها لصالحك قدر الإمكان. بعض العبارات مثل الأظافر على السبورة بالنسبة لي. استخدامه بمثابة لحظة التدريس هو واحد. (لماذا هو مثل الأظافر على السبورة لأنه إذا كنت في دور التوجيه، يجب أن تكون عادة في تدريس الوضع لحظة على أي حال، ولكن بمهارة). هيريس آخر لا أستطيع أن أشرح حقا في الكلمات، ولكن أنا أفهم ذلك. هذا قد يبدو قليلا البرد، ولكن إذا كان الشخص حقا لا يمكن تفسير شيء في الكلمات، ربما لا يفهمون. بالتأكيد، يمكن للشخص أن يكون شعور غامض كيف يعمل شيء يمكنني خداع طريقي من خلال وصف كيف تعمل الكاميرا الرقمية ولكن الحقيقة هي أنني لا أفهم حقا كل ذلك بشكل جيد. هناك مجال دراسة يعرف باسم نظرية المعرفة (دراسة المعرفة). واحدة من الأسس الأساسية لفهم ما إذا كانت الكاميرا أو نمط التصميم - هو القدرة على إنشاء السياق، لتحديد سلسلة من الأحداث ذات الصلة، وخصائص أي مكونات على طول الطريق، وما إلى ذلك نعم، والفهم هو في بعض الأحيان العمل الشاق جدا ، ولكن الغوص في موضوع وكسرها بعيدا يستحق هذا الجهد. وحتى أولئك الذين يتجنبون الشهادة سيعترفون بأن عملية دراسة اختبارات الاعتماد ستساعد على سد الثغرات في المعرفة. مدير إدارة قاعدة البيانات هو أكثر عرضة لتوظيف مطور قاعدة البيانات الذين يمكن أن يتكلمون بشكل مؤقت (وبدون عناء) حول مستويات العزلة المعاملات والمشغلات، على عكس شخص من نوع يعرف عن ذلك ولكن يكافح لوصف استخدامها. ثيريس نتيجة طبيعية أخرى هنا. ويوصي تيد نيوارد بأن يقوم المطورون بالتحدث أمام الجمهور والتدوين وما إلى ذلك. أوافق 100. إن عملية التحدث العام والمدونات ستجبرك عمليا على البدء في التفكير في المواضيع وكسر التعاريف التي ربما تكون قد اتخذت بطريقة غير مقبولة. قبل بضع سنوات ظننت أنني فهمت بيان T-سكل ميرج بشكل جيد. ولكن فقط بعد الكتابة عن ذلك، والتحدث عن، وإدخال الأسئلة من الآخرين الذين لديهم وجهات النظر التي لم يحدث لي أن مستوى تفهم بلدي زيادة أضعافا مضاعفة. أعرف قصة مدير التوظيف الذي أجرى مقابلة مع أوثورديفيلوبر لموقف العقد. وكان مدير التوظيف في ازدراء من المنشورات بشكل عام، ونباح في مقدم الطلب، لذلك، إذا كنت ذاهب للعمل هنا، وكنت بدلا من ذلك كتابة الكتب أو كتابة التعليمات البرمجية نعم، إل منح أنه في أي صناعة سيكون هناك عدد قليل من الأكاديميين نقية. ولكن ما غاب عنه مدير التوظيف كان فرص تعزيز وشحذ مجموعات المهارات. أثناء تنظيف مربع قديم من الكتب، جئت عبر كنز من 1980s: المبرمجين في العمل. الذي يحتوي على مقابلات مع شاب صغير جدا بيل غيتس، راي أوزي، وغيرها من الأسماء المعروفة. كل مقابلة وكل البصيرة يستحق ثمن الكتاب. في رأيي، كانت المقابلة الأكثر إثارة للاهتمام مع بتلر لامبسون. الذي قدم بعض النصائح القوية. إلى الجحيم مع محو الأمية الكمبيوتر. لها مثير للسخرية على الاطلاق. دراسة الرياضيات. تعلم التفكير. اقرأ. Write. These things are of more enduring value. Learn how to prove theorems: A lot of evidence has accumulated over the centuries that suggests this skill is transferable to many other things. Butler speaks the truth . Ill add to that point learn how to play devils advocate against yourself. The more you can reality-check your own processes and work, the better off youll be. The great computer scientistauthor Allen Holub made the connection between software development and the liberal arts specifically, the subject of history. Here was his point: what is history Reading and writing. What is software development Among other things, reading and writing . I used to give my students T-SQL essay questions as practice tests. One student joked that I acted more like a law professor. Well, just like Coach Donny Haskins said in the movie Glory Road, my way is hard. I firmly believe in a strong intellectual foundation for any profession. Just like applications can benefit from frameworks, individuals and their thought processes can benefit from human frameworks as well. Thats the fundamental basis of scholarship. There is a story that back in the 1970s, IBM expanded their recruiting efforts in the major universities by focusing on the best and brightest of liberal arts graduates. Even then they recognized that the best readers and writers might someday become strong programmersystems analysts. (Feel free to use that story to any HR-type who insists that a candidate must have a computer science degree) And speaking of history: if for no other reason, its important to remember the history of product releases if Im doing work at a client site thats still using SQL Server 2008 or even (gasp) SQL Server 2005, I have to remember what features were implemented in the versions over time. Ever have a favorite doctor whom you liked because heshe explained things in plain English, gave you the straight truth, and earned your trust to operate on you Those are mad skills . and are the result of experience and HARD WORK that take years and even decades to cultivate. There are no guarantees of job success focus on the facts, take a few calculated risks when youre sure you can see your way to the finish line, let the chips fall where they may, and never lose sight of being just like that doctor who earned your trust. Even though some days I fall short, I try to treat my client and their data as a doctor would treat patients. Even though a doctor makes more money There are many clichs I detest but heres one I dont hate: There is no such thing as a bad question. As a former instructor, one thing that drew my ire was hearing someone criticize another person for asking a supposedly, stupid question. A question indicates a person acknowledges they have some gap in knowledge theyre looking to fill. Yes, some questions are better worded than others, and some questions require additional framing before they can be answered. But the journey from forming a question to an answer is likely to generate an active mental process in others. There are all GOOD things. Many good and fruitful discussions originate with a stupid question. I work across the board in SSIS, SSAS, SSRS, MDX, PPS, SharePoint, Power BI, DAX all the tools in the Microsoft BI stack. I still write some code from time to time. But guess what I still spend so much time doing writing T-SQL code to profile data as part of the discovery process. All application developers should have good T-SQL chops. Ted Neward writes (correctly) about the need to adapt to technology changes. Ill add to that the need to adapt to clientemployer changes. Companies change business rules. Companies acquire other companies (or become the target of an acquisition). Companies make mistakes in communicating business requirements and specifications. Yes, we can sometimes play a role in helping to manage those changes and sometimes were the fly, not the windshield. These sometimes cause great pain for everyone, especially the I. T. people. This is why the term fact of life exists we have to deal with it. Just like no developer writes bug-free code every time, no I. T. person deals well with change every single time. One of the biggest struggles Ive had in my 28 years in this industry is showing patience and restraint when changes are flying from many different directions. Here is where my prior suggestion about searching for the rarified air can help. If you can manage to assimilate changes into your thought process, and without feeling overwhelmed, odds are youll be a significant asset. In the last 15 months Ive had to deal with a huge amount of professional change. Its been very difficult at times, but Ive resolved that change will be the norm and Ive tried to tweak my own habits as best I can to cope with frequent (and uncertain) change. Its hard, very hard. But as coach Jimmy Duggan said in the movie A League of Their Own: Of course its hard. If it wasnt hard, everyone would do it. The hard, is what makes it great . A powerful message. Theres been talk in the industry over the last few years about conduct at professional conferences (and conduct in the industry as a whole). Many respected writers have written very good editorials on the topic. Heres my input, for what its worth. Its a message to those individuals who have chosen to behave badly: Dude, it shouldnt be that hard to behave like an adult. A few years ago, CoDe Magazine Chief Editor Rod Paddock made some great points in an editorial about Codes of Conduct at conferences. Its definitely unfortunate to have to remind people of what they should expect out of themselves. But the problems go deeper. A few years ago I sat on a five-person panel (3 women, 2 men) at a community event on Women in Technology. The other male stated that men succeed in this industry because the Y chromosome gives men an advantage in areas of performance. The individual who made these remarks is a highly respected technology expert, and not some bozo making dongle remarks at a conference or sponsoring a programming contest where first prize is a date with a bikini model. Our world is becoming increasingly polarized (just watch the news for five minutes), sadly with emotion often winning over reason. Even in our industry, recently I heard someone in a position of responsibility bash software tool XYZ based on a ridiculous premise and then give false praise to a competing tool. So many opinions, so many arguments, but heres the key: before taking a stand, do your homework and get the facts . Sometimes both sides are partly rightor wrong. Theres only one way to determine: get the facts. As Robert Heinlein wrote, Facts are your single clue get the facts Of course, once you get the facts, the next step is to express them in a meaningful and even compelling way. Theres nothing wrong with using some emotion in an intellectual debate but it IS wrong to replace an intellectual debate with emotion and false agenda. A while back I faced resistance to SQL Server Analysis Services from someone who claimed the tool couldnt do feature XYZ. The specifics of XYZ dont matter here. I spent about two hours that evening working up a demo to cogently demonstrate the original claim was false. In that example, it worked. I cant swear it will always work, but to me thats the only way. Im old enough to remember life at a teen in the 1970s. Back then, when a person lost hisher job, (often) it was because the person just wasnt cutting the mustard. Fast-forward to today: a sad fact of life is that even talented people are now losing their jobs because of the changing economic conditions. Theres never a full-proof method for immunity, but now more than ever its critical to provide a high level of what I call the Three Vs (value, versatility, and velocity) for your employerclients. I might not always like working weekends or very late at night to do the proverbial work of two people but then I remember there are folks out there who would give anything to be working at 1 AM at night to feed their families and pay their bills. Always be yourselfyour BEST self. Some people need inspiration from time to time. Heres mine: the great sports movie, Glory Road. If youve never watched it, and even if youre not a sports fan I can almost guarantee youll be moved like never before. And Ill close with this. If you need some major motivation, Ill refer to a story from 2006. Jason McElwain, a high school student with autism, came off the bench to score twenty points in a high school basketball game in Rochester New York. Heres a great YouTube video. His mother said it all . This is the first moment Jason has ever succeeded and is proud of himself. I look at autism as the Berlin Wall. He cracked it. To anyone who wanted to attend my session at todays SQL Saturday event in DC I apologize that the session had to be cancelled. I hate to make excuses, but a combination of getting back late from Detroit (client trip), a car thats dead (blown head gasket), and some sudden health issues with my wife have made it impossible for me to attend. Back in August, I did the same session (ColumnStore Index) for PASS as a webinar. You can go to this link to access the video (itll be streamed, as all PASS videos are streamed) The link does require that you fill out your name and email address, but thats it. And then you can watch the video. Feel free to contact me if you have questions, at kgoffkevinsgoff November 15, 2013 Getting started with Windows Azure and creating SQL Databases in the cloud can be a bit daunting, especially if youve never tried out any of Microsofts cloud offerings. Fortunately, Ive created a webcast to help people get started. This is an absolute beginners guide to creating SQL Databases under Windows Azure. It assumes zero prior knowledge of Azure. You can go to the BDBI Webcasts of this website and check out my webcast (dated 11102013). Or you can just download the webcast videos right here: here is part 1 and here is part 2. You can also download the slide deck here. November 03, 2013 Topic this week: SQL Server Snapshot Isolation Levels, added in SQL Server 2005. To this day, there are still many SQL developers, many good SQL developers who either arent aware of this feature, or havent had time to look at it. Hopefully this information will help. Companion webcast will be uploaded in the next day look for it in the BDBI Webcasts section of this blog. October 26, 2013 Im going to start a weekly post of T-SQL tips, covering many different versions of SQL Server over the years Heres a challenge many developers face. Ill whittle it down to a very simple example, but one where the pattern applies to many situations. Suppose you have a stored procedure that receives a single vendor ID and updates the freight for all orders with that vendor id. create procedure dbo. UpdateVendorOrders update Purchasing. PurchaseOrderHeader set Freight Freight 1 where VendorID VendorID Now, suppose we need to run this for a set of vendor IDs. Today we might run it for three vendors, tomorrow for five vendors, the next day for 100 vendors. We want to pass in the vendor IDs. If youve worked with SQL Server, you can probably guess where Im going with this. The big question is how do we pass a variable number of Vendor IDs Or, stated more generally, how do we pass an array, or a table of keys, to a procedure Something along the lines of exec dbo. UpdateVendorOrders SomeListOfVendors Over the years, developers have come up with different methods: Going all the way back to SQL Server 2000, developers might create a comma-separated list of vendor keys, and pass the CSV list as a varchar to the procedure. The procedure would shred the CSV varchar variable into a table variable and then join the PurchaseOrderHeader table to that table variable (to update the Freight for just those vendors in the table). I wrote about this in CoDe Magazine back in early 2005 (code-magazinearticleprint. aspxquickid0503071ampprintmodetrue. Tip 3) In SQL Server 2005, you could actually create an XML string of the vendor IDs, pass the XML string to the procedure, and then use XQUERY to shred the XML as a table variable. I also wrote about this in CoDe Magazine back in 2007 (code-magazinearticleprint. aspxquickid0703041ampprintmodetrue. Tip 12)Also, some developers will populate a temp table ahead of time, and then reference the temp table inside the procedure. All of these certainly work, and developers have had to use these techniques before because for years there was NO WAY to directly pass a table to a SQL Server stored procedure. Until SQL Server 2008 when Microsoft implemented the table type. This FINALLY allowed developers to pass an actual table of rows to a stored procedure. Now, it does require a few steps. We cant just pass any old table to a procedure. It has to be a pre-defined type (a template). So lets suppose we always want to pass a set of integer keys to different procedures. One day it might be a list of vendor keys. Next day it might be a list of customer keys. So we can create a generic table type of keys, one that can be instantiated for customer keys, vendor keys, etc. CREATE TYPE IntKeysTT AS TABLE ( IntKey int NOT NULL ) So Ive created a Table Typecalled IntKeysTT . Its defined to have one column an IntKey. Nowsuppose I want to load it with Vendors who have a Credit Rating of 1..and then take that list of Vendor keys and pass it to a procedure: DECLARE VendorList IntKeysTT INSERT INTO VendorList SELECT BusinessEntityID from Purchasing. Vendor WHERE CreditRating 1 So, I now have a table type variable not just any table variable, but a table type variable (that I populated the same way I would populate a normal table variable). Its in server memory (unless it needs to spill to tempDB) and is therefore private to the connectionprocess. OK, can I pass it to the stored procedure now Well, not yet we need to modify the procedure to receive a table type. Heres the code: create procedure dbo. UpdateVendorOrdersFromTT IntKeysTT IntKeysTT READONLY update Purchasing. PurchaseOrderHeader set Freight Freight 1 FROM Purchasing. PurchaseOrderHeader JOIN IntKeysTT TempVendorList ON PurchaseOrderHeader. VendorID Te mpVendorList. IntKey Notice how the procedure receives the IntKeysTT table type as a Table Type (again, not just a regular table, but a table type). It also receives it as a READONLY parameter. You CANNOT modify the contents of this table type inside the procedure. Usually you wont want to you simply want to read from it. Well, now you can reference the table type as a parameter and then utilize it in the JOIN statement, as you would any other table variable. لذلك هناك لديك. A bit of work to set up the table type, but in my view, definitely worth it. Additionally, if you pass values from , youre in luck. You can pass an ADO data table (with the same tablename property as the name of the Table Type) to the procedure. For developers who have had to pass CSV lists, XML strings, etc. to a procedure in the past, this is a huge benefit. Finally I want to talk about another approach people have used over the years. SQL Server Cursors. At the risk of sounding dogmatic, I strongly advise against Cursors, unless there is just no other way. Cursors are expensive operations in the server, For instance, someone might use a cursor approach and implement the solution this way: DECLARE VendorID int DECLARE dbcursor CURSOR FASTFORWARD FOR SELECT BusinessEntityID from Purchasing. Vendor where CreditRating 1 FETCH NEXT FROM dbcursor INTO VendorID WHILE FETCHSTATUS 0 EXEC dbo. UpdateVendorOrders VendorID FETCH NEXT FROM dbcursor INTO VendorID The best thing Ill say about this is that it works. And yes, getting something to work is a milestone. But getting something to work and getting something to work acceptably are two different things. Even if this process only takes 5-10 seconds to run, in those 5-10 seconds the cursor utilizes SQL Server resources quite heavily. Thats not a good idea in a large production environment. Additionally, the more the of rows in the cursor to fetch and the more the number of executions of the procedure, the slower it will be. When I ran both processes (the cursor approach and then the table type approach) against a small sampling of vendors (5 vendors), the processing times where 260 ms and 60 ms, respectively. So the table type approach was roughly 4 times faster. But then when I ran the 2 scenarios against a much larger of vendors (84 vendors), the different was staggering 6701 ms versus 207 ms, respectively. So the table type approach was roughly 32 times faster. Again, the CURSOR approach is definitely the least attractive approach. Even in SQL Server 2005, it would have been better to create a CSV list or an XML string (providing the number of keys could be stored in a scalar variable). But now that there is a Table Type feature in SQL Server 2008, you can achieve the objective with a feature thats more closely modeled to the way developers are thinking specifically, how do we pass a table to a procedure Now we have an answer Hope you find this feature help. Feel free to post a comment. Importing SQL Server Data Using SSIS - Which Option is Fastest By: Daniel Calbimonte Read Comments (27) Related Tips: More Integration Services Development This article is useful for SSIS developers who do not know which tasks are best to use in an SSIS projects. The main problem is that at the end of development if performance is slow then you will need to rebuild the project and change components. This article shows various ways of importing data and shows which types of components perform best within SSIS. The contest will be between the following components: ODBC Tasks ADO NET Tasks OLEDB Task SQL Server Destination T-SQL Tasks I created different SSIS packages in order to test performance. In this demo I used SSIS 2012 and the database Adventureworks 2012 . In this demo I am going to import the table AdventureWorks2012.Sales. SalesOrderDetail to the test2 database which is on the same instance of SQL Server. SalesOrderDetails is the table with more rows in AdventureWorks2012. In order to create the database test2 and the destination table dbo. OrderDetails, use this T-SQL code: Test 1 - ODBC Tasks The first example will use ODBC Source and ODBC Destination as shown below: When we run the package we notice the average time is 5 minutes 57 seconds to import the rows: Test 2 - ADO NET Tasks As noticed, ODBC is pretty slow. Lets try another approach. We are going to truncate the destination table first: Lets try ADO tasks to import the same data and verify if these components are faster: The average elapsed time in my testing was 11 seconds. This is much better. Test 3 - OLEDB Tasks This time we are going to import the same data using the OLEDB Tasks. Again we will truncate the table in the test2 database first. The average elapsed time is 5 seconds. Note that I am using the fast load option with the Table Lock option in the OLE DB Destination Task: If we do not use the fast load option, the average elapsed time was 2 minutes and 21 seconds: OK. The fast load option really improves performance. I will return to that configuration. What about the OLE DB Source. By default I am using the option Table or view in the OLE DB Source as shown below: Lets use a SQL Command instead as shown below. The average elapsed time is 2.85 seconds . Test 4 - SQL Server Destination Now, lets try to use the SQL Destination as the destination instead of OLE DB Destination: The average elapsed time is 2.5 seconds. At this point it is the best option. Test 5 - Execute T-SQL Task Finally, some people think that the best option is to use the Execute T-SQL Task: I am using a simple insert statement to import data from one source to another: The average elapsed time is 1.8 seconds Finally Ive been told that if the query runs inside a stored procedure it is even faster: Lets create a stored procedure: After creating the stored procedure we are going to call it in the Execute T-SQL Task: The average elapsed time is 2.12 seconds . The stored procedures does not improve performance. Lets review the table with the results: You may think the morale of the story is to use the Execute T-SQL Task instead of other SSIS tasks. In this example we were importing data on the same instance, but this will not always be the case. So the morale of the story is that there are many alternatives when creating a SSIS project and we have to carefully study the alternatives in different scenarios. There are great SSIS tools and we do not always use the best options. With each new version of SSIS new tasks are added and performance may be improved with existing tasks. The main changes in SSIS for SQL 2008 and 2012 are related to performance improvements. Next Steps If you are working in a SSIS project make sure you are using the best tasks and also verify if there are other SSIS tasks that can be used in your project. Also make sure you are following the best practices recommended by the experts: Last Update: 7132012 Great read and analysis, but I have one caveat to add. If you need to move a large amount of data, you need to take care of the transaction log growth. This is not a much of a concern using SSIS. For instance, I needed to move 1.3 billion rows (15 columns) and began using TSQL which quickly filled my logs. However, using OLE DB Source and Destination (Bulk Inserts) with fast load, there was little impact to the log file. Thursday, September 20, 2012 - 9:19:12 AM - vinodhkumar Its very useful. great job. Thanks Monday, August 27, 2012 - 10:54:42 AM - Orlando Colamatteo I agree with some others that the testbed is a bit contrived. If youre looking to move data from one table to another on the same instance then SSIS will rarely be a viable option. Some form of T-SQL will almost certainly outperform an SSIS operation. A more realistic scenario is moving data between two disparate data sources. It is surpising how poorly the ODBC Destination performs, especially in light of what Microsoft has publicly said in that they will be moving away from OLE DB interfaces and standardizing on ODBC in future products: In the ODBC Destination I expected Microsoft to implement the loading of data via the bulk load API as they did with the FastLoad option of the OLE DB Destination. On a separate note regarding loading data into MySQL with SSIS: In the past I did some performance tests with the Cherry City OLE DB driver for MySQL and it is horribly slow as it only inserts one row at a time. This is not to mention the fact that it crashed BIDS regularly when developing with it. Given the lack of a benefit I would stick with the tools built into SSIS and avoid the hassle of installing and configuring a third party driver. If youre using SSIS 2005 I would recommend using a Script Component as a Destination and issuing batch-inserts against a connection made using the MySQL ODBC Driver: msdn. microsoften-uslibraryms135939.aspx If youre using SSIS 2008 I would recommend using an ADO NET Destination with the MySQL ODBC Driver. In my tests it was only able to achieve about 240 rowsminute throughput to MySQL which is quite disappointing: msdn. microsoften-uslibrarybb895291(vsql.105).aspx If youre using SSIS 2012 I would recommend using an ODBC Destination with the MySQL ODBC Driver. In my tests it outperformed the ADO NET Destination over 3 to 1 but still only achieved about 800 rowsminute throughput, which was still quite disappointing: msdn. microsoften-uslibraryhh758691(vsql.110).aspx

No comments:

Post a Comment