标签: sql-server

使用带有覆盖列的唯一非聚集索引而不是主键的含义

我们有一个大表[MyTable]目前既有Primary Key一个Unique Non Clustered Index在同一列([KeyColumn])。UNC 索引还有额外的覆盖栏。

在同一列上同时拥有 PK 和唯一 NC 索引似乎是多余的,所以我考虑删除主键,而是使用唯一非聚集索引来实现引用完整性。

请注意,该表完全由另一列聚集在一起。

即所以我们有:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
Run Code Online (Sandbox Code Playgroud)

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO
Run Code Online (Sandbox Code Playgroud)

据我所知,不可能向主键添加覆盖列,所以我打算这样做:

  • 删除依赖的外键约束 MyTable.KeyColumn
  • MyTable.KeyColumn完全删除主键
  • 将外键重新添加到表中(即 RI 将通过 强制执行MyTable.KeyColumn

我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。

我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。

我的问题是:这种方法有缺陷吗?

编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。

为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。

sql-server-2008 sql-server

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

允许用户在他自己的架构内做任何事情,但不能创建或删除架构本身

我在 SQL Azure 中创建了一个架构,并向数据库角色授予了以下权限:

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW 
DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
Run Code Online (Sandbox Code Playgroud)

通过上面定义的权限myuser可以创建/删除自己的模式,所以为了克服这个问题我尝试了 ALTER ANY SCHEMA 权限。但此权限也拒绝用户创建/删除表。

需要什么权限才能允许用户在他自己的架构中做任何事情,但不能创建或删除架构本身?

schema sql-server permissions

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

在 MS SQL 数据库中记录大量相互关联的存储过程:什么工具或格式?

我希望这是一个比“阅读一本 1000 页的书”更短答案的问题,但是,如果这是真实情况,那么就用它来打击我。

我不是真正的 DBA,我是一名软件开发人员,我意识到我们需要 DBA,但我工作的商店的 DBA 为零。然而,我们的 MS SQL 数据库设计包括几个核心存储过程,是一个巨大的混乱。存储过程很慢,我们怀疑它们有错误,但我们甚至不知道它们应该如何工作,所以我们不知道如何修复它们。

作为开始,我决定我们将记录它应该如何工作,然后我们将开始单元测试,并构建一组单元测试来帮助证明存储过程确实可以工作。它们执行的逻辑是我们应用程序的关键部分,可以说,它是我们公司主要产品的“皇冠上的明珠”,它的工作方式完全没有记录。

我正在寻找专业 DBA 可能希望现有的特定技术文档,或者他们可能会自己编写(如果必须),以了解相互调用的巨大存储过程网络。

  1. 记录大型存储过程的常用格式是什么?每个输入参数的预期值的描述(即“前置条件”、“后置条件”,即布尔参数在打开或关闭时会发生什么变化等?)

  2. 人们通常如何记录它?仅 SQL 注释?特定于目的的外部工具?外部“文档”?除了 MS SQL Management Studio 之外,我们没有 SQL 工具,但我们想知道是否有一种工具可以更好地理解、记录和测试我们的环境。也许这是问我问题的更好方式;我需要什么工具来解决我们的烂摊子?

我们的目标是能够:

A. 使用我们生成的文档或我们添加到环境中的任何工具来帮助理解过程应该如何工作,然后我们可以继续为存储过程创建单元测试覆盖率。

B. 向客户端应用程序开发人员展示如何正确调用这些复杂的存储过程。

C. 单元测试我们的存储过程。

sql-server stored-procedures documentation sql-server-2008-r2

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

将 UPDATE 语句的 OUTPUT 定向到局部变量

我想这样做:

DECLARE @Id INT;

UPDATE Logins
SET    SomeField = 'some value'
OUTPUT @Id = Id
WHERE  EmailAddress = @EmailAddress -- this is a parameter of the sproc
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?我知道我可以声明一个本地表变量并将输出定向到那里,但如果可能的话我宁愿跳过它

sql-server-2008 sql-server sql-server-2012 update output-clause

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

大内存环境中的 SQL Server TempDB 行为

读完这个问题让我想起了我不久前的一个问题。

我们有一个具有 512GB RAM 的 SQL Server,主数据库是 450GB。我们在 TempDB 中看到了很多动作(好吧,我认为这是“相当多的动作”——可能不是!)。我安装了 RamDisk Plus Server 的演示版,创建了一个 50GB 的 ramdrive,将 TempDB 指向它,但并没有看到性能有任何改善。

写入 TempDB 是否总是导致对磁盘的实际物理写入,或者 TempDB 写入是否由 SQL Server 缓存以便像在 Windows 文件系统缓存中那样延迟写入?

在这种情况下,ramdisk 毫无意义吗?

我知道 SQL Server 6.5 支持 TempDB-In-Ram,但我看到它很久以前就停产了!

performance sql-server-2005 sql-server tempdb

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

SQL Server 快照复制是每次都完全复制数据还是发出增量?

我正在查看两台服务器之间的快照复制。这是我所拥有的:

  • 500GB 数据库
  • ~500MB 每晚 bcp 负载
  • ~50MB 每日交易量

我向公司中的其他 DBA 询问要使用哪种复制类型。有人告诉我使用快照复制。但是,据我了解和阅读,每天晚上加载后快照都会将数据库完全复制到分发服务器,然后完全覆盖其他服务器。

快照是在增量中工作还是每次都是完整的副本?

replication sql-server sql-server-2008-r2 snapshot

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

尝试在数据库 2 中获取逻辑页 (5:65424) 失败

SqlException在调用存储过程时得到以下信息:

尝试在数据库 2 中获取逻辑页 (5:65424) 失败。它属于分配单元 7349876362857938944 不属于 4899918190390149120。

System.Data.SqlClient.SqlException发生
Message="Attempt to fetch logical page (5:65424) in database 2 failed. 它属于分配单元 7349876362857938944 不属于 4899918190390149120。

Source=".​​Net SqlClient Data Provider"
ErrorCode=-2146232060
Class=21
LineNumber=257
Number=605
Procedure="ispDisplayCount"
Server="10.10.1.1"
State=3

这个异常是什么意思?以上问题有解决办法吗?

尽管上述错误中引用的数据库表示 tempdb,但引用消息 605 的类似错误可以使用以下答案进行修复。

消息 605,级别 21,状态 3,第 1 行
尝试获取数据库 7 中的逻辑页 (1:8687634) 失败。它属于分配单元 72057594364821504 不属于 72057594052476928。

sql-server-2008 sql-server corruption

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

SQL Server 备份失败。错误:3041,严重性:16,状态:1

首先,我对 stackexchange 很陌生,所以请耐心等待。

我正在运行 SQL Server 9.0.4060。

我的问题是:我的 SQL Server 备份在很多数据库上一直失败。

维护计划运行到不同的备份作业:

每天 20:30 进行 DIFF 备份,每周日 20:30 进行 FULL 备份。

对于无法完成备份的每个数据库,我收到这两个错误:

Date        06-11-2012 20:31:06
Log     SQL Server (Current - 07-11-2012 11:43:00)
Source      Backup
Message
BACKUP failed to complete the command BACKUP DATABASE (dbname) WITH DIFFERENTIAL. Check the backup application log for detailed messages.

Date        06-11-2012 20:31:06
Log     SQL Server (Current - 07-11-2012 11:43:00)
Source      Backup
Message
Error: 3041, Severity: 16, State: 1.
Run Code Online (Sandbox Code Playgroud)

额外的错误。

Date     06-11-2012 17:53:27 
Log      SQL Server …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server backup

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

我应该在截断/大插入后重建索引吗?

我有一个存储过程,在插入新数据(基于其他表中的数据、计算等)之前,它会截断一些包含大约 1.75M 行的表。

基本大纲很简​​单:

  • 截断表
  • 以每次大约 75,000 的“批次”插入 1.75M 行。

我想知道我是否应该在此过程中的任何时候明确重新构建索引?例如

  • 截断表
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西]
  • 插入 175 万行

