标签: sql-server

SQL Server 将表的 IDENTITY VALUE 物理存储在何处?

我希望有人可以为我指出正确的方向。到目前为止,这是我的工作。

SELECT * FROM sys.identity_columns是一个系统视图,它给出了“last_value”,但该视图的定义使用了一个内部函数IdentityProperty(colName, 'LastValue')- 所以这是一个死胡同(不是从那里的系统表中提取它)。

互联网上的任何地方(我看过)都建议使用DBCC IDENT_...命令来揭示价值,但这仍然让我对它的实际存储位置一无所知。

因此,我开始DBCC PAGE(TestDB,1,1325,3)根据我的测试工具数据库搜索各个页面,并使用该RESEED命令在值 10 和 12 之间重新设定种子。

在这一过程中,我注意到的十六进制值IAM: Header,IAM: Single Page Allocations并且IAM: Extent Alloc Status Slot 1一切都改变了。(并且意识到它们无论如何都会随着bUse1值定期更改,而bUse1值也会自行递增)。

所以另一个死胡同,我完全没有想法。我还能在哪里搜索?

我正在运行 SQL Server 2014。我对内部知识有着永不满足的渴望,但还没有遇到过像这样难以捉摸的东西。它引起了我的注意,因为从理论上讲,它(绝对值)存储在某处并且应该(可以说)是可定位的。在我寻找内部存储数据/元数据的位置的过程中,这个特殊的价值让我觉得特别难以捉摸。我猜/希望有人会过来告诉我,你可以得到它,DBCC PAGE但我找错了地方。

sql-server database-internals identity sql-server-2014

12
推荐指数
1
解决办法
1321
查看次数

使用 SQL Server FILESTREAM 时保持(部分)备份较小

我有一个包含近 1TBFILESTREAM数据的数据库,我不需要备份(如果数据被删除,它会在几个小时内自动重新创建,所以它并不重要)。大多数数据每隔几天就会更改一次,因此差异备份并不能真正帮助减小大小。

通过将恢复模式设置为Full,创建一个单独FILEGROUP的FILESTREAM,然后只备份“主要”,我让备份按照我需要的方式工作FILEGROUP。这导致的问题是日志文件(也被备份)现在不必要地大,因为它包含FILESTREAM数据。

SIMPLE恢复模式剥夺了我对特定FILEGROUPs进行备份的能力,所以我认为这也不是一种选择。

我的想法是将FILESTREAM数据移动到一个单独的数据库,但现在我正在失去参照完整性,并且肯定还会继承许多其他问题。

有没有办法在Simple恢复模式下创建部分备份(不将FILESTREAM表设置为只读)?如果没有,我的问题还有其他合理的解决方案吗?

sql-server backup transaction-log filestream sql-server-2014

12
推荐指数
1
解决办法
1230
查看次数

如何隐藏/禁用表而不删除它们以检查冗余?

我必须维护和扩展一个旧的遗留系统,其中包含不再使用的 web 服务方法和数据库表。由于我不完全确定这些表是否真的是多余的,因此我害怕删除它们。

有没有其他方法可以在不删除它们的情况下实现相同的效果(不能再使用表格)?我的想法是将它们Deleted从当前默认的dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;
Run Code Online (Sandbox Code Playgroud)

有没有其他选择或者模式方法有什么缺点?

database-design sql-server t-sql sql-server-2012

12
推荐指数
3
解决办法
3811
查看次数

为什么 .bak 文件大小随着 SQL Server 上的每个连续备份而增加/加倍?

我在 SQL Server 2012 Express 上运行一个简单的数据库。

就在今天,当我备份数据库时,.bak文件大小是几分钟前上一次备份的两倍。我今天做了几次备份(通过 SQL Server Management Studio -> 备份类型:完整),每一次备份,.bak文件都会加倍。

在 SQL Server Mgmt Studio 中,当我右键单击我的数据库 -> 'Reports' -> 'Backup and Restore events' -> 展开 'Successful Backup Operations':

这里的报告显示最新的备份大小记录为 55MB,但当我转到实际.bak文件时,它是 260MB。今天的每个其他备份也被记录为 55MB 大小,而它们对应的.bak文件大数倍(并且随着每次备份操作而增长)。

可能出什么问题了?自从这开始发生以来,我没有对数据库进行任何更改。

sql-server backup sql-server-2012

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

带有 SQL Server 的多个 PVSCSI

关于 SQL Server 虚拟化,一直试图寻找信息是否对将数据设备与日志设备分离到不同的准虚拟 SCSI (PVSCSI) 适配器有积极的性能影响,类似于这里所做的。

在客户端上有一个场景,其中添加了额外的 PVSCSI,并将日志设备分离到新的 PVSCSI,显示出可观的性能提升。然而,怀疑是由于这种分离还是仅仅因为现在存在额外的 PVSCSI。

