小编Aar*_*and的帖子

每晚重组所有表的缺点

我考虑安排每晚重新组织所有表的 SQL Server 作业。我们没有企业,所以我们不能在线重建(这意味着我们需要重组)。我们也不想在碎片化和空间维护上投入太多时间,因此我们正在寻求一种可以快速实施且未来不需要进一步时间投入的解决方案。

对恢复的生产备份的测试表明,在减少碎片和重新获得空间方面,重组几乎与重建一样好。

这是一个合理的想法吗?该方案是否会导致可用性或可维护性问题?这是一个合理的长期解决方案吗?

index sql-server maintenance sql-server-2008-r2 fragmentation

5
推荐指数
1
解决办法
2660
查看次数

程序中的查询偶尔没有完成

我有一个关于如何在运行查询的 SQL Server 2008 R2(标准版)中调试非常奇怪的行为(嵌套查询卡住)的问题。

有时(不幸的是并非总是如此)当我运行一个复杂的过程来执行一些数据转换时,涉及:

-- Update of statistics.
EXEC sp_updatestats;

-- Run of another procedure with single complex query
-- procedure declared with recompile.
EXEC usp_query_procedure;
Run Code Online (Sandbox Code Playgroud)

我遇到了这个过程没有完成的问题(典型的时间 < 1 秒,当卡住时,运行时间可能是几天,还没有完成)。

如果我取出查询文本并单独运行它,它会在一秒钟内完成,但如果我在程序中运行它,它就会卡住。

当这些症状开始我没有任何WITH RECOMPILEsp_updatestats。我搜索了一下,发现可能会使用缓存的错误执行计划(对于某些输入参数),并且重新编译会有所帮助(前提是统计信息已更新)。虽然这两个选项似乎减轻了这个问题(它发生的频率较低),但它确实没有完全消失。为什么它在所有情况下都没有帮助?还有什么可能导致这个问题?

当该过程“卡住”并且我附加了一个 SQL Profiler 时,我可以看到每个刷新滴答声的数千个锁定 acuqires/释放。当查询正常运行时,只有一小部分已使用的锁,但这可能很明显。

同样非常奇怪的是,这种情况只发生在运行相同应用程序(标准版/企业版混合版)的四台服务器中的一台(标准版)上。

我该如何进一步调试?我应该登录探查器的哪些事件才能查看导致问题的原因?这里的其他人有没有发生过类似的事情?

请甚至暗示谷歌什么,寻找什么,追踪什么可以导致解决方案。如果我设法解决了这个问题,我一定会在这里发布我的发现以供后代使用。

sql-server profiler

5
推荐指数
1
解决办法
3178
查看次数

意外的唯一约束违反

鉴于以下 CREATE TABLE 语句:

CREATE TABLE [dbo].[Unit]
(
    [id]                SMALLINT       NOT NULL IDENTITY(1,1),
    [name]              VARCHAR(100)   NOT NULL,

    CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([id]),
    CONSTRAINT [UQ_Unit_Name] UNIQUE ([name])
)
Run Code Online (Sandbox Code Playgroud)

如何在不违反 UNIQUE 约束的情况下允许以下两个字符串共存?

INSERT INTO dbo.Unit (Name) VALUES('e³m³/day') 
INSERT INTO dbo.Unit (Name) VALUES('e3m3/day') 
Run Code Online (Sandbox Code Playgroud)

任何见解表示赞赏。

编辑

当前整理是 Latin1_General_CI_AS

编辑

除非有人有更好的选择,否则我似乎必须使用 Latin1_General_BIN 并在我需要的几个地方手动处理 CI……如果没有提供更好的解决方案,我会将其转换为答案。

sql-server constraint sql-server-2008-r2 string unique-constraint

5
推荐指数
1
解决办法
1066
查看次数

一张表用于两个数据库

我在db1和 中有一个通用的产品表db2。我想把它做成一张桌子,因为它有一个库存(产品库存)。在两个不同的数据库之间共享产品表的最佳解决方案是什么?我有几个想法:

  1. 在更新/删除/插入一个表时编写触发器并同时更新另一个表。
  2. 在产品表上创建视图并在第二个数据库中使用(我不知道如何)
  3. 复制(我不知道如何)

你能指导我走最好的路吗?

sql-server-2008-r2

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

复制不是复制

