Azure SQL设计建议

at0kjp5o  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(167)

我有一个用例,我有一个每小时插入大约3000万行的作业。这是一种我们为某些数据源拍摄的快照,我们只对用于报告目的的最新快照感兴趣,因此一旦新快照数据到来,旧快照数据对我们来说就变得无用,因为报告将基于新快照行。我们有一个名为last_updated_timestamp的字段,它是一个用于确定最新数据的标志,因此一个作业中的所有行都将具有相同的时间戳,我们将max(last_updated_timestamp)用于我们的报告需求。
我们只需要将数据存储20天,并且所有99%的查询都将具有固定格式,因此我们的查询将如下所示:

select * from our_table where store_id = <>, dep_id = <> schedule_day <> and last_updated_timestamp = (max value which is present for that schedule_day for store_id and dep_id)

我的方法:

是创建clustered index on store_id, dep_id, schedule_day, last_updated_timestamp,所以我的查询将非常快。
对于删除旧快照我该怎么办?是否会导致索引碎片化?
schedule_day和last_updated_timestamp值始终递增。每个作业插入当前日期和未来3天的数据,不插入过去的数据。
有什么建议吗?

xdyibdwo

xdyibdwo1#

我的理解是在列store_id、dep_id、schedule_day和last_updated_timestamp上创建一个聚集索引是一个好方法。因为这将有助于在这些列上进行筛选。
对于删除旧快照数据,如您所述,数据将无法用于报告,并将根据新快照行进行删除。
我已经在我的尽头试过了。我已经创建了一个表Daily_table001.With下面的模式。

CREATE TABLE Daily_table001 (
    id INT ,
    data VARCHAR(255),
    last_updated_timestamp DATETIME,
    schedule_day DATE
);

表中有23条记录。具有schedule_day和last_updated_timestamp列。


为id,last_updated_timestamp创建了Clustred索引。选择列和分组依据。

为了删除旧快照,我在表中插入了2个新行,并使用以下查询删除旧记录。

Insert into Daily_table001 values
 (24, 'Data 1', '2023-05-30 12:00:00', '2023-05-30'),
    (25, 'Data 2', '2023-05-30 12:00:00', '2023-05-30')


现在使用删除查询,我们将删除旧快照,并插入具有新last_updated_timestamp和schedule_day(即30)的新记录。

DELETE FROM Daily_table001
WHERE last_updated_timestamp < (
    SELECT MAX(last_updated_timestamp)
    FROM Daily_table001
);

上面的查询将指定整个表中“last_updated_timestamp”值小于最大“last_updated_timestamp”值的行应该被删除。

由于上述删除查询将删除旧记录并插入新记录。
同时也避免了在SQL Server中执行DELETE语句时产生的索引碎片。可以指定填充因子

相关问题