แผนแบบสอบถามส่วนใหญ่สร้างขึ้นใหม่ใน 4 ชั่วโมงที่ผ่านมา


9

ฉันมีปัญหากับประสิทธิภาพของฐานข้อมูล SQL Server ของฉัน ฉันได้พบเครื่องมือนี้sp_BlitzCache หลังจากรันคำสั่งฉันได้รับข้อความนี้:

คุณมีแผนสร้าง 92.00% ใน 24 ชั่วโมงที่ผ่านมาและสร้างขึ้น 92.00% ใน 4 ชั่วโมงที่ผ่านมา

ขณะที่ฉันระบุปัญหา (โดยใช้ SQL Server Profiler ฉันได้ตรวจสอบเหตุการณ์ที่เกิดขึ้นของ StmtRecompile) ฉันสามารถค้นหาข้อความค้นหาแบบเต็มเพียงไม่กี่คำที่สร้างขึ้นมาใหม่บ่อยครั้ง อย่างไรก็ตามข้อความค้นหาแบบเต็มจะแสดงเพียง 5% ของคำค้นหาทั้งหมด

คุณมีข้อเสนอแนะอะไรบ้างที่อาจทำให้แผนพักผ่อนที่เหลืออยู่ 87% เป็นไปได้?

ฉันมี SQL Server 2012 (รุ่น 11.0.6567.0)

แก้ไข: ฉันเพิ่มเคาน์เตอร์วัดประสิทธิภาพแล้ว

+---------------------------+--------------------------------+--------------+
|        object_name        |          counter_name          |  cntr_value  |
+---------------------------+--------------------------------+--------------+
| SQLServer:Buffer Manager  | Background writer pages/sec    |            0 |
| SQLServer:Buffer Manager  | Buffer cache hit ratio         |        28436 |
| SQLServer:Buffer Manager  | Buffer cache hit ratio base    |        28436 |
| SQLServer:Buffer Manager  | Checkpoint pages/sec           |      8259452 |
| SQLServer:Buffer Manager  | Database pages                 |      4434337 |
| SQLServer:Buffer Manager  | Free list stalls/sec           |            9 |
| SQLServer:Buffer Manager  | Integral Controller Slope      |            0 |
| SQLServer:Buffer Manager  | Lazy writes/sec                |         5608 |
| SQLServer:Buffer Manager  | Page life expectancy           |       438901 |
| SQLServer:Buffer Manager  | Page lookups/sec               | 122694703703 |
| SQLServer:Buffer Manager  | Page reads/sec                 |     60994608 |
| SQLServer:Buffer Manager  | Page writes/sec                |    126076564 |
| SQLServer:Buffer Manager  | Readahead pages/sec            |     45305420 |
| SQLServer:Buffer Manager  | Target pages                   |    130990080 |
| SQLServer:Buffer Node     | Database pages                 |      4434337 |
| SQLServer:Buffer Node     | Page life expectancy           |       438901 |
| SQLServer:Buffer Node     | Local node page lookups/sec    |            0 |
| SQLServer:Buffer Node     | Remote node page lookups/sec   |            0 |
| SQLServer:Memory Manager  | External benefit of memory     |            0 |
| SQLServer:Memory Manager  | Connection Memory (KB)         |         3304 |
| SQLServer:Memory Manager  | Database Cache Memory (KB)     |     35474784 |
| SQLServer:Memory Manager  | Free Memory (KB)               |     13229808 |
| SQLServer:Memory Manager  | Granted Workspace Memory (KB)  |            0 |
| SQLServer:Memory Manager  | Lock Memory (KB)               |       455928 |
| SQLServer:Memory Manager  | Lock Blocks Allocated          |      1798154 |
| SQLServer:Memory Manager  | Lock Owner Blocks Allocated    |      3568588 |
| SQLServer:Memory Manager  | Lock Blocks                    |        10562 |
| SQLServer:Memory Manager  | Lock Owner Blocks              |        10617 |
| SQLServer:Memory Manager  | Maximum Workspace Memory (KB)  |     43368000 |
| SQLServer:Memory Manager  | Memory Grants Outstanding      |            0 |
| SQLServer:Memory Manager  | Memory Grants Pending          |            0 |
| SQLServer:Memory Manager  | Optimizer Memory (KB)          |         1400 |
| SQLServer:Memory Manager  | Reserved Server Memory (KB)    |            0 |
| SQLServer:Memory Manager  | SQL Cache Memory (KB)          |       229112 |
| SQLServer:Memory Manager  | Stolen Server Memory (KB)      |      8063232 |
| SQLServer:Memory Manager  | Log Pool Memory (KB)           |         4192 |
| SQLServer:Memory Manager  | Target Server Memory (KB)      |     56934400 |
| SQLServer:Memory Manager  | Total Server Memory (KB)       |     56767824 |
| SQLServer:Memory Node     | Database Node Memory (KB)      |     35474784 |
| SQLServer:Memory Node     | Free Node Memory (KB)          |     13229808 |
| SQLServer:Memory Node     | Foreign Node Memory (KB)       |            0 |
| SQLServer:Memory Node     | Stolen Node Memory (KB)        |      8063208 |
| SQLServer:Memory Node     | Target Node Memory (KB)        |     56934376 |
| SQLServer:Memory Node     | Total Node Memory (KB)         |     56767800 |
+---------------------------+--------------------------------+--------------+

