我们有一个大表[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.KeyColumnMyTable.KeyColumn完全删除主键MyTable.KeyColumn)我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。
我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。
我的问题是:这种方法有缺陷吗?
编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。
为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。
我在 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 权限。但此权限也拒绝用户创建/删除表。
需要什么权限才能允许用户在他自己的架构中做任何事情,但不能创建或删除架构本身?
我希望这是一个比“阅读一本 1000 页的书”更短答案的问题,但是,如果这是真实情况,那么就用它来打击我。
我不是真正的 DBA,我是一名软件开发人员,我意识到我们需要 DBA,但我工作的商店的 DBA 为零。然而,我们的 MS SQL 数据库设计包括几个核心存储过程,是一个巨大的混乱。存储过程很慢,我们怀疑它们有错误,但我们甚至不知道它们应该如何工作,所以我们不知道如何修复它们。
作为开始,我决定我们将记录它应该如何工作,然后我们将开始单元测试,并构建一组单元测试来帮助证明存储过程确实可以工作。它们执行的逻辑是我们应用程序的关键部分,可以说,它是我们公司主要产品的“皇冠上的明珠”,它的工作方式完全没有记录。
我正在寻找专业 DBA 可能希望现有的特定技术文档,或者他们可能会自己编写(如果必须),以了解相互调用的巨大存储过程网络。
记录大型存储过程的常用格式是什么?每个输入参数的预期值的描述(即“前置条件”、“后置条件”,即布尔参数在打开或关闭时会发生什么变化等?)
人们通常如何记录它?仅 SQL 注释?特定于目的的外部工具?外部“文档”?除了 MS SQL Management Studio 之外,我们没有 SQL 工具,但我们想知道是否有一种工具可以更好地理解、记录和测试我们的环境。也许这是问我问题的更好方式;我需要什么工具来解决我们的烂摊子?
我们的目标是能够:
A. 使用我们生成的文档或我们添加到环境中的任何工具来帮助理解过程应该如何工作,然后我们可以继续为存储过程创建单元测试覆盖率。
B. 向客户端应用程序开发人员展示如何正确调用这些复杂的存储过程。
C. 单元测试我们的存储过程。
sql-server stored-procedures documentation sql-server-2008-r2
我想这样做:
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
读完这个问题让我想起了我不久前的一个问题。
我们有一个具有 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,但我看到它很久以前就停产了!
我正在查看两台服务器之间的快照复制。这是我所拥有的:
我向公司中的其他 DBA 询问要使用哪种复制类型。有人告诉我使用快照复制。但是,据我了解和阅读,每天晚上加载后快照都会将数据库完全复制到分发服务器,然后完全覆盖其他服务器。
快照是在增量中工作还是每次都是完整的副本?
我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。
首先,我对 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) 我有一个存储过程,在插入新数据(基于其他表中的数据、计算等)之前,它会截断一些包含大约 1.75M 行的表。
基本大纲很简单:
我想知道我是否应该在此过程中的任何时候明确重新构建索引?例如
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西]也许
ALTER INDEX ALL ON xxx DISABLEALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西]感谢任何帮助......不是 DBA - 非常了解 DB 的开发人员更准确!
我们有一个非常大规模的企业级数据库。作为我们业务模型的一部分,所有 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 ×10
performance ×2
backup ×1
corruption ×1
index ×1
permissions ×1
replication ×1
schema ×1
snapshot ×1
tempdb ×1
update ×1