标签: sql-server

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万
查看次数

不同进程中相同临时表上的锁导致的死锁

我发现了一个僵局,似乎表明了我认为不可能的事情。死锁涉及两个进程:

1. process8cf948 SPID 63

  • 对临时表 #PB_Cost_Excp_Process_Invoices_Work 执行 ALTER TABLE。

  • 拥有表 #PB_Cost_Excp_Process_Invoices_Work 的 IX 锁,对象 ID 为 455743580

2. process4cb3708 SPID 72

  • 在临时表 #PB_Cost_Excp_Process_Invoices_Work 上执行更新,它应该是它自己唯一的表副本。

  • 在#PB_Cost_Excp_Process_Invoices_Work 上拥有 Sch-M 锁,对象 ID 为 455743580

这应该是不可能的。我错过了什么吗?#Temporary 表真的在这两个 SPID 之间重用了吗?

这是在 SQL Server 2008 R2 Service Pack 2 和累积更新 1(版本 10.50.4260)上。

完整的未更改死锁跟踪如下。请注意这两个进程如何在具有相同表名的相同对象 ID 上运行 #PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519:

12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait
12/14/2012 13:46:03,spid23s,Unknown,waiter-list
12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M
12/14/2012 13:46:03,spid23s,Unknown,owner-list
12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580
12/14/2012 13:46:03,spid23s,Unknown,waiter id=process4cb3708 mode=Sch-M …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server deadlock

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

为什么我不能使用 CASE 语句来查看列是否存在而不是从中选择?

为什么这样的事情不起作用?

SELECT
CASE 
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Run Code Online (Sandbox Code Playgroud)

我只是检查该列是否存在,但是,SQL Server 抱怨Somecol不存在。在单个语句中是否有替代方法?

sql-server t-sql

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

更改sa密码

我正在尝试使用 SQL Server Management Studio 2012 更改 sa 帐户的密码。我已按照以下步骤操作,但密码仍然相同。

  1. 登录到 SQL Server Management Studio,选择数据库引擎、\SBSmonitoring、Windows 身份验证。
  2. 转到对象资源管理器--安全文件夹--登录文件夹。
  3. 右键单击 SA 帐户并选择“属性”选项。
  4. 在 General Page 中,更改 SA 密码并确认。
  5. 在状态页面中,将登录更改为已启用。单击确定以保存更改。
  6. 重新启动 SQL Server 及其所有服务。

任何的想法 ?

sql-server

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

将日期 yyyy-mm-dd 转换为整数 YYYYMM

我如何转换@dateb:

SET @dateb = dateadd(month, datediff(month, 0, getdate()) - 3, 0)
Run Code Online (Sandbox Code Playgroud)

2014-04-04作为日期返回到整数201404

谢谢

sql-server

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

为什么表变量强制索引扫描而临时表使用查找和书签查找?

我试图理解为什么使用表变量会阻止优化器使用索引查找然后书签查找与索引扫描。

填充表:

CREATE TABLE dbo.Test 
(
    RowKey INT NOT NULL PRIMARY KEY, 
    SecondColumn CHAR(1) NOT NULL DEFAULT 'x',
    ForeignKey INT NOT NULL 
) 

INSERT dbo.Test 
(
    RowKey, 
    ForeignKey
) 
SELECT TOP 1000000 
    ROW_NUMBER() OVER (ORDER BY (SELECT 0)),
    ABS(CHECKSUM(NEWID()) % 10)     
FROM sys.all_objects s1
CROSS JOIN sys.all_objects s2 

CREATE INDEX ix_Test_1 ON dbo.Test (ForeignKey) 
Run Code Online (Sandbox Code Playgroud)

使用单个记录填充表变量,并尝试通过搜索外键列来查找主键和第二列:

DECLARE @Keys TABLE (RowKey INT NOT NULL) 

INSERT @Keys (RowKey) VALUES (10)

SELECT 
    t.RowKey,
    t.SecondColumn
FROM
    dbo.Test t 
INNER JOIN 
    @Keys k
ON
    t.ForeignKey = …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization sql-server-2008-r2 user-defined-table-type bookmark-lookup

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

如何解决 SQL Server 2008 R2 安装过程中“指定的帐户已存在”错误

我最近在新的开发机器上安装 Visual Studio 2012 和 SQL Server 2008 R2 时遇到了问题。我的安装顺序是 Visual Studio 2012 然后安装 SQL Server 2008 R2。

SQL Server 安装过程中出现错误:

指定的帐户已存在。

我花了一天的时间试图解决这个问题。

sql-server sql-server-2008-r2 installation

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

更改数据库默认排序规则时 Latin1_General_BIN 性能影响

我已将数据库排序规则设置为Latin1_General_BIN, 以使字符串比较区分大小写。这会影响性能吗?对数据库中的 DML 或 DDL 操作有什么影响吗?数据库已存在,其中包含表。

performance sql-server collation sql-server-2008-r2 unicode performance-tuning

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