การคอมไพล์บล็อกมากเกินไปใน sp_procedure_params_90_rowset


14

การฟื้นตัวของคำถามนี้ใน MSDN: ถูกบล็อก - กระบวนการรายงาน: แหล่งข้อมูลนี้รออะไร "OBJECT: 32767: 124607697: 0 [คอมไพล์]"

ฉันตรวจพบข้อความเหล่านี้ใน Profiler แล้ว พวกเขาทั้งหมดมีระยะเวลามากกว่า 3 วินาที มากกว่า 10 คนขึ้นไป กิจกรรมการปิดกั้นเป็นเช่นเดียวกับการเชื่อมโยงจากMSDN

การโทรทั้งหมดใช้การตั้งชื่อ 3 ส่วน ทั้งหมดระบุ proc ที่แตกต่างกันในรูปแบบที่มีลักษณะดังต่อไปนี้:

exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL
exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL
exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL
exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL

ฉันจะทำอย่างไรเพื่อลดระดับการบล็อกนี้

(แก้ไข) ตอนนี้ฉันเห็นสิ่งเดียวกันสำหรับ:

exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo'

มีบางอย่างเป็นระบบที่เกิดขึ้น แต่ฉันไม่รู้จะทำอย่างไร ผู้เรียกคือ VB6 ผ่าน ADO มันเป็น ADO การโทรเหล่านี้

ตัวอย่างรายงานกระบวนการที่ถูกบล็อกอยู่ด้านล่าง

 <blocked-process-report>
    <blocked-process>
        <process
            id="process5bc1288"
            taskpriority="0"
            logused="0"
            waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
            waittime="28887"
            ownerId="11638114050"
            transactionname="sqlsource_transform">
            <executionStack>
                <frame
                    line="1"
                    sqlhandle="0x000000000000000000000000000000000000000000000000">
                    <sqltext>EXEC [dbo].[spAlertDetectByPoll] ':V:^RMAlert^:Z:^&amp;N&amp;#RMAlert#&amp;S&amp;#L#&amp;UID&amp;#19#&amp;AGN&amp;#1#&amp;DFC&amp;#103#^', 1</sqltext>
                </frame>
            </executionStack>
            <inputbuf>
SET NO_BROWSETABLE OFF   </inputbuf>
        </process>
    </blocked-process>
    <blocking-process>
        <process
            status="suspended"
            waitresource="OBJECT: 32767:124607697:0 [COMPILE]"
            waittime="35693"
            spid="1121"
            sbid="0"
            ecid="0"
            priority="0"
            trancount="0"
            lastbatchstarted="2013-12-16T14:45:48.960">
            <executionStack>
                <frame
                    line="1"
                    sqlhandle="0x000000000000000000000000000000000000000000000000" />
            </executionStack>
            <inputbuf>
SET NO_BROWSETABLE OFF   </inputbuf>
        </process>
    </blocking-process>
</blocked-process-report>

คุณมี Service Pack และการปรับปรุงแบบสะสมล่าสุดติดตั้งสำหรับ SQL Server 2008 R2 หรือไม่
Max Vernon

SP2 CU4 Microsoft SQL Server 2008 R2 (SP2) - 10.50.4270.0 (X64)
dan holmes

เมื่อไม่เริ่มต้นนี้เกิดขึ้น? เมื่อเร็ว ๆ นี้คุณใช้ Service Pack หรือการปรับปรุงที่สะสมหรือไม่ ฉันยังสนับสนุน VB6 / ADO ด้วยและฉันจำได้ว่าการเห็นระบบ procs เหล่านี้เกิดขึ้นสองครั้ง แต่ฉันไม่คิดว่าจะมีปัญหาในการบล็อก ฉันคิดว่าพวกเขามาเพราะพวกเขาถูกเรียกบ่อยมาก ฉันสวดภาวนาสิ่งนี้ไม่เกี่ยวข้องกับ SP / CU เพราะเรายังอยู่ที่ 10.50.2500 และมันคงจะตายถ้าสิ่งเหล่านี้เริ่มใช้เวลา 3-10 วินาที
Jon Seigel

