背景: 我們有一個SQL Server
後端和一個運行於glassfish
上的Java應用程序。 在glassfish中,它們使用連接池驗證功能。SQL Server - 查詢空表的性能差異
最初,他們指出sys.tables目錄中的連接池驗證器,但我們注意到性能問題。我們通過創建一個'empty'
表來解決它; dbo.ConnectionValidation (Valid BIT NOT NULL PRIMARY KEY)
。 Horray,問題大多解決了。
它需要長達13秒最近,我們JVA傢伙(使用AppDynamics
)已經趕上特殊情況下查詢此空表。
問題: 爲了證明數據庫不是問題,我設置了一個腳本來反覆查詢表格,並記錄時間。 99%的通話時間是0ms或不可測量的,但是每隔幾十萬次(一次幾十萬次),它會達到500-1500ms
。對我來說,這是一個永恆,無所事事!
我精的查詢還,實際上什麼也沒做,我記錄了timestamp
,然後立即記錄另一個,我仍然看到了峯值。也許問題在於時間函數?
查詢:
SET NOCOUNT ON
DECLARE
@TimestampUTC DATETIME,
@TimestampUTC2 DATETIME,
@Duration INT,
@Counter BIGINT = 1,
@DummyValue BIT
WHILE @Counter < 1000000000 --1 billion
BEGIN
SET @TimestampUTC = SYSUTCDATETIME()
SET @TimestampUTC2 = SYSUTCDATETIME()
--SELECT @DummyValue = Valid
--FROM dbo.ConnectionValidator
SET @Duration = DATEDIFF(ms, @TimeStampUTC, @TimestampUTC2)
IF @Duration > 10
PRINT CAST(@Duration AS VARCHAR) + 'ms. Execution#: ' + cast(@Counter AS VARCHAR)
SET @Counter += 1
END
您的系統上運行此,看看會發生什麼? 它突然間怎麼會這麼久!這裏發生了什麼? 這可以解釋java應用程序遇到的隨機尖峯嗎?
我原本以爲,但如何參與IO?在這個例子中,一切都在記憶中。沒有任何內容被讀取或寫入磁盤。 – Divv