SQL Server 2012 ช้ากว่า 2008


15

ฉันย้ายเว็บไซต์ขนาดใหญ่และฐานข้อมูลจากเซิร์ฟเวอร์เก่า (Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2.5 GHz Quad Core / ดิสก์ SAS) ไปยังเซิร์ฟเวอร์รุ่นใหม่ที่ดีกว่ามาก (Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16 คอร์โปรเซสเซอร์ / ดิสก์ SSD)

ฉันแยกไฟล์ฐานข้อมูลบนเซิร์ฟเวอร์เก่าคัดลอกและแนบไฟล์บนเซิร์ฟเวอร์ใหม่ ทุกอย่างเป็นไปด้วยดี

หลังจากนั้นฉันเปลี่ยนเป็นระดับความเข้ากันได้เป็น 110 สถิติที่อัปเดตสร้างดัชนีใหม่

สำหรับความผิดหวังครั้งใหญ่ของฉันฉันสังเกตว่าการสืบค้น sql ส่วนใหญ่นั้นช้ากว่ามาก (ช้ากว่า 2-3-4 เท่า) ในเซิร์ฟเวอร์ SQL 2012 ใหม่กว่าบนเซิร์ฟเวอร์ SQL 2008 เก่า

ตัวอย่างเช่นบนตารางที่มีระเบียนประมาณ 700k บนเซิร์ฟเวอร์เก่าแบบสอบถามบนดัชนีใช้เวลาประมาณ 100ms บนเซิร์ฟเวอร์ใหม่แบบสอบถามเดียวกันใช้เวลาประมาณ 350 ms

เกิดขึ้นเหมือนกันสำหรับแบบสอบถามทั้งหมด

ฉันขอขอบคุณความช่วยเหลือที่นี่ แจ้งให้เราทราบว่าจะตรวจสอบ / ยืนยันอะไร เพราะฉันพบว่ามันยากมากที่จะเชื่อว่าบนเซิร์ฟเวอร์ที่ดีกว่าด้วย SQL Server รุ่นใหม่ประสิทธิภาพที่แย่ลง

รายละเอียดเพิ่มเติม:

หน่วยความจำถูกตั้งค่าไว้ที่ max

ฉันมีตารางและดัชนีนี้:

CREATE TABLE [dbo].[Answer_Details_23](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,
    [SurveyID] [int] NOT NULL,
    [CustomerID] [int] NOT NULL default 0,
    [SummaryID] [int] NOT NULL,
    [QuestionID] [int] NOT NULL,
    [RowID] [int] NOT NULL default 0,
    [OptionID] [int] NOT NULL default 0,
    [EnteredText] [ntext] NULL,
 CONSTRAINT [Answer_Details_23_PK] PRIMARY KEY NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDX_Answer_Details_23_SummaryID_QuestionID] ON [dbo].[Answer_Details_23]
