RODBC posixct 日期字段使查询非常慢
RODBC posixct date field makes query very slow
我需要 RODBC 方面的帮助 sqlQuery
。我 运行 一个 SQL 生成 11mill 行数据的脚本。使用 RODBC 提取数据需要 78 秒,但不幸的是,当我包含 date/time 字段时,从 RODBC 提取数据需要 180 秒,而在 Management Studio 中仅需 78 秒。我想知道为什么请以及我能做些什么。
date/time 字段在 Sql 服务器上的格式为:YYYY-MM-DD HH:MM:SS.000
在我 运行 这个查询之前,我确保我做了 Sys.setenv(TZ="UTC")
:
lossdata <- as.data.table(sqlQuery(dbhandle, qry))
qry 是一个字符串,dbhandle 是使用 odbcDriverConnect
设置的。
当我从 R 中提取时,我得到了这种格式的 date/time 字段:YYYY-MM-DD HH:MM:SS (without .000)
我也尝试过 RJDBC,但它需要相同的时间。使用 RJDBC 后,将 date/time 字段从字符转换为 posixct
也需要很长时间,因此这不是一个好的选择。不幸的是,我需要该字段在 posixct
中,因为我在排序中使用它,如果它不是这种数据类型,则需要很长时间。
请帮忙。我不确定如何重现这个例子。如果您需要任何其他信息,请告诉我。
SQL 查询
与 EventDate
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
没有 EventDate
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
DATEDIFF(s,'1970-01-01 00:00:00',pp.EventDate) as EVENTDATE
并且改用 RJDBC 解决了这个特殊问题。
RODBC 比 RJDBC 花费的时间更长。一切都使用 RJDBC 存储为数字。
日期现在是自 1970 年 1 月 1 日以来的秒数,可以快速排序。如果需要,它可以转换为日期。
我需要 RODBC 方面的帮助 sqlQuery
。我 运行 一个 SQL 生成 11mill 行数据的脚本。使用 RODBC 提取数据需要 78 秒,但不幸的是,当我包含 date/time 字段时,从 RODBC 提取数据需要 180 秒,而在 Management Studio 中仅需 78 秒。我想知道为什么请以及我能做些什么。
date/time 字段在 Sql 服务器上的格式为:YYYY-MM-DD HH:MM:SS.000
在我 运行 这个查询之前,我确保我做了 Sys.setenv(TZ="UTC")
:
lossdata <- as.data.table(sqlQuery(dbhandle, qry))
qry 是一个字符串,dbhandle 是使用 odbcDriverConnect
设置的。
当我从 R 中提取时,我得到了这种格式的 date/time 字段:YYYY-MM-DD HH:MM:SS (without .000)
我也尝试过 RJDBC,但它需要相同的时间。使用 RJDBC 后,将 date/time 字段从字符转换为 posixct
也需要很长时间,因此这不是一个好的选择。不幸的是,我需要该字段在 posixct
中,因为我在排序中使用它,如果它不是这种数据类型,则需要很长时间。
请帮忙。我不确定如何重现这个例子。如果您需要任何其他信息,请告诉我。
SQL 查询
与 EventDate
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
没有 EventDate
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
DATEDIFF(s,'1970-01-01 00:00:00',pp.EventDate) as EVENTDATE
并且改用 RJDBC 解决了这个特殊问题。
RODBC 比 RJDBC 花费的时间更长。一切都使用 RJDBC 存储为数字。
日期现在是自 1970 年 1 月 1 日以来的秒数,可以快速排序。如果需要,它可以转换为日期。