小编Aar*_*and的帖子

是否有理由手动更新统计信息?

在 SQL Server 中,统计信息会在Auto Update Statistics进入时自动更新True(这是默认设置)。是否有理由在什么情况下手动更新统计信息?

index sql-server maintenance statistics

19
推荐指数
3
解决办法
3874
查看次数

IDENTITY 列中出现意外空白

我正在尝试生成从 1 开始并以 1 递增的唯一采购订单编号。我使用此脚本创建了一个 PONumber 表:

CREATE TABLE [dbo].[PONumbers]
(
  [PONumberPK] [int] IDENTITY(1,1) NOT NULL,
  [NewPONo] [bit] NOT NULL,
  [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
  CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)    
);
Run Code Online (Sandbox Code Playgroud)

以及使用此脚本创建的存储过程:

CREATE PROCEDURE [dbo].[GetPONumber] 
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
    SELECT SCOPE_IDENTITY() AS PONumber;
END
Run Code Online (Sandbox Code Playgroud)

在创建时,这工作正常。当存储过程运行时,它从所需的数字开始并以 1 递增。

奇怪的是,如果我关闭或休眠我的计算机,那么下次运行该程序时,序列已提前了近 1000。

见下面的结果:

采购订单编号

你可以看到数字从 8 跃升到了 1002!

  • 为什么会这样?
  • 我如何确保不会像那样跳过数字?
  • 我所需要的只是让 SQL 生成以下数字:
    • a) 保证唯一。
    • b) 增加所需的数量。

我承认我不是 SQL 专家。我是否误解了 SCOPE_IDENTITY() 的作用?我应该使用不同的方法吗?我查看了 SQL 2012+ 中的序列,但微软表示默认情况下不能保证它们是唯一的。

sql-server identity sql-server-2012

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

Sql Server - 增加数据库文件的最佳实践

我一直在通过 sql server 2008 r2 中的数据收集器监视文件增长两周。数据库以大约 35(MB)/天的速度持续增长。数据库尚未达到 2 GB 的初始大小。

DB 文件自动增长设置为 5MB,我想尝试不同的方法,所以我正在寻找建议和/或评论。

每周周日晚上 1:30 有一项调整任务运行。该任务将:

  • 检查数据库完整性
  • 缩小日志文件 - (这没关系,因为日志模式很简单)
  • 收缩数据库
  • 重组索引
  • 重建索引
  • 更新统计
  • 清理历史

我想在每周调整计划中再添加两个步骤:

  1. 如果已用空间达到某个阈值或总大小,则将数据库文件增大 500 MB。
  2. 如果已用空间达到总大小的某个阈值,则将日志文件增加 250 MB(收缩后)。

通过将增长负担置于离线时间,我希望通过减少重负载期间自动增长事件的数量来提高性能。

我有两个关于自动增长文件的问题。

  • 放置文件增长步骤的最佳位置是在当前步骤之前还是之后?
  • 如果我使用ALTER DATABASE|MODIFY FILE来增长文件,那么我如何确定SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)

sql-server-2008 sql-server best-practices sql-server-2008-r2 transaction-log

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

限制对某些列的更新。只允许存储过程更新那些列

我有敏感的价格列,我只想通过存储过程进行更新。如果不使用旨在更新它的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都失败。

我正在考虑使用触发器和令牌表来实现这一点。我正在考虑的想法是有一个令牌表。存储过程必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查更新行的令牌表中是否存在该令牌。如果找到,它将继续。如果未找到令牌,则会抛出异常并使更新事务失败。

有没有好的/更好的方法来实现这个限制?

trigger sql-server stored-procedures t-sql sql-server-2012

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

在函数/存储过程创建时禁用模式检查

我正在尝试自动执行对 SQL Server 2008 R2 数据库执行更改的过程。我实施的流程删除并重新创建了我的存储过程和函数,以及运行脚本来更改表/列/数据。不幸的是,其中一个脚本需要首先放置其中一个函数。但是我不能先运行所有存储的过程/函数更改,因为它首先依赖于从表/列/数据更改脚本中添加的列。

我想知道是否可以在没有 SQL Server 验证函数/SP 定义中使用的列的情况下运行存储过程和函数?我尝试查找但找不到启用此功能的条件或命令。

sql-server stored-procedures sql-server-2008-r2 ddl functions

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

