2013-11-21 47 views
1

背景: 我們有一個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應用程序遇到的隨機尖峯嗎?

回答

0

這聽起來像你的數據庫有底層數據文件的IO問題。

嘗試運行一些由this MSDN blog列出的查詢,看看你在磁盤IO等待。

+0

我原本以爲,但如何參與IO?在這個例子中,一切都在記憶中。沒有任何內容被讀取或寫入磁盤。 – Divv