存储大小
小于 3 的精度为 6 个
字节。精度 3 和 4 为 7 个
字节。所有其他精度需要 8 个字节。
datetime2(0)
、datetime2(1)
、的大小datetime2(2)
使用相同的存储量(6 字节)。
我是否正确地说,我可能会datetime2(2)
在没有任何额外尺寸成本的情况下使用并获得精度的好处?
请注意:
datetime2(0)
在 where 子句中使用或通过索引查找时,cpu 效率会更高吗?
这是一个庞大的表,因此最小的优化将产生很大的不同。
我有以下 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 2008 企业版升级到 SQL Server 2016 标准版;然而,一个数据库在多个文件组上使用表分区(用于大型日志表,每天是一个分区)
我在SQL Server 2016 的版本和支持的功能中的“RDBMS 可扩展性和性能”一节中看到,它说标准版支持表和索引分区,但不支持分区表并行。
我不确定我是否完全理解这样做的后果。
就我而言,这究竟意味着什么,它将如何影响数据库的性能?
请注意复合主键。这样做有 3 个原因:
另请注意,此表的设计考虑了其大小,此表将存储数百万行数据。
好的,现在我的实际问题。我正在使用 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) 我正在为一个保存大量日志的系统设计一个表。我们正在查看每秒大约 200 个条目。
我们使用的是 SQL-Server 2012 企业版。
我有一个关于将一Datetime
列分成两列的问题,Date
并且Time
.
我在问题背后的想法。我会说一旦数据存储在数据库中,大多数搜索将基于每天,给我今天/1 月 10 日的所有结果。
现在我仍然需要存储时间。因此,如果我将其存储为datetime
,则在执行此查询时,sql 将不得不加载整个datetime
字段,然后只查看一半的数据。
因此,通过可能将日期存储在其自己的字段中,它可以只查看它需要的内容。
但另一方面,如果您确实在查询中指定了时间,则它现在必须检查两列的值。
因此,我希望 SQL Gurus 提供关于哪个选项对大型数据库的查询具有更好的性能的输入。
据我所知datetime
,可以高度优化并且是比分解更好的解决方案。
我有一个 SQL Server 数据库,其中包含两个表 -Acks
和Logs
.
这两个表在逻辑上是相关的,但不是关系数据库的方式。基本上,传入的每条消息都会保存在Log
表中,如果我们的服务器确认了它,那么该确认就会存储在Ack
表中。
我们每天存储大约 500 万个确认和 300 万个日志。我试图在每日边界上对这两个表进行分区,以便我们可以轻松地从表中删除旧分区,并提高查询性能。
我之前没有做过表分区,所以我一直在阅读一些在线教程,但是我被一件事困住了。我遵循的所有教程似乎都手动添加文件组并手动添加边界。
我希望 SQL Server 每天都以某种方式执行此操作,这就是我的问题所在。我需要它来为第二天创建新的文件组,例如每天 22:00。然后在 24:00 插入应该开始填满新的一天的分区。
谁能指出我如何实现这一目标的正确方向?综合教程或一些好的旧建议也可以。
我的第二个问题:我可以以某种方式将相同的分区函数应用于两个不同的表吗?
他们都有一个datetime(2)
我想在其上分区的列,并且将应用相同的规则。
那如何适应我的文件组?我一天需要一个文件组吗?每个表在该文件组中都有一个文件,还是两个表都保存到文件组中的同一个文件中?
我是否必须为每个文件组创建一个.mdf
和.ldf
?还是整个数据库还有一个日志文件?
我想知道是否有办法用 SQL Server 2012 企业版实现以下功能?
我有Table A
:Server 1
说 10 列。
Table A:
| col1 | col2 | col3 | coln | col10 |
Run Code Online (Sandbox Code Playgroud)
对Server 2
,我需要的实时副本Table A
中Table B
上Server 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
sql-server ×7
index-tuning ×2
partitioning ×2
date ×1
datetime ×1
datetime2 ×1
filegroups ×1
index ×1
replication ×1
t-sql ×1