内存优化表 - 它们真的很难维护吗?

我正在研究从 MS SQL 2012 升级到 2014 的好处。SQL 2014 的一大卖点是内存优化表,这显然使查询速度超快。

我发现内存优化表有一些限制,例如:

  • 没有(max)大小的字段
  • 每行最大 ~1KB
  • timestamp字段
  • 没有计算列
  • 没有UNIQUE限制

这些都属于麻烦事,但如果我真的想解决这些问题以获得性能优势,我可以制定计划。

真正的问题是您无法运行ALTER TABLE语句,并且每次向索引列表添加字段时都必须经历这些繁琐INCLUDE的过程。此外,您似乎必须将用户拒之门外,才能对实时数据库上的 MO 表进行任何架构更改。

我觉得这简直太离谱了,以至于我实际上无法相信 Microsoft 会在此功能上投入如此多的开发资金,却让其维护起来如此不切实际。这使我得出结论,我一定是拿错了棍子的一端;我一定误解了内存优化表的某些内容,这让我相信维护它们比实际困难得多。

那么,我误解了什么?你用过MO表吗?是否有某种秘密开关或过程使它们易于使用和维护?

index sql-server alter-table sql-server-2014 memory-optimized-tables

18
推荐指数
2
解决办法
4402
查看次数

记录查询和其他 T-SQL

我想知道 SQL Server 2008 R2 是否有默认的SELECT语句日志记录方案(或任何其他与此相关的 T-SQL)。

如果是,我在哪里可以看到它?如果没有,我该如何设置?

sql-server sql-server-2008-r2

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

重置 IDENTITY 值

我有一个带有 IDENTITY 列的表。在开发时,我不时删除行并再次添加它们。但是 IDENTITY 值总是不断增加并且当我再次添加它们时并没有从 1 开始。现在我的 id 从 68 -> 92 开始,这会导致我的代码崩溃。

如何重置 IDENTITY 值?

sql-server auto-increment alter-table identity ddl

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

使用 WITH REPLACE 还原备份时出现错误 3154

我的计算机上安装了 SQL 2012 SP1。我做了一个数据库的备份test.bak

我有一个test2同名的数据库,但数据发生了变化。

我想test.bak通过test2数据库恢复。

我总是收到错误:

错误 3154:备份集包含现有数据库以外的数据库的备份。

我试过:

  1. 我右键单击 test2 -> Restore database -> From device

    我选择test.bak并检查了With Replace但我收到错误。

  2. 然后我尝试右键单击 test2 -> Restore file and filegroups

    我选择test.bak并检查了With Replace但我收到错误。

我可以删除旧数据库,然后使用正确的名称恢复备份,但是当我使用 SQL 2008 时,恢复现有数据库没有问题。

好像是因为我用的是SQL2012,所以经常出现这个错误!

sql-server backup restore sql-server-2012

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

SQL 代理如何以及何时更新 next_run_date/next_run_time 值?

我一直在研究 T-SQL 中的代码,以使用 msdb 数据库中的 sp_add_jobschedule proc 向 SQL 代理作业添加新计划。当我添加新计划(通常在特定日期/时间运行一次)并立即查看 sysjobschedules 和 sysschedules 中的值时,我可以看到新计划已添加并与我的 SQL 代理的 job_id 相关联工作。但是,next_run_date 和 next_run_time 的值在其中为 0。当我在 2 或 3 分钟后再次查看它们时,它们仍然显示为 0。但是,当我再过 5 或 10 分钟后再回来时,它现在可以正确显示与下一次计划运行相对应的日期和时间值。

所以我的问题是:

  • 这些值多久更新一次?
  • 更新这些值的过程是什么?
  • 如果我要添加一个计划,比如说,未来 1 分钟,这是否意味着该作业将不会运行,因为 next_run_date/time 尚未更新?

我用来添加新计划的代码示例:

exec msdb.dbo.sp_add_jobschedule @job_id = @jobID
                    , @name = @JobName
                    , @enabled = 1
                    , @freq_type = 1
                    , @freq_interval = 0
                    , @freq_subday_type = 0
                    , @freq_subday_interval = 0
                    , @freq_relative_interval = 0
                    , @freq_recurrence_factor = 0
                    , @active_start_date = …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server sql-server-agent

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