我有一个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)
我的简单方法
# 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")