มันใส่หนึ่งของจำนวนมากใน pastbin pastebin.com/4wUgzby9 สิ่งนี้เกิดขึ้นประมาณ 2 หรือ 3 สัปดาห์ เราไม่ได้ใช้ CU ในระยะเวลานาน มันเกิดขึ้นในต้นปี 2012 เป็นครั้งแรกที่ลงวันที่โดยโพสต์ MSDN
dan holmes

1
นี่อาจเป็นเพียงอาการ ฉันมีการรอคอยอย่างสม่ำเสมอใน RESOURCE_SEMAPHORE_QUERY_COMPILE นี่คือการรักษาที่ดีที่สุดของ waittype นี้ฉันได้พบ: blogs.msdn.com/b/support_sql_france/archive/2012/02/07/…
dan holmes

คำตอบ:


2

มีการโพสต์บล็อกที่ยอดเยี่ยมเป็น http://blogs.msdn.com/b/support_sql_france/archive/2012/02/07/sql-server-compilation-gateways-and-resource-semaphore-query-compile.aspx ที่อธิบายถึงสิ่งที่ สิ่งที่เกิดขึ้น

SQL Server อนุญาตให้มีการรวบรวมจำนวนชุดตามความซับซ้อน มันจัดกลุ่มพวกเขาเป็นขนาดเล็กขนาดกลางและขนาดใหญ่ สำหรับการรวบรวมขนาดใหญ่สามารถรวบรวมได้ครั้งละหนึ่งรายการเท่านั้นดังนั้นสมมติว่า procs ของคุณทั้งหมดถือว่ามีขนาดใหญ่จากนั้นแต่ละรายการจะต้องรวบรวมอย่างต่อเนื่อง ที่อาจบัญชีสำหรับการปิดกั้น
ฉันคิดว่าอาจมีหลายวิธีในการแก้ปัญหา - พิจารณาทรัพยากรเพิ่มเติม (CPUs มากขึ้นจะช่วยให้การสืบค้นขนาดเล็กและขนาดกลางมากขึ้นพร้อมกันหรืออาจเพิ่มขีด จำกัด สำหรับสิ่งที่ถือว่าเป็นสื่อ) นอกจากนี้หน่วยความจำเพิ่มเติมอาจแก้ไขปัญหาได้

หากคุณชอบพวกเรามากที่สุดนั่นอาจเป็นไปไม่ได้ ตัวเลือกอื่นอาจเป็นการตรวจสอบการโทร ADO และดูว่าจำนวนการโทรสามารถลดหรือกระจายออกเพื่อไม่ให้การโทรทั้งหมดเกิดขึ้นในเวลาเดียวกัน การลดจำนวนในเวลาใดก็ตามควรลดเวลารอของคุณ

หากวิธีนี้ใช้ไม่ได้ให้ลองแก้ไข 'compilability' ของ procs ที่จัดเก็บไว้ อาจแบ่งพวกมันออกเป็นชิ้นเล็ก ๆ ซึ่งอาจย่อพวกมันเป็นถังขนาดเล็กหรือขนาดกลางและอนุญาตให้รวบรวมข้อมูลแบบขนานได้มากขึ้น หรือกำหนดสาเหตุที่ต้องมีการคอมไพล์ซ้ำในแต่ละครั้ง ดูว่าพวกเขาสามารถเขียนใหม่ได้หรือไม่โดยไม่จำเป็นต้องคอมไพล์ใหม่ ในที่สุดฉันจะพิจารณาใช้คำแนะนำการวางแผน สิ่งเหล่านี้จะช่วยให้ procs จะ precompiled และอาจประหยัดเวลา

หวังว่าจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.