也许

  • ALTER INDEX ALL ON xxx DISABLE
  • 截断表
  • 插入 175 万行
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西]

感谢任何帮助......不是 DBA - 非常了解 DB 的开发人员更准确!

performance index sql-server

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

sql server 数据库分片 - 如何处理公共数据/非分片数据

我们有一个非常大规模的企业级数据库。作为我们业务模型的一部分,所有 Web 用户每个月都会在同一时间访问我们的 Web 服务器,这反过来又会影响我们的 sql 框。流量非常大,并且随着公司规模的扩大,流量会继续增长。sql proc优化已经完成,硬件已经扩展到一个非常高的水平。

我们现在正在寻求对数据库进行分片,以确保我们能够处理公司的增长和未来的负载。

我们已经决定应该对哪些特定数据进行分片。它是我们数据库的一个子集,使用率很高。

但是,我的问题是关于常见/通用的非分片数据。像这样的数据示例可能是库存表,也可能是员工表、用户表等。

我看到两个选项来处理这个通用/通用数据:

1) 设计 1 - 将通用/通用数据放在外部数据库中。所有写入都将发生在这里。然后,此数据将被复制到每个分片,允许每个分片读取此数据并在 t-sql procs 中对这些数据进行内部连接。

2) 设计 2 - 为每个分片提供所有通用/通用数据的副本。让每个分片本地写入这些表,并利用 sql 合并复制在所有其他分片上更新/同步此数据。

对设计的担忧 #1

1) 事务性问题:例如,如果您必须在分片中写入或更新数据,然后在 1 个存储过程中写入/更新公共/通用表,您将无法再轻松地做到这一点。数据现在存在于单独的 sql 实例和数据库中。您可能需要使用 MS DTS 来查看是否可以将这些写入包装到事务中,因为它们位于单独的数据库中。性能是这里的一个问题,并且可能涉及写入分片和公共数据的过程的重写。

2) 参照完整性的丧失。无法实现跨数据库参照完整性。

3) 重新编码系统的大面积区域,使其知道将公共数据写入新的通用数据库但从分片读取公共数据。

4)。增加了数据库行程。像上面的#1 一样,当您遇到必须更新分片数据和公共数据的情况时,您将进行多次往返来完成此操作,因为数据现在位于不同的数据库中。这里有一些网络延迟,但我并不像上述 3 那样担心这个问题。

对设计的担忧 #2

在设计#2 中,每个分片都有自己的所有公共/通用数据的实例。这意味着连接到或更新公共数据的所有代码继续像今天一样工作/运行。开发团队几乎不需要重新编码/重写。然而,这种设计完全依赖于合并复制来保持所有分片之间的数据同步。数据库管理员技术精湛,非常担心合并复制可能无法处理这个问题,如果合并复制失败,从这个失败中恢复不是很好,可能会对我们产生非常负面的影响。

我很想知道是否有人选择了设计选项 #2。我也很想知道我是否忽略了我没有看到的第三个或第四个设计选项。

先感谢您。

sql-server

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