อาจมีบางคนใช้ DBCC FREEPROCCACHE หรือ : P
Daniel Björk

@ DanielBjörkฉันเป็นคนเดียวที่ได้รับอนุญาตให้ทำสิ่งนี้ดังนั้นฉันไม่คิดว่ามันเป็นเหตุผล อย่างไรก็ตามฉันจะตรวจสอบมัน
Marcin Topolewski

คุณใช้คิวรีแบบ Parametrized หรือโพรซีเดอร์ที่เก็บไว้หรือไม่? หรือเป็นปัญหาที่คุณมีตัวอักษรสตริง / ตัวเลขใน SQL ของคุณและดังนั้นจึงไม่สามารถใช้แผนได้อีก
James Z

@JamesZ ใช่ฉันใช้ข้อความค้นหาแบบ parametrized จำนวนมาก เครื่องมือที่ฉันได้กล่าวถึงในโพสต์ของฉัน BlitzCache บอกว่าฉันมีปัญหากับพารามิเตอร์การดมกลิ่น
Marcin Topolewski

1
คุณกำลังสร้างดัชนีใหม่หรืออัพเดตสถิติทุกคืนหรือไม่ อาจมีแรงกดดันหน่วยความจำบนเซิร์ฟเวอร์หรือไม่
Erik Darling

คำตอบ:


6

แบบสอบถามที่ใช้ในการทดสอบเวลาสร้างแผนคือนี่

WITH x AS (
SELECT SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 24 THEN 1 ELSE 0 END) AS [plans_24],
       SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 4 THEN 1 ELSE 0 END) AS [plans_4],
       SUM(CASE WHEN DATEDIFF(HOUR, deqs.creation_time, SYSDATETIME()) <= 1 THEN 1 ELSE 0 END) AS [plans_1],
       COUNT(deqs.creation_time) AS [total_plans]
