2013-10-03 72 views
0

我有一個SQL查詢數據集,包含開始和結束時間戳以及運行的特定查詢。我想使用這些信息來顯示在任何給定時間執行的併發查詢的數量。從瞬時數據集中繪製瞬時時間總和

即與像這樣的數據集來說:

StartTime,StopTime,SQLStatement 
10/11/2012 08:17:18.060,10/11/2012 08:17:19.221,DELETE FROM foo WHERE bar = ?; 
10/11/2012 08:17:19.036,10/11/2012 08:17:19.911,SELECT * FROM users WHERE user_id = ?; 
10/11/2012 08:17:19.661,10/11/2012 08:17:19.810,SELECT * FROM users WHERE user_id = ?; 
... 

我想其中,水平軸表示時間,垂直軸代表運行的查詢的瞬時數目,以產生曲線圖。在上例中,有一個查詢在08:17:19.000運行,兩個查詢在08:17.19.100運行。

我最初的方法是迭代大約100萬個離散時間值,對具有跨越每個值的StartTime和StopTime的行進行計數。這是緩慢的,並不會特別好 - 並且看起來好像R會有更好的方式來做到這一點!

該數據的15分鐘樣本包含約170,000行,精確到毫秒 - 可合理縮放到一天數據量的方法將值得讚賞,但任何解決方案都是值得歡迎的!

+0

所以,你基本上希望在十分之一秒的時間點運行查詢的流行? –

+0

第一行將有助於計數12個這樣的間隔?第二行爲9個區間,最後一行爲2個區間?在談論擴展性好之前,你需要爲小案例定義正確的答案。 –

+0

對不起,我正在尋找毫秒間隔(雖然間隔,我敢肯定,對於一般的解決方案來說是不重要的)。 在上面的次要子集中,從08:17:18.060到08:17:19.035的所有點將是1,08:17:19.036到08:17:19.221將是2,08:17:19.222到08:17 :19.660將是1,08:17:19.661到08:17:19.810將是2,08:17:19.811到08:17:19.911將是1。 – Motoma

回答

0

我簡單的方法

# Millisecond precision for deltas 
options(digits.secs=3) 

# Load file 
log.file <- read.csv("data/raw.csv", header=T) 

log.file$StartTime <- as.POSIXct(log.file$StartTime , 
           format="%Y-%m-%d %H:%M:%OS") 
log.file$StopTime <- as.POSIXct(log.file$StopTime , 
           format="%Y-%m-%d %H:%M:%OS") 

range <- seq(min(log.file$StartTime), max(log.file$StopTime), by=1) 

getsum <- function(tstamp) { 
    ret <- nrow(subset(log.file, StartTime<=tstamp & StopTime>=tstamp)) 
    return(ret) 
} 

dset <- frame() 
dset$TIME <- range 
dset$COUNT <- lapply(range, getsum) 

plot(dset$TIME, dset$COUNT) 

更好的解決方案

雖然這並不完全符合我在前面中列出的標準(即沒有及時填補空白),它確實給了我一個接近我正在尋找的圖表。但是,如果有一個解決方案達到了我之前要求的兩點,我仍然對此感興趣。

# Millisecond precision for deltas 
options(digits.secs=3) 

# Load file 
log.file <- read.csv("data/raw.csv", header=T) 

log.file$StartTime <- as.POSIXct(log.file$StartTime , 
           format="%Y-%m-%d %H:%M:%OS") 
log.file$StopTime <- as.POSIXct(log.file$StopTime , 
           format="%Y-%m-%d %H:%M:%OS") 

# Create data frames for query start times and query stop times 
# and give them +1 and -1 values 
queries.start <- data.frame(Time=log.file$StartTime, Value=1) 
queries.stop <- data.frame(Time=log.file$StopTime, Value=-1) 

# Merge the two together and order by time 
queries.both <- rbind(queries.start, queries.stop) 
queries.both <- queries.both[with(queries.both, order(Time)), ] 

# Create a cumulative sum data frame, and plot the results 
queries.sum <- data.frame(Time=queries.both$Time, Queries=cumsum(queries.both$Value)) 
plot(queries.sum, type="l")