我正在尝试在两个 SQL Server 2008 R2 数据库之间设置事务复制,无论我尝试什么,它似乎都不起作用,而且我不知道去哪里寻找有关可能发生的事情的更多信息错误的。

我已经通过运行两台服务器上的向导创建了发布和订阅,并且一切似乎都已启动并正在运行 - 我在发布服务器上收到成功消息,表明它已创建发布并将文章添加到发布等。我也订阅订阅数据库成功订阅此发布。复制监视器显示一切正常 - 但即使我在发布数据库中手动添加/修改数据,发布和订阅的同步状态也始终显示为“没有可用的复制事务”。

我尝试从两台服务器中删除复制数据,从备份中删除和重新创建数据库,重新初始化订阅数据库等,但都没有任何乐趣。

任何有关在哪里寻找有关可能发生的事情的更多信息的建议将不胜感激。

replication sql-server sql-server-2008-r2

5
推荐指数
1
解决办法
9113
查看次数

将登录名转移到另一台服务器

我将数据库从 SQL Server 2005 移到 SQL Server 2012。有什么办法可以恢复新服务器上的所有登录信息?

sql-server-2005 sql-server sql-server-2012

5
推荐指数
1
解决办法
509
查看次数

由于外键不存在,复制失败

我一直在尝试让以前工作的复制开始工作。

我尝试了很多设置,但我似乎无法让它工作。

这是场景。我从目标数据库中删除了所有 FK 约束(称之为 DestDB)。

然后我重新初始化我的复制,当我运行时,我收到这个(去标识化)错误:

ALTER TABLE 语句与 FOREIGN KEY 约束“FK_TableOnlyInDestDB_MyReplicatedTable”冲突。冲突发生在数据库“DestDB”、表“SomeSchema.MyReplicatedTable”、“MyReplicatedTableId”列中。(来源:MSSQLServer,错误号:547)

它让我发疯,因为该数据库中不存在指示的 FK。

现在,我确实从另一个数据库复制了这个数据库(备份和恢复)。所以我唯一能想到的是它以某种方式穿越了溪流。

但这似乎不太可能。

任何想法都会很棒!

注意:这是我运行的查询,以确保我没有 FK(它没有返回任何行):

use DestDB

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
Run Code Online (Sandbox Code Playgroud)

我还检查以确保有问题的 FK 不在源表上(在我从中复制的数据库中)。

我也试过: EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

也试过 Dropping MyReplicatedTable。删除就好了,复制重新创建了它。(但仍然给了我错误。)

我尝试创建一个空数据库作为订阅者。效果很好,所以是 DestDB 中的某些东西导致了问题,但 ERROR 中的 FK 不存在。

replication foreign-key sql-server sql-server-2012

5
推荐指数
1
解决办法
5241
查看次数

我的日志文件很大,我该怎么办?

我的事务日志比我希望的要大,我想知道如何解决这个问题。

sql-server transaction-log

5
推荐指数
0
解决办法
333
查看次数

列出某个用户的所有数据库(SQL Server 2008 R2)

我真的在寻找这个答案有一段时间了。我敢打赌这里有一个帖子,但是,我真的找不到(即使在 google 上)。

我认为这是一项简单的任务。

我想列出特定用户的所有数据库。

有没有办法做到这一点?

它可以是视图或游标。我就是想不出什么。

permissions sql-server-2008-r2

5
推荐指数
1
解决办法
8068
查看次数

sys.dm_exec_procedure_stats DMV 内容与 BOL 矛盾

我做的长时间运行的存储过程的一些分析和所遇到的异常的东西,根据网上图书sys.dm_exec_procedure_stats应该只显示一个每缓存的存储过程的计划行,但是有存储过程一个用户出现两次在表中。

此存储过程的两个“版本”具有截然不同的执行时间/计数。

这仅仅是因为缓存和使用了不同的计划吗?如果是这样,我没有意识到 sql server 为同一个 object_id 缓存了多个计划,我认为这是一种一对一的交易?另外,如果是这种情况,它似乎与 DMV 的 BOLS 定义相矛盾?

继此,如果使用计划的两个版本,我怎么能知道在什么情况下使用什么样的计划?

其他人遇到过这个吗?

sql-server stored-procedures sql-server-2008-r2 dmv

5
推荐指数
1
解决办法
361
查看次数