FROM sys.dm_exec_query_stats AS deqs
)
SELECT CONVERT(DECIMAL(3,2), NULLIF(x.plans_24, 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_24],
       CONVERT(DECIMAL(3,2), NULLIF(x.plans_4 , 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_4],
       CONVERT(DECIMAL(3,2), NULLIF(x.plans_1 , 0) / (1. * NULLIF(x.total_plans, 0))) * 100 AS [percent_1],
       @@SPID AS SPID
INTO #plan_creation
FROM x
OPTION (RECOMPILE) ;

SP ยังให้เบาะแสบางอย่างเกี่ยวกับสถานที่ที่จะเริ่มการวิจัยเพิ่มเติมของคุณ

หากเปอร์เซ็นต์เหล่านี้สูงอาจเป็นสัญญาณของความดันหน่วยความจำหรือความไม่แน่นอนของแคชแผน

นอกเหนือจากปมข้างต้นตรวจสอบว่าเซิร์ฟเวอร์ของคุณได้รับการรีสตาร์ท

หากเซิร์ฟเวอร์ของคุณไม่รีสตาร์ทด้านล่างเป็นแนวทางที่ฉันจะทำ

  • ตรวจสอบว่าความดันหน่วยความจำที่คุณเผชิญ

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

หน่วยความจำ:
บัฟเฟอร์บัฟเฟอร์ SQL MB ที่มีอยู่: บัฟเฟอร์บัฟเฟอร์ SQL หน้าฟรี
:
บัฟเฟอร์บัฟเฟอร์ SQL Life Life : Lazy Writes

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

คุณอาจเรียกใช้ คิวรีที่ทำให้เกิดการคอมไพล์ซ้ำ

  • การเปลี่ยนแปลงที่เกิดขึ้นกับตารางหรือมุมมองที่อ้างอิงโดยแบบสอบถาม (ALTER TABLE และ ALTER VIEW)

  • การเปลี่ยนแปลงที่ทำกับโพรซีเดอร์เดียวซึ่งจะดร็อปแผนทั้งหมดสำหรับโพรซีเดอร์นั้นจากแคช (ALTER PROCEDURE)

  • เปลี่ยนดัชนีใด ๆ ที่ใช้โดยแผนการดำเนินการ

  • อัพเดตเกี่ยวกับสถิติที่ใช้โดยแผนการดำเนินการซึ่งสร้างขึ้นอย่างชัดเจนจากคำสั่งเช่นสถิติการอัพเดทหรือสร้างขึ้นโดยอัตโนมัติ

  • วางดัชนีที่ใช้โดยแผนการดำเนินการ

คุณสามารถดูกระดาษสีขาวนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการแคชแผน

https://technet.microsoft.com/en-us/library/ee343986(v=sql.100).aspx


ฉันได้เพิ่มตัวนับประสิทธิภาพแล้วคุณช่วยฉันตีความค่านี้ได้ไหม
Marcin Topolewski

คุณสามารถดูเคาน์เตอร์ที่เกี่ยวข้องกับหน่วยความจำโดยละเอียดได้ที่นี่: blogs.msdn.microsoft.com/teekamg/2007/11/06/…
TheGameiswar

@TheGameiswar คุณพูดว่า "คุณอาจเรียกใช้แบบสอบถามที่ทำให้เกิดการคอมไพล์ใหม่ ... เช่นการเปลี่ยนแปลงดัชนีการอัปเดตสถิติ" ถ้าฉันทำดัชนีสร้างใหม่ / สร้างใหม่ตามสถิติการแยกส่วน + อัปเดตทุกคืนหมายความว่าแผนของฉันจะถูกสร้างขึ้นใหม่ทุกวันหรือไม่ เป็นปัญหาหรือไม่?
Danielle Paquette-Harvey

2

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

;with
    xmlnamespaces (N'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as DYN)
select
    db_name(st.dbid) as DBName
    , object_schema_name(st.objectid, st.dbid) as SchemaName
    , object_name(st.objectid, st.dbid) as ObjectName
    , ecp.objtype
    , st.text
    , qp.query_plan.value('(/DYN:ShowPlanXML/DYN:BatchSequence/DYN:Batch/DYN:Statements/DYN:StmtSimple/@RetrievedFromCache)[1]', 'varchar(100)') as RetrievedFromCache
    , qp.query_plan
into #temp
from sys.dm_exec_cached_plans ecp
    outer apply sys.dm_exec_query_plan(ecp.plan_handle) qp
    outer apply sys.dm_exec_sql_text(ecp.plan_handle) st

select
    *
from #temp t
where t.RetrievedFromCache is null
    and t.DBName is not null
order by t.DBName, t.SchemaName, t.ObjectName;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.