Neden aynı sorgunun UAT (3 sn'de çalışır) vs PROD (23 sn'de çalışır) çalıştırılmasında bu kadar büyük bir fark olacağını bilmek istiyorum.
Hem UAT hem de PROD, tam olarak veri ve dizinlere sahiptir.
SORGU:
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'TA:
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.
PROD üzerinde:
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'de, sorgunun eksik bir dizin önerdiğini ve test ettiğimde faydalı olduğunu, ancak tartışma konusu olmadığını unutmayın.
Sadece şunu anlamak istiyorum: UAT ÜZERİNE - neden sql sunucusu bir işçi tablosu yaratıyor ve PROD'da bunu yapmıyor? PROD üzerinde değil, UAT üzerinde bir masa biriktirme oluşturur. Ayrıca, yürütme zamanları UAT'e karşı PROD'ta neden bu kadar farklı?
Not :
Her iki sunucuda da sql server 2008 R2 RTM kullanıyorum (çok yakında en yeni SP ile çalışacağım).
UAT: Maksimum bellek 8GB. MaxDop, işlemci benzeşimi ve maksimum işçi iş parçacığı 0'dır.
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
PROD: maksimum bellek 60GB. MaxDop, işlemci benzeşimi ve maksimum işçi iş parçacığı 0'dır.
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
GÜNCELLEME :
UAT Yürütme Planı XML:
PROD Yürütme Planı XML:
UAT Yürütme Planı XML - PROD için oluşturulan Plan ile:
Sunucu Yapılandırması:
PROD: PowerEdge R720xd - Intel (R) Xeon (R) İşlemci E5-2637 v2 @ 3.50GHz.
UAT: PowerEdge 2950 - Intel (R) Xeon (R) İşlemci X5460 @ 3.16GHz
Answers.sqlperformance.com de gönderdim
GÜNCELLEME :
@Swasheck öneri için teşekkürler
PROD'deki maksimum belleği 60 GB'den 7680 MB'a değiştirerek, PROD'de aynı planı oluşturabiliyorum. Sorgu, UAT ile aynı anda tamamlanır.
Şimdi anlamam gerekiyor - NEDEN? Ayrıca, bu sayede eski sunucunun yerine bu canavar sunucuyu haklı çıkaramayacağım!