RODBC posixct 日期字段使查询非常慢

Posted

技术标签:

【中文标题】RODBC posixct 日期字段使查询非常慢【英文标题】:RODBC posixct date field makes query very slow 【发布时间】:2017-09-18 17:25:22 【问题描述】:

我需要有关 RODBC sqlQuery 的帮助。我运行一个生成 11mill 行数据的 SQL 脚本。使用 RODBC 提取数据需要 78 秒,但不幸的是,当我包含日期/时间字段时,从 RODBC 提取数据需要 180 秒,而在 Management Studio 中只需 78 秒。我想知道为什么请和我能做些什么。

Sql server 上的日期/时间字段格式如下:YYYY-MM-DD HH:MM:SS.000

在运行此查询之前,我会确保执行Sys.setenv(TZ="UTC")

lossdata <- as.data.table(sqlQuery(dbhandle, qry)) 

qry 是一个字符串,dbhandle 是使用odbcDriverConnect 设置的。

当我从 R 中提取时,我得到了这种格式的日期/时间字段:YYYY-MM-DD HH:MM:SS (without .000)

我也尝试过 RJDBC,但需要同样的时间。使用 RJDBC 后,将日期/时间字段从字符转换为 posixct 也需要很长时间,所以这不是一个好的选择。不幸的是,我需要该字段位于 posixct 中,因为我在排序中使用它,如果它不是这种数据类型,则需要很长时间。

请帮忙。我不确定如何重现此示例。如果您需要任何其他信息,请告诉我。

SQL 查询

事件日期

select pp.EventDate as EVENTDATE, pp.EVENTID as EVENTID 
from 
    (select * from set.dbo.events where setid in (16,32)) pp 
     inner join 
        (select eventid from databasename.dbo.rdm_port where anls = 93) y 
     on pp.EventId = y.EVENTID

没有事件日期

select pp.EVENTID as EVENTID 
from 
   (select * from set.dbo.events where setid in (16,32)) pp 
    inner join 
       (select eventid from databasename.dbo.rdm_port where anls = 93) y 
    on pp.EventId = y.EVENTID

【问题讨论】:

请显示包含日期时间的查询和不包含如何运行计算的查询。 我已将脚本缩小以使其可读,如果您有任何问题,请告诉我。 也许 RODBC 正在使用函数 as.Date 将您的 DateTime 列从字符转换为日期,这非常慢。有关详细信息,请参阅***.com/a/12788992/6004997:“所以问题的症结(我认为)是 strptime 如此缓慢的原因,也许这可以在 R 中得到改进。或者直接或间接地避免使用 POSIXlt。” 嗨科里感谢您抽出宝贵时间回复。我用 as.is = TRUE 运行查询,它的运行速度提高了 2 倍...... 不幸的是,我需要保留数据/时间时间戳。我稍后用它来排序,如果格式不正确,结果会很慢。 【参考方案1】:
DATEDIFF(s,'1970-01-01 00:00:00',pp.EventDate) as EVENTDATE

而使用 RJDBC 可以解决这个特殊问题。

RODBC 比 RJDBC 花费更长的时间。一切都使用 RJDBC 存储为数字。

现在的日期是自 1970-01-01 以来的秒数,可以快速排序。如果需要,它可以转换为日期。

【讨论】:

以上是关于RODBC posixct 日期字段使查询非常慢的主要内容,如果未能解决你的问题,请参考以下文章

来自 RODBC 的 sqlSave 仅在 R 中保存日期的年份

通过 rodbc 写入 mysql 数据库的 posix 被截断

R RDB 使用 RODBC 连接查询日期

使用 rodbc 包从 R 查询 sql server。需要将日期/时间值作为 where 语句的一部分传递到 sqlQuery

rodbc 日期过滤器

R中从POSIXct到日期的日期转换