众所周知,日志磁盘通常以顺序方式写入,而数据磁盘在其 r/w 中遵循更随机的模式,将这两种不同类型的文件放在不同的磁盘上具有性能优势。

但是控制器呢?将这些不同的模式保存在单独的 PVSCSI 控制器中是否也有好处?

任何人都对此有任何见解?

提前致谢

sql-server vmware virtualisation

12
推荐指数
1
解决办法
2059
查看次数

SQL Server 中统计的默认样本大小是多少?

从MSDN:

如果(SAMPLE, FULLSCAN, RESAMPLE)未指定任何示例选项,查询优化器默认对数据进行采样并计算样本大小。

如何确定统计的默认样本量?

我浏览了 MSDN,但没有找到任何公式或方法来确定默认样本大小。到处都只有公式来触发自动统计更新。任何指针都会有所帮助。

sql-server statistics

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

有没有办法只对 WHERE 子句中的变量进行一次空检查?

我对一个看起来像这样的大表有一个查询:

declare @myIdParam int = 1

select * 
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
Run Code Online (Sandbox Code Playgroud)

where子句中有几个类似这样的条件,也有很多连接,但这是一个总结。

实际上,如果@myIdParam 为空,我们不希望使用此参数限制结果。

我不是数据库专家,但从我的测试来看,似乎对每条记录都进行了 NULL 检查,并且没有以任何方式优化。

如果我删除空检查并假设参数不为空,则查询会立即返回。否则,最多需要十秒钟。

有没有办法优化它,以便在运行时只进行一次检查?

null sql-server

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

带有输出的 MERGE 是否比条件插入和选择更好的做法?

我们经常会遇到“如果不存在,则插入”的情况。Dan Guzman 的博客对如何使此进程线程安全进行了出色的调查。

我有一个基本表,它只是将字符串从SEQUENCE. 在存储过程中,我需要获取该值的整数键(如果它存在),或者INSERT它然后获取结果值。该dbo.NameLookup.ItemName列有一个唯一性约束,因此数据完整性没有风险,但我不想遇到异常。

这不是一个IDENTITY所以我无法获得,SCOPE_IDENTITY并且NULL在某些情况下价值可能是。

在我的情况下,我只需要处理INSERT桌面上的安全问题,所以我试图决定是否使用MERGE这样的方法更好:

SET NOCOUNT, XACT_ABORT ON;

DECLARE @vValueId INT 
DECLARE @inserted AS TABLE (Id INT NOT NULL)

MERGE 
    dbo.NameLookup WITH (HOLDLOCK) AS f 
USING 
    (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item
        ON f.ItemName= new_item.val
WHEN MATCHED THEN
    UPDATE SET @vValueId = f.Id
WHEN NOT MATCHED BY TARGET THEN
    INSERT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql merge sql-server-2014

12
推荐指数
2
解决办法
4890
查看次数

如何在统计中决定直方图步骤的数量

SQL Server 统计中的直方图步数是如何决定的?

为什么即使我的键列有超过 200 个不同的值,它也被限制为 200 个步骤?有什么决定因素吗?


演示

模式定义

CREATE TABLE histogram_step
  (
     id   INT IDENTITY(1, 1),
     name VARCHAR(50),
     CONSTRAINT pk_histogram_step PRIMARY KEY (id)
  )
Run Code Online (Sandbox Code Playgroud)

在我的表中插入 100 条记录

INSERT INTO histogram_step
            (name)
SELECT TOP 100 name
FROM   sys.syscolumns
Run Code Online (Sandbox Code Playgroud)

更新和检查统计信息

UPDATE STATISTICS histogram_step WITH fullscan

DBCC show_statistics('histogram_step', pk_histogram_step)
Run Code Online (Sandbox Code Playgroud)

直方图步骤:

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
|            1 |          0 |       1 |                   0 |              1 |
|            3 |          1 |       1 | …
Run Code Online (Sandbox Code Playgroud)

sql-server statistics

12
推荐指数
1
解决办法
2834
查看次数

在“CREATE UNIQUE INDEX”的“WHERE”子句中使用“LEN”函数

我有这张桌子:

CREATE TABLE Table01 (column01 nvarchar(100));
Run Code Online (Sandbox Code Playgroud)

我想用这个条件LEN(column01) >= 5在column01上创建一个唯一索引

我试过:

CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5;
Run Code Online (Sandbox Code Playgroud)

我有:

表 'Table01' 上过滤索引 'UIX_01' 的 WHERE 子句不正确。

和 :

ALTER TABLE Table01 ADD column01_length AS (LEN(column01));
CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5;
Run Code Online (Sandbox Code Playgroud)

产生:

无法在表 'Table01' 上创建过滤索引 'UIX_01',因为过滤器表达式中的列 'column01_length' 是计算列。重写过滤器表达式,使其不包含此列。

sql-server sql-server-2008-r2 filtered-index

12
推荐指数
2
解决办法
3055
查看次数