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 行,精度为毫秒 - 可以合理扩展到一天数据的方法将不胜感激,但欢迎任何解决方案!

4

1 回答 1

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")
于 2013-12-06T14:26:18.327 回答