小编Zap*_*ica的帖子

datetime2(0) 与 datetime2(2)

根据文档datetime2 (Transact-SQL)

存储大小
小于 3 的精度为 6 个
字节。精度 3 和 4 为 7 个
字节。所有其他精度需要 8 个字节。

datetime2(0)datetime2(1)、的大小datetime2(2)使用相同的存储量(6 字节)。

我是否正确地说,我可能会datetime2(2)在没有任何额外尺寸成本的情况下使用并获得精度的好处?

请注意:

  • 该列用PK进行索引,形成复合聚集索引(用于表分区)
  • 我不在乎毫秒

datetime2(0)在 where 子句中使用或通过索引查找时,cpu 效率会更高吗?

这是一个庞大的表,因此最小的优化将产生很大的不同。

sql-server datetime2 sql-server-2016

17
推荐指数
1
解决办法
1万
查看次数

如何使我的查询使用可用索引

我有以下 SQL 时间序列表:

CREATE TABLE [dbo].[SensorData](
 [DateTimeUtc] [datetime2](2) NOT NULL,
 [SensorId] [int] NOT NULL,
 [Key] [varchar](20) NOT NULL,
 [Value] [decimal](19, 4) NULL,
CONSTRAINT [PK_SensorData] PRIMARY KEY CLUSTERED 
(
  [SensorId] ASC,
  [Key] ASC,
  [DateTimeUtc] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = 
ON, Data_Compression=PAGE) ON PS_Daily(DateTimeUtc))
Run Code Online (Sandbox Code Playgroud)

现在基于这个索引,每个单独的查询都需要在查询where过滤器中包含以下参数:

CREATE TABLE [dbo].[SensorData](
 [DateTimeUtc] [datetime2](2) NOT NULL,
 [SensorId] [int] NOT NULL,
 [Key] [varchar](20) NOT NULL,
 [Value] [decimal](19, 4) NULL,
CONSTRAINT [PK_SensorData] PRIMARY KEY CLUSTERED 
(
  [SensorId] ASC,
  [Key] ASC,
  [DateTimeUtc] ASC
)WITH …
Run Code Online (Sandbox Code Playgroud)

sql-server index-tuning time-series-database

9
推荐指数
2
解决办法
788
查看次数

SQL Server 2016 标准版是否支持表分区?

我想将我的 SQL Server 2008 企业版升级到 SQL Server 2016 标准版;然而,一个数据库在多个文件组上使用表分区(用于大型日志表,每天是一个分区)

我在SQL Server 2016 的版本和支持的功能中的“RDBMS 可扩展性和性能”一节中看到,它说标准版支持表和索引分区,但支持分区表并行

我不确定我是否完全理解这样做的后果。

就我而言,这究竟意味着什么,它将如何影响数据库的性能?

sql-server partitioning sql-server-2016

8
推荐指数
1
解决办法
2万
查看次数

优化建议的可疑重复索引

美好的一天,我有以下 sql server 数据库表: 在此处输入图片说明

请注意复合主键。这样做有 3 个原因:

  • 防止重复输入
  • 提高查询性能,因为所有查询都将具有所有 3 个键。
  • 我们需要和索引,我不想引入随机 ID。

另请注意,此表的设计考虑了其大小,此表将存储数百万行数据。

好的,现在我的实际问题。我正在使用 azure sql server 来托管这个数据库。我启用了自动调整。奇怪的是,我看到它然后创建了一个新索引。(见下文)

在此处输入图片说明

现在在我看来,这似乎是一个重复的索引,因为正在索引相同的列。

所以我的桌子上现在有两个索引:

原版(我的PK):

ALTER TABLE [dbo].[SensorDataRaw] ADD  CONSTRAINT [PK_SensorDataRaw] PRIMARY KEY CLUSTERED 
(
    [DateTime] ASC,
    [SensorId] ASC,
    [Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Run Code Online (Sandbox Code Playgroud)

新增(由天蓝色调校自动创建):

CREATE NONCLUSTERED INDEX [nci_wi_SensorDataRaw_DC9789077DA75B4440AC8BFE3E2AA198] ON [dbo].[SensorDataRaw]
(
    [Key] ASC,
    [SensorId] ASC,
    [DateTime] ASC
)
INCLUDE (   [Value]) WITH …
Run Code Online (Sandbox Code Playgroud)

index sql-server index-tuning azure-sql-database

6
推荐指数
1
解决办法
1049
查看次数

日期时间列与日期 + 时间列

我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。

我们使用的是 SQL-Server 2012 企业版。

我有一个关于将一Datetime列分成两列的问题,Date并且Time.

我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。

现在我仍然需要存储时间。因此,如果我将其存储为datetime,则在执行此查询时,sql 将不得不加载整个datetime字段,然后只查看一半的数据。

因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。

但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。

因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。

据我所知datetime,可以高度优化并且是比分解更好的解决方案。

sql-server t-sql sql-server-2012 datetime date

5
推荐指数
1
解决办法
4271
查看次数

每天动态表分区

我有一个 SQL Server 数据库,其中包含两个表 -AcksLogs.

这两个表在逻辑上是相关的,但不是关系数据库的方式。基本上,传入的每条消息都会保存在Log表中,如果我们的服务器确认了它,那么该确认就会存储在Ack表中。

我们每天存储大约 500 万个确认和 300 万个日志。我试图在每日边界上对这两个表进行分区,以便我们可以轻松地从表中删除旧分区,并提高查询性能。

我之前没有做过表分区,所以我一直在阅读一些在线教程,但是我被一件事困住了。我遵循的所有教程似乎都手动添加文件组并手动添加边界。

我希望 SQL Server 每天都以某种方式执行此操作,这就是我的问题所在。我需要它来为第二天创建新的文件组,例如每天 22:00。然后在 24:00 插入应该开始填满新的一天的分区。

谁能指出我如何实现这一目标的正确方向?综合教程或一些好的旧建议也可以。

我的第二个问题:我可以以某种方式将相同的分区函数应用于两个不同的表吗?

他们都有一个datetime(2)我想在其上分区的列,并且将应用相同的规则。

那如何适应我的文件组?我一天需要一个文件组吗?每个表在该文件组中都有一个文件,还是两个表都保存到文件组中的同一个文件中?

我是否必须为每个文件组创建一个.mdf.ldf?还是整个数据库还有一个日志文件?

sql-server filegroups partitioning

4
推荐指数
2
解决办法
2万
查看次数

实时部分表/列复制

我想知道是否有办法用 SQL Server 2012 企业版实现以下功能?

我有Table AServer 1说 10 列。

Table A:
| col1 | col2 | col3 | coln | col10 |
Run Code Online (Sandbox Code Playgroud)

Server 2,我需要的实时副本Table ATable BServer 2。但是我实际上只需要复制 3 列,因为这就是我使用的全部。

Table B:
| col1 | col3 | col10 |
Run Code Online (Sandbox Code Playgroud)

我在上面提到了“实时”,我的意思是当我插入一个新值或更新一个新值时,Table A该更改将尽快传播到Table B.

Table B是只读表。并将Table A数据写入其中。所以 A 将是发布者,B 将是订阅者。

我怎样才能实现这种设置?换句话说,我需要使用某种复制吗?或者我可以通过 Always ON High Availability 实现这一点。

replication sql-server sql-server-2012 transactional-replication

0
推荐指数
1
解决办法
1514
查看次数