درباره نویسنده

سیدمحمد حسینی

سیدمحمد حسینی

کارشناس سازمان اسناد و املاک- مشاور و برنامه نویس ارشد شرکت اریس رایانه- مدرس دانشگاه- DBA- SQL Server Tuning

25 Comments

  1. مصطفي زماني

    مصطفي زماني

       سلام

    با تشكر به خاطر اين مقاله خوب.

    ديد خوبي در رابطه با نحوه بررسي خروجي پروفايلر و روند بررسي اسكريپت‌هاي زمان‌بر داد.

    پاسخ دادن
  2. ali

    ali

        سلام

    تشكر به خاطر  مقاله 

    پاسخ دادن
  3. مهدی شیشه بری شیشه بری

    مهدی شیشه بری شیشه بری

      مهندس جان من به این ها کد بد نمی گویم. می گویم لانه مورچه!

    پاسخ دادن
  4. حمیدقلیپور

    حمیدقلیپور

       با سلام
           آقای حسینی واقعا گل کاشتین؛ مقالتون بسیار خوب بود ، واقعا باید سعی کنیم از نوشتن کدهای نامرتب (کدهای کثیف) پرهیز کنیم، اگر چند تا مقاله در رابطه با دستورات کاربردی Tsql  ارائه کنید بسیار عالیه.
    سرسبز باشید

    پاسخ دادن
    1. سیدمحمد حسینی

      سیدمحمد حسینی

      سلام

      ممنونم که وقت گذاشتید و خوشحالم که مورد استفاده واقع شد
      پاسخ دادن
  5. امین ثریا

    این اس پی فو العاده سنگین بود ، قصد توهین ندارم اما بنظر نمیرسه جداول خوب طراحی نشده باشن!

    خوشبختانه آقای طاهری  tips & triks های جالب و اموزشها و نکات عالی رو در این مورد اراعه دادن که یکی از اونها استفاده از native sp هست البنه نکته ای که شما فرمودید بنظر کاربردی میرسه اما باز ظاهرا یه جای کار میلنگه!
    پاسخ دادن
    1. سیدمحمد حسینی

      سیدمحمد حسینی

      سلام

      ممنونم که وقت گذاشتید 
      در این که جداول خوب طراحی نشده اند که شکی نیست
      در متن عرض شد که این کد مربوط به یکی از دوستان بنده بود
      البته این کد خیلی خوب بود(نسبت با سایر کدهایی که بنده دیدم در اون سیستم)
      به عنوان مثال یک SP دیگر وجود داشت که اتفاقا از SP های اصلی برنامه بود و در تمامی فرمهای برنامه نیز فراخوانی می شد
      نکته جالب این بود که اجرای این SP حدود ۱۲۰ الی ۱۸۰ ثانیه(با توجه به ورودی ها) طول می کشید و برخی از کارمندان اداراتی که با این سیستم کار می کردند می گفتند که “ما تا یک چایی بخوریم فلان فرم باز می شود”(این دوستان دیگه چقدر صبور بودند)
      بنده این SP رو که بسیار هم کد طولانی داشت، بررسی و تصحیح کردم(هم با تصحیح کد و هم با استفاده از ایندکس های مناسب و…) و زمان اجرای آن را به کمتر از ۱ ثانیه رساندم
      البته بدون استفاده از Native SP
      باز هم ممنون که توجه فرمودید
      پاسخ دادن
  6. علی موذن صفایی

    علی موذن صفایی

        خوندن این کد ها خودش یک پروژه است. 

    پاسخ دادن
  7. وحید

    سلام آقای حسینی چرا کوری من اجرا نمیشه لطفا راهنمایی کنید .

       SELECT customerID, NAME, FAMILY FROM customer WHERE Name= ‘حسین’

    پاسخ دادن
    1. مسعود طاهری

      مسعود طاهری

      سلام کوئری زیر را کپی کنید و در SSMS اجرا کنید به تگ N هم توجه کنید 

             SELECT customerID, NAME, FAMILY FROM customer WHERE Name= N’حسین’

      پاسخ دادن
      1. سیدمحمد حسینی

        سیدمحمد حسینی

        سلام

        با اجازه استاد طاهری عزیز و عذرخواهی از ایشان
        ستون Name شما از نوع یونیکد است(NVARCHAR)
        به خاطر همین هم هنگامی که در شرط می نویسید ‘حسینی’، این کلمه به صورت غیر یونیکد تفسیر میشود،
        برای اصلاح این مشکل همانطور که استاد عزیز فرمودند باید از ‘حسین’N استفاده کنید که در این صورت کلمه مورد نظر شما به صورت یونیکد تفسیر میشود.
  8. وحید

      سلام آقای حسینی و مهندس طاهری عزیز از بابت راهنماییتون ممنونم مشکل هم حل شد  و عذر خواهی میکنم از مهندس طاهری بابات اینکه اولش متوجه نشدم ssms منظورتون SQL Server  من بعد متوجه  شدم فقط ای کاش یک ایمل داشتم ازتون که بتونم بعضی از مشکلات که پیش اومده اینجا نمیتونم مطرح کنم باید عکسشنو بفرستم چند روزی هستش فکرمو درگیر خودش کرده ولی به نتیجه نرسیدم ممنون میشم اگه یک ایمیل بگین تا باهاتون ارتباط داشته باشم ..بازم ازتون واقعا تشکر میکنم خسته نباشید. Management Studio

    پاسخ دادن
  9. رضوان

       سلام
    اگر به جای استفاده از جداول در عملیات Join از select و انتخاب ستونهای مورد نیازمون استفاده میکردیم تاثیر بهتری داشت؟

    پاسخ دادن
    1. سیدمحمد حسینی

      سیدمحمد حسینی

      سلام

      تا جایی که از سوال شما متوجه شدم
      اگر شما به متن کوئری اصلی، دقت کنید(البته میدونم که خیلی بد نوشته شده و شلوغه)، JOINها همه به صورتی هست که شما میفرمایید، و به همین علت هم کند شده
      پاسخ دادن
      1. سیدمحمد حسینی

        سیدمحمد حسینی

        این یه نمونه از کد هست که از وسط کوئری آوردم
        ...INNER JOIN (SELECT vwPerEdu.PersonalID, vwPerEdu.PEducationID,vwPerEdu.CollectDate, vwPerEdu.EduAverage,
        vwPerEdu.Degree, vwPerEdu.DegreeName,vwPerEdu.EduEvidenceID, vwPerEdu.University,
        vwPerEdu.Comments, vwPerEdu.EduBranchID, vwPerEdu.EduEvidenceDetails,
        vwPerEdu.EduDegree, vwPerEdu.EBName,vwPerEdu.IsChangeByOthers
        FROM PerKar.vwPersonnelEducations AS vwPerEdu
        INNER JOIN (SELECT PersonalID,MAX(Degree) AS Degree
        FROM PerKar.vwPersonnelEducations
        GROUP BY PersonalID) AS PersonnelDegrees
        ON vwPerEdu.PersonalID=PersonnelDegrees.PersonalID
        AND vwPerEdu.Degree=PersonnelDegrees.Degree) AS vwPerEdu_1
        ON PerOrg.tbPersonalSpex.PersonalID = vwPerEdu_1.PersonalID
        ...
        از این مدل JOIN چندین بار استفاده شده که همین باعث کند شدن عملیات شده
      2. سیدمحمد حسینی

        سیدمحمد حسینی

        ببخشید کل کد ریخت به هم درحای که من درستش کردم

        اگر دقت بفرمایید، فقط در این تکه کد از ویوو PerKar.vwPersonnelEducations دو بار استفاده شده که خودش با خودش JOIN شده(این ویوو خودش شامل حدود ۱۰ جدول هست) 
        مشابه این مورد زیاد استفاده شده
  10. سید مسعود موحد موحد

    سید مسعود موحد موحد

        بسیار هم عالی فقط خداروشکر کنید که در برابر کد اولیه دوستتون و سازمانشون اصرار فراوا ندارند چون بعضی جاها روی Script های نوشته شده خیلی غیرت دارند و کلا میگن همین کد رو با همین شکل و شمایل تا ۲ روز پیش خوب بوده و ……

    پاسخ دادن
  11. اسماعیل یلمه ها

    اسماعیل یلمه ها

    سلام دوست عزیز

    خسته نباشید.

    سه نکته کوچک درباره کوئری جدیدی که نوشتین:
    ۱٫ استفاده از Temp Table بسیار بهتر از Table Variable  است.
    ۲٫ بهتر از این دو استفاده از CTE است.
    ۳٫ بهتر بود از Nested Select ها استفاده نمی کردین.

    البته با توجه به شلوغ بودن Procedure آن را مطالعه نکردم اما این سه نکته در باز نویسی آن به نظرم رسید که بنویسم.

    پاسخ دادن
  12. محمد جواد پیشوایی

    محمد جواد پیشوایی

    سلام بر همه دوستان بخصوص استاد طاهری و حسینی .
    ضمن تشکر من سوال آقای اسماعیل یلمه ها را اینگونه بپرسم که در این رویه ، استفاده از کدامیک بهتر است ؟
    Temp Table , Table Variable یا CTE ؟

    پاسخ دادن
    1. مسعود طاهری

      مسعود طاهری

      واقعیت این است که سوال خیلی کلی است و با توجه به Case باید جواب داده شود اما این نکته ها را در نظر داشته باشید
      Temp Table و Table Variable ها هر دو در بانک اطلاعاتی TempDB ایجاد می شوند و Worktable برای آنها در نظر گرفته می شود. توجه داشته باشید که برای CTE هم در شرایطی این اتفاق می افتاد مثلا هنگام Spool
      اما در کل شما باید با توجه به شرایط این مورد را در نظر بگیرید

      پاسخ دادن
      1. محمد جواد پیشوایی

        محمد جواد پیشوایی

        تشکر میکنم . موفق باشید .

  13. اسماعیل یلمه ها

    اسماعیل یلمه ها

    کاملا با جناب طاهری در این زمینه که بسته به شرایط باید نظر داد موافقم.

    اما یک نکته کلی، CTE بسیار سریع و هوشمند است. هوشمندی، یعنی اگر لازم نباشد بخشی از کوئری در جواب شرکت داده شود اصلا محاسبه نمی شود در صورتی که وقتی از temp table یا table variable استفاده می کنید باید خروجی را گرفته و داخل این دو قرار دهید و بعد با آن بازی کنید.

    اما اگر داده زیادی دارین و به هر دلیل مجبور هستین از temp table یا table variable استفاده کنید پیشنهاد می شود که از temp table استفاده کنید.

    پاسخ دادن
  14. غلامحسین عبادی

    سلام دوست عزیز . ممنون بابت وقتی که برای این مطلب گذاشتید . سپاس

    پاسخ دادن
  15. داوود طاهرخانی طاهرخانی

    داوود طاهرخانی طاهرخانی

    ممنون خوب بود – اما بهتر بود از جداول موقت استفاده میکردی اگر TempDb تنظیم شده ای داشتی
    چون در حجم داده های زیاد جداول متغیر Estimation Row Count متناسبی نشان نمیدهند مگر اخر هر کویری دستور Recompile رو میزاشتی.

    پاسخ دادن

ارسال نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تمامی حقوق مادی و معنوی این وب سایت متعلق به نیک آموز می باشد.
این سایت توسط تیم آموزش برنامه نویسی نیک آموز مدیریت می شود.