(
    [SummaryID] ASC,
    [QuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

ฉันดำเนินการค้นหานี้:

set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;

OLD SERVER - เวลาดำเนินการ SQL Server: เวลา CPU = 419 ms, เวลาที่ผ่านไป = 695 มิลลิวินาที

เซิร์ฟเวอร์ใหม่ - เวลาดำเนินการของเซิร์ฟเวอร์ SQL: เวลา CPU = 1340 ms, เวลาที่ผ่านไป = 1636 มิลลิวินาที

แผนการดำเนินการอัปโหลดที่นี่: http://we.tl/ARbPuvf9t8

อัปเดตภายหลัง:

  • โปรเซสเซอร์ AMD 2.1GHz Opteron 16 ดูแย่กว่าโปรเซสเซอร์ Quad core ของ Intel 2.5GHz
  • การปรับปรุงที่ยอดเยี่ยมในการเปลี่ยนตัวเลือกการใช้พลังงาน windows จาก ballanced เป็น high
  • การปรับปรุงเพิ่มเติมเปลี่ยนแปลงระดับสูงสุดของความขนานเป็น 8 และขีด จำกัด ต้นทุนเป็น 4

ตอนนี้เวลาดำเนินการของ SQL Server: เวลา CPU = 550 ms, เวลาที่ผ่านไป = 828 ms

มันยังคงแย่กว่าเซิร์ฟเวอร์เก่า แต่ก็ไม่ได้แย่ขนาดนั้น หากคุณมีข้อเสนอแนะอื่น ๆ (นอกเหนือจากการเพิ่มประสิทธิภาพการค้นหาในท้องถิ่น) โปรดแสดงความคิดเห็น


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์ 9

คำตอบ:


8

ฉันมีปัญหาที่คล้ายกันกับ SQL Server เป็นไปได้ว่าเซิร์ฟเวอร์ของคุณไม่ได้รับการกำหนดค่าอย่างเหมาะสม Xeons รุ่นใหม่มาพร้อมกับ TurboBoost, HT และอื่น ๆ ที่สามารถส่งผลกระทบต่อประสิทธิภาพของเซิร์ฟเวอร์ได้อย่างมาก

ตัวอย่างเช่นเราประสบความสำเร็จด้วย; การกำหนดค่าความหน่วงแฝงต่ำสำหรับเซิร์ฟเวอร์ Dell

การตั้งค่าจะใช้ได้กับเซิร์ฟเวอร์ที่ไม่ใช่ของ Dell พวกเขาอาจมีชื่อต่างกัน

นอกจากนี้เรายังปรับปรุงประสิทธิภาพด้วยการตั้งค่าโปรไฟล์การจัดการพลังงาน windows ให้มีประสิทธิภาพสูงจากสมดุล ชิ้นสุดท้ายคือขอแนะนำให้จองหน่วยความจำสูงสุด 8GB สำหรับระบบปฏิบัติการบนเซิร์ฟเวอร์ x64 การติดตั้ง SQL เริ่มต้นจะใช้หน่วยความจำทั้งหมด คุณอาจต้องการลองจอง 4 / 8GB โดยการตั้งค่าการกำหนดค่าหน่วยความจำสูงสุดของ SQL Server เป็น 4 / 8GB น้อยกว่าหน่วยความจำทั้งหมด

คำแนะนำของฉันจะกลับไปใช้เซิร์ฟเวอร์เก่าถ้าเป็นไปได้ หากคุณไม่มีสคริปต์การถดถอย / การทำงานอัตโนมัติ / โหลดสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือการบันทึกกิจกรรมของระบบเป็นเวลา 1-4 ชั่วโมงในช่วงระยะเวลากิจกรรมที่สูง จากนั้นตั้งค่าเว็บเซิร์ฟเวอร์เช่นเดียวกับการผลิตและเครื่องไคลเอนต์เพื่อเรียกใช้สคริปต์ รันกิจกรรมเดียวกันกับเซิร์ฟเวอร์ใหม่ทำการเปลี่ยนแปลงการกำหนดค่าและรันกิจกรรมเดียวกันอีกครั้ง จริง ๆ แล้วคุณต้องการทำมากขึ้น แต่ไม่ปรากฏว่ามันจะเป็นไปได้และอยู่นอกขอบเขตของคำถามนี้


โหลดไม่สูงมากบนเซิร์ฟเวอร์ SQL Server มักจะอยู่ในหน่วยความจำ 20-35 GB เมื่อใดก็ตามที่เรามีหน่วยความจำว่างมากกว่า 16 GB หน่วยประมวลผลกลางยังไม่ผ่านการใช้งาน 10-15%
prog_sr08

2
การปรับปรุงที่ยิ่งใหญ่ที่สุดที่ทำได้โดยการตั้งค่าการจัดการพลังงานของ windows จากความสมดุลไปสู่การใช้พลังงานสูง ดังนั้นจึงดูเหมือนปัญหาหน่วยประมวลผล เวลาดำเนินการของ SQL Server: เวลา CPU = 892 ms, เวลาที่ผ่านไป = 874 ms
prog_sr08

8

แจ้งให้เราทราบว่าจะตรวจสอบ / ยืนยันอะไร

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

หลังจากอัพเดตแล้ว

แผนแตกต่างกันมาก แผนเก่ามีกระแสรวมต่ำในสแต็กซึ่งจริง ๆ แล้วมีการประเมินความสำคัญเชิงลบที่ไม่ดี (141k เทียบกับ 108k) และแฮชคณิตศาสตร์คาดการณ์ต่อไปอีกทางหนึ่ง (35k เทียบกับ 108k) แผนใหม่ไม่มีการรวมสตรีมและมีการประมาณการที่แม่นยำตลอดเส้นทางจนถึงด้านบน ของหลักสูตรนี้ไม่ได้อธิบายว่าทำไมแผนเก่า ๆ ได้ถูกดำเนินการได้เร็วขึ้น

การสแกนด้านล่างมีหมายเลขแถวที่แตกต่างกันเล็กน้อย (ไม่สำคัญ) แต่มีค่าใช้จ่ายที่แตกต่างกันค่อนข้างมาก: เก่าคือ 2.49884 (IO 2.28979 CPU 0.20905) เทียบกับใหม่ 1.59109 (IO 1.53868 CPU 0.0524084) อีกครั้งจะชี้ไปที่การดำเนินการที่ดีกว่า 2012 (การสร้างดัชนีอาจลดการกระจายตัวของข้อมูลหรือไม่)

สิ่งที่แตกต่างกันมากคือจำนวนเธรด: 32 ใหม่ (แต่ละแถวรับ ~ 23k แถว) เทียบกับ 8 กระทู้เก่า (แต่ละแถวมีขนาด ~ 95k แถว) ตารางค่อนข้างแคบ มันอาจเป็นไปได้ว่าจำนวนมากของหัวข้อที่เป็นจริงทำร้ายประสิทธิภาพเพราะมากบ่อยมากขึ้นinvalidations แคช ฉันจะพยายาม:

  1. กำจัด HyperThreading ในการกำหนดค่าเซิร์ฟเวอร์ใหม่ (ถ้ามี) และ / หรือ
  2. ลองใช้แบบสอบถามด้วย DOP 8

สังเกตเห็นความคิดเห็นของคุณ:

เพิ่มแผนการดำเนินการด้วย maxdop 8 Query จริง ๆ แล้วเร็วขึ้นด้วยวิธีนี้

มันอาจเป็นเพียงแค่ซีพียูเหยียบนิ้วเท้าแต่ละข้าง ด้วย SSD ในสถานที่ IO อาจจะไม่ติดอะไรเลยและตารางนั้นเล็กเกินไปที่จะรับประกันสแกนเนอร์ 32 เครื่อง การแลกเปลี่ยนแลกเปลี่ยนนั้นอาจทำให้ L1 / L2 ใช้ไม่ได้ตลอดเวลา


1
ทุกอย่างช้าลงมากในปี 2012 กว่าในปี 2008 ฉันไม่ได้พยายามเพิ่มประสิทธิภาพการค้นหาที่นี่ ฉันยินดีที่จะมีประสิทธิภาพเดียวกันอย่างน้อยกับฐานข้อมูลเดียวกันที่แน่นอนในเซิร์ฟเวอร์ใหม่นี้
prog_sr08

1
การรอและต่อคิวไม่ได้เกี่ยวกับการปรับให้เหมาะสมของคิว เป็นเรื่องเกี่ยวกับการระบุคอขวด
Remus Rusanu

ฉันดาวน์โหลดเอกสาร ดูน่าสนใจมาก ๆ ฉันอยู่ในตอนนี้ แต่ดูเหมือนว่าจะใช้เวลาสักครู่ คุณช่วยแนะนำสถานที่ที่จะมองหาก่อน?
prog_sr08

1
สถิติการรอคอย รีเซ็ตทั้งในปี 2008 และ 2012 เรียกใช้การโหลดเป็นเวลา 5-10 นาทีจากนั้นเปรียบเทียบความแตกต่างระหว่าง 2008 และ 2012
Remus Rusanu

ฉันกลัวว่าฉันไม่สามารถเปรียบเทียบสถิติระหว่าง 2 เซิร์ฟเวอร์ได้ในขณะนี้เนื่องจากเซิร์ฟเวอร์ใหม่โฮสต์เว็บไซต์สด / ฐานข้อมูล บนเซิร์ฟเวอร์เก่ายังคงฐานข้อมูลที่ไม่ได้โหลดอีกต่อไป
prog_sr08

3

สำหรับระบบมัลติคอร์ที่ทันสมัยที่สุดและโดยเฉพาะอย่างยิ่งระบบมัลติซีพียูสถาปัตยกรรมฮาร์ดแวร์นั้นมีหน่วยความจำบางส่วนอยู่ไกลจากคอร์ / โปรเซสเซอร์บางตัวและหน่วยความจำบางส่วนนั้นอยู่ใกล้คอร์ / โปรเซสเซอร์บางตัว สิ่งนี้เรียกว่าสถาปัตยกรรมหน่วยความจำนอกเครื่องแบบหรือ NUMA สำหรับระยะสั้น คุณต้องการให้การตั้งค่า MAXDOP ของคุณตรงกับจำนวนคอร์ต่อโหนด NUMA เพื่อลดจำนวนครั้งที่โหนด numa ที่กำหนดต้องออกไปนอกหน่วยความจำสำหรับข้อมูล

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

DECLARE @CPUs int;
DECLARE @NumaNodes int;
DECLARE @ServerRAMInMB int;

SET @ServerRAMinMB = (SELECT (i.physical_memory_kb / 1024) AS ServerMemory 
    FROM sys.dm_os_sys_info i);
SET @CPUs = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (SELECT MAX(c.memory_node_id) + 1 FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64);

SELECT @ServerRamInMB, @CPUs, @NumaNodes;

IF @CPUs > 4 /* this would be 4 cores, not 4 CPUs */
BEGIN
    DECLARE @MaxDOP int;
    SET @MaxDOP = @CPUs * 0.75;
    IF @MaxDOP > (@CPUs / @NumaNodes) SET @MaxDOP = (@CPUs / @NumaNodes);
    EXEC sp_configure 'max degree of parallelism', @MaxDOP;
    EXEC sp_configure 'cost threshold for parallelism', 4; 
END

ฉันรวม@ServerRamInMBพารามิเตอร์ที่นี่เนื่องจากฉันใช้เพื่อตั้งค่าMax Server MemoryและMin Server Memoryตัวเลือกการกำหนดค่าเป็นค่าที่เหมาะสมสำหรับเซิร์ฟเวอร์ที่กำหนด


1
ฉันมี 64 GB RAM, ตัวประมวลผลหลัก 32, 4 โหนด numa ฉันตั้งค่าระดับสูงสุดของความขนานเป็น 8 และขีด จำกัด ต้นทุนเป็น 4 ด้วยการตั้งค่านี้และตั้งค่าตัวเลือกพลังงานเป็นพลังงานสูงเวลาดำเนินการของ SQL Server: เวลา CPU = 550 ms, เวลาที่ผ่านไป = 828 มิลลิวินาที
prog_sr08

ดังนั้นมันจึงเป็นชัยชนะ ดีใจที่เห็นว่าเหมาะกับคุณ!
Max Vernon

0

คุณอยู่ในโหมดรุ่นและใบอนุญาตอะไร คุณอาจไม่ได้ใช้คอร์ทั้งหมด ดูหมายเหตุในหน้านี้ - http://msdn.microsoft.com/en-us/library/ms143760.aspx

"Enterprise Edition พร้อมสิทธิ์การใช้งานจากเซิร์ฟเวอร์ + สิทธิ์การใช้งานไคลเอนต์ (CAL) ถูก จำกัด ไว้ที่สูงสุด 20 คอร์ต่ออินสแตนซ์ของ SQL Server"


2
สิ่งนี้จะนำไปใช้เฉพาะถ้าเขามี CAL มาก่อนและปู่ยังมีเพียง 20 คอร์เท่านั้นประสิทธิภาพไม่ควรลดลงอย่างเห็นได้ชัดในระบบเดิม (ซึ่งมีเพียง 8)
Aaron Bertrand

ฉันมี Web Edition (จำกัด ให้น้อยกว่า 4 Sockets หรือ 16 คอร์) บนเซิร์ฟเวอร์เก่าฉันมีเพียง 8 คอร์อยู่แล้ว
prog_sr08

0

ฉันมีปัญหาแบบเดียวกับที่อธิบายไว้ในหน้านี้: การเปลี่ยนการตั้งค่าพลังงานจาก "สมดุล" เป็น "ประสิทธิภาพสูง" สร้างความแตกต่างอย่างมาก - มากกว่าเวลาตอบกลับสองเท่า ตอนนี้เรากำลังใช้ SSD อยู่ฉันไม่คิดว่าการใช้พลังงานเป็นปัญหาที่อาจเกิดขึ้น


-2

ฉันได้ผ่านปัญหานี้ไปอย่างน้อย 2 สัปดาห์โดยไม่มีการแก้ไขที่แข็งแกร่งแทนที่จะทำให้เกิดปัญหากับปัญหาอื่น

ในที่สุดความละเอียดดังนี้: -

  1. ฉันได้รีเซ็ตความเข้ากันได้ตั้งแต่ 010 ถึง 011

  2. รีเซ็ตความเข้ากันได้ของฐานข้อมูลหลักด้วย โดยค่าเริ่มต้น sql จะรักษาการตั้งค่าความเข้ากันได้เก่า ว่าเราต้องเปลี่ยนด้วยตนเอง

ทั้งหมดที่ดีที่สุด

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