我在工作中使用 MS SQL Server 2005 来构建数据库。有人告诉我,大多数表在构建后将在不久的将来保存 1,000,000 到 500,000,000 行数据......我没有使用过这么大的数据集。大多数时候,我什至不知道我应该考虑什么来找出设置模式、查询等方法的最佳答案。
所以......我需要知道某事的开始和结束日期以及在该时间范围内与 ID 相关联的值。所以......我们可以用两种不同的方式来整理表格:
create table xxx_test2 (id int identity(1,1), groupid int, dt datetime, i int)
create table xxx_test2 (id int identity(1,1), groupid int, start_dt datetime, end_dt datetime, i int)
哪个更好?如何更好地定义?我用大约 100,000 行数据填充了第一个表,根据查询设置第二个表的格式大约需要 10-12 秒...
select y.groupid,
y.dt as [start],
z.dt as [end],
(case when z.dt is null then 1 else 0 end) as latest,
y.i
from #x as y
outer apply (select top 1 *
from #x as x
where x.groupid = y.groupid and
x.dt > y.dt
order by x.dt asc) as z
Buuuuut ...与第二个表....要插入新行,我必须查看是否有前一行,如果有,则更新其结束日期。那么......在检索数据与插入/更新事物时,这是一个性能问题吗?将结束日期存储两次似乎很愚蠢,但也许......不是吗?我应该看什么?
这就是我用来生成我的假数据的东西......如果你出于某种原因想使用它(如果你将随机数的最大值更改为更高的值,它将更快地生成假数据):
declare @dt datetime
declare @i int
declare @id int
set @id = 1
declare @rowcount int
set @rowcount = 0
declare @numrows int
while (@rowcount<100000)
begin
set @i = 1
set @dt = getdate()
set @numrows = Cast(((5 + 1) - 1) *
Rand() + 1 As tinyint)
while @i<=@numrows
begin
insert into #x values (@id, dateadd(d,@i,@dt), @i)
set @i = @i + 1
end
set @rowcount = @rowcount + @numrows
set @id = @id + 1
print @rowcount
end