ايران ويج

نسخه‌ی کامل: مشكل عجيب كاهش سرعت در SQL 2008 R2
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
ما دوتا سرور داريم به اسم هاي سرور 1 و سرور 2 كه سرور 2 كانفيگ بسيار بسيار بالاتري نسبت به سرور 1 داره

بر روي سرور 1 ويندوز سرور 2003 و SQL 2000 نصب هست و بر روي سرور 2 Windows Server 2008 و SQL 2008R2

روي هر دو سرور يك بك آپ مشابه از بانك ها رو ريستور كرديم كه هيچ فرقي با هم نداشته باشند

طبيعتا روي سرور 2 كوئري ها با سرعت فوق العاده بيشتري نسبت به سرور شماره 1 اجرا مي شوند اما ...

يك كوئري كوچك و ساده كل معادلات رو زير سوال برده !

کد:
SELECT     TOP (1) E.dateemployee, E.married, E.SupportChild, E.name, E.family, E.no AS EmployeeNo, E.InsuranceNum, ea.BankNo, ea.BranchName, ea.PlaceNo,
                      ea.AccountNo, ea.IsDefult, EN.Name AS bankname, E.ITINo, ES.Year, ES.Month, E.SupportEtc AS Supportetc, ED.[Group], E.IsRetired AS isretired, ED.PostNo,
                          (SELECT     Value
                             FROM         [TOP].dbo.EntityContact
                             WHERE     (EntityNo = E.no) AND (ContactTypeNo = 9)) AS ContactValue, ED.No AS EmployeeDocNo, ES.No AS EmployeeSalaryNo, P.Name AS post,
                      E.haveinsure
FROM         [TOP].dbo.Employee AS E LEFT OUTER JOIN
                      EmpDoc AS ED ON ED.EmployeeNo = E.no LEFT OUTER JOIN
                      EmpAccount AS ea ON ea.EmployeeNo = E.no LEFT OUTER JOIN
                      [TOP].dbo.Entity AS EN ON ea.BankNo = EN.No LEFT OUTER JOIN
                      EmployeeSalary AS ES ON ES.EmployeeNo = E.no LEFT OUTER JOIN
                      [TOP].dbo.PublicRole AS P LEFT OUTER JOIN
                      [TOP].dbo.Entity AS Ent ON P.No = Ent.No ON P.No = ED.OrgPersonNo
WHERE     (E.no = 1001000000000001231) AND (ED.No IN
                          (SELECT     MAX(No) AS MNo
                             FROM         EmpDoc
                             WHERE     (DateBeginDoc <= '1391/07/15') AND (IsOk = 1)
                             GROUP BY EmployeeNo)) AND (ES.Year = '1391') AND (ES.Month = '07')
ORDER BY EmployeeDocNo DESC, ES.Year DESC, ES.Month DESC

كوئري بالا در سرور شماره 1 به سرعت و ظرف كمتر از 2 ثانيه اجرا مي شه اما در سرور شماره 2 به طرز غير قابل باوري 20 ثانيه طول مي كشه تا جواب رو ارئه بده.

هر دو سرور كوئري رو بدون خطا اجرا مي كنن و نتيجه هر دو يكسان هست ،‌ تفاوت تنها در سرعت اجراي اين دو كوئري است. بررسي كردم و مطمئن هستم سرور يك به هيچ عنوان نتيجه كوئري رو ايندكس نكرده.

بانك ها رو بارها ريستور كردم ، هر دو سرور تمام كوئري ها رو به درستي اجرا مي كنن و سرور شماره 2 هر كوئري غير از كوئري بالا رو با سرعت بسيار بالاتري نسبت به سرور 1 اجرا مي كنه اما در مورد اين كوئري خاص به طرز عجيبي كند عمل مي كنه!

حالا نظر شما چيه؟
من چیز خاصی ندیدم ولی تو قسمت زیر
کد:
SELECT     MAX(No) AS MNo
                             FROM         EmpDoc
                             WHERE     (DateBeginDoc <= '1391/07/15') AND (IsOk = 1)
                             GROUP BY EmployeeNo)
شما 1 مقدار برمیگردونی چه نیازی به group by هست؟

و در قسمت اول
کد:
(SELECT     Value
                             FROM         [TOP].dbo.EntityContact
                             WHERE     (EntityNo = E.no) AND (ContactTypeNo = 9)) AS ContactValue, ED.No AS EmployeeDocNo, ES.No AS EmployeeSalaryNo, P.Name AS post,
فکر نکنم این بخش از کد نیاز باشه
AS ContactValue, ED.No AS EmployeeDocNo, ES.No AS EmployeeSalaryNo, P.Name AS post,
مبين جان ممنون از لطفت.

قسمت شماره 1 گروپ باي شده چون بايد به ازاري تك تك پرسنل يا همون EmployeeNo ها مقدار بر گردونه و صرفا داخل اين كوئري

براي يك نفر محدود شده،

در قسمت دوم هم متوجه منظورت نشدم مبين جان اين فيلدها برام ضروري هست كه نمايش بده چطور مي گي لازم نيستن؟

و البته در مورد كندي اجراي اين كوئري:

اگر در قسمت Select كوئري مقدار ED.No AS EmployeeDocNo رو حذف كنم يا اسم خروجيش رو به

مقدار ED.No AS EmployeeDocNo2 تغيير بدم مشكل بر طرف مي شه!!!

اين مشكل به طرز مرموزي مربوط به اين هست كه فيلدي با نام EmployeeDocNo داخل يكي از تيبل ها كه بهش جوين زديم

وجود داره و اگرچه در ليست سلكتمون قرار نداره اما ظاهرا الگوريتم هاي بهينه سازي كوئري در SQL2008 تو اين مورد دچار ضعف

هستند و داخل يك سري لوپ هاي وحشتناك مي شه كه اين مشكل به وجود مياد،

به نظرت به عنوان يك نقطه ضعف يا باگ سيستمي گزارشش بدم؟