ฉันต้องการที่จะเข้าใจว่าทำไมมันถึงมีความแตกต่างอย่างมากในการดำเนินการกับเคียวรีเดียวกันบน UAT (ทำงานใน 3 วินาที) เทียบกับ PROD (ทำงานใน 23 วินาที)
ทั้ง UAT และ PROD มีข้อมูลและดัชนีอย่างแน่นอน
ค้นหา:
set statistics io on;
set statistics time on;
SELECT CONF_NO,
'DE',
'Duplicate Email Address ''' + RTRIM(EMAIL_ADDRESS) + ''' in Maintenance',
CONF_TARGET_NO
FROM CONF_TARGET ct
WHERE CONF_NO = 161
AND LEFT(INTERNET_USER_ID, 6) != 'ICONF-'
AND ( ( REGISTRATION_TYPE = 'I'
AND (SELECT COUNT(1)
FROM PORTFOLIO
WHERE EMAIL_ADDRESS = ct.EMAIL_ADDRESS
AND DEACTIVATED_YN = 'N') > 1 )
OR ( REGISTRATION_TYPE = 'K'
AND (SELECT COUNT(1)
FROM CAPITAL_MARKET
WHERE EMAIL_ADDRESS = ct.EMAIL_ADDRESS
AND DEACTIVATED_YN = 'N') > 1 ) )
บน UAT:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 11 ms, elapsed time = 11 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(3 row(s) affected)
Table 'Worktable'. Scan count 256, logical reads 1304616, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PORTFOLIO'. Scan count 1, logical reads 84761, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'CAPITAL_MARKET'. Scan count 256, logical reads 9472, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'CONF_TARGET'. Scan count 1, logical reads 100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 2418 ms, elapsed time = 2442 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
บนแยง:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(3 row(s) affected)
Table 'PORTFOLIO'. Scan count 256, logical reads 21698816, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'CAPITAL_MARKET'. Scan count 256, logical reads 9472, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'CONF_TARGET'. Scan count 1, logical reads 100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 23937 ms, elapsed time = 23935 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
โปรดทราบว่าใน PROD ข้อความค้นหาจะแนะนำดัชนีที่หายไปและเป็นประโยชน์อย่างที่ฉันได้ทดสอบ แต่นั่นไม่ใช่ประเด็นของการสนทนา
ฉันแค่อยากเข้าใจว่า: ON UAT - ทำไมเซิร์ฟเวอร์ sql สร้างตารางผู้ปฏิบัติงานและใน PROD มันไม่ได้? มันสร้างสปูลโต๊ะบน UAT และไม่ได้อยู่ใน PROD นอกจากนี้ทำไมเวลาการดำเนินการจึงแตกต่างกันสำหรับ UAT และ PROD
บันทึก :
ฉันกำลังเรียกใช้ sql server 2008 R2 RTM บนเซิร์ฟเวอร์ทั้งสอง (ค่อนข้างเร็วจะไปแก้ไขด้วย SP ล่าสุด)
เอือด: หน่วยความจำสูงสุด 8GB MaxDop ความเกี่ยวข้องของตัวประมวลผลและเธรดตัวทำงานสูงสุดคือ 0
Logical to Physical Processor Map:
*------- Physical Processor 0
-*------ Physical Processor 1
--*----- Physical Processor 2
---*---- Physical Processor 3
----*--- Physical Processor 4
-----*-- Physical Processor 5
------*- Physical Processor 6
-------* Physical Processor 7
Logical Processor to Socket Map:
****---- Socket 0
----**** Socket 1
Logical Processor to NUMA Node Map:
******** NUMA Node 0
แยง: หน่วยความจำสูงสุด 60GB MaxDop ความเกี่ยวข้องของตัวประมวลผลและเธรดตัวทำงานสูงสุดคือ 0
Logical to Physical Processor Map:
**-------------- Physical Processor 0 (Hyperthreaded)
--**------------ Physical Processor 1 (Hyperthreaded)
----**---------- Physical Processor 2 (Hyperthreaded)
------**-------- Physical Processor 3 (Hyperthreaded)
--------**------ Physical Processor 4 (Hyperthreaded)
----------**---- Physical Processor 5 (Hyperthreaded)
------------**-- Physical Processor 6 (Hyperthreaded)
--------------** Physical Processor 7 (Hyperthreaded)
Logical Processor to Socket Map:
********-------- Socket 0
--------******** Socket 1
Logical Processor to NUMA Node Map:
********-------- NUMA Node 0
--------******** NUMA Node 1
อัปเดต:
UAT Execution Plan XML:
PROD Execution Plan XML:
UAT Execution Plan XML - ด้วยการสร้างแผนจาก PROD:
การกำหนดค่าเซิร์ฟเวอร์:
แยง: PowerEdge R720xd - ซีพียู Intel (R) Xeon (R) E5-2637 v2 @ 3.50GHz
เอือด: PowerEdge 2950 - Intel (R) Xeon (R) CPU X5460 @ 3.16GHz
ฉันโพสต์แล้วที่answers.sqlperformance.com
อัปเดต:
ขอบคุณ @swasheck สำหรับคำแนะนำ
การเปลี่ยนหน่วยความจำสูงสุดใน PROD จาก 60GB เป็น 7680 MB ฉันสามารถสร้างแผนเดียวกันใน PROD ได้ แบบสอบถามเสร็จสมบูรณ์ในเวลาเดียวกับ UAT
ตอนนี้ฉันต้องเข้าใจ - ทำไมล่ะ ยิ่งไปกว่านั้นฉันจะไม่สามารถพิสูจน์เซิร์ฟเวอร์มอนสเตอร์นี้ให้เปลี่ยนเซิร์ฟเวอร์เก่าได้!