标签: sql-server

何时更新统计信息?

我继承了执行以下操作的维护计划:

  • 清理旧数据
  • 检查数据库完整性
  • 执行数据库和事务日志备份
  • 重组我们的索引
  • 更新统计
  • 删除旧备份和维护计划文件

在 23 分钟的维护计划中,更新统计数据需要惊人的 13 分钟。在这 13 分钟期间,对数据库的访问被阻止(或者至少,从这个数据库到我们其他数据库的复制被暂停)。

我的问题是:

我们应该什么时候更新统计数据,为什么?

这似乎是我们应该比每天少做的事情。我试图让我们摆脱“仅仅因为”进行不必要维护的心态。

performance sql-server maintenance statistics

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

SQL Server 中的数据混淆

SQL Server 中数据混淆的最佳实践是什么?

我们想在我们的 UAT 系统中使用屏蔽的生产数据。

如果我们想快速完成,并且混淆程度更高,应该采取什么方法?我正在考虑角色争夺人们的名字和姓氏,但如何?我应该自己创建一个函数还是有任何可用的预定义函数?我不想花时间重新发明轮子:)

日期字段怎么样?例如,是否应该从整个表中随机选择出生日期并分配给记录,或者有更好的方法吗?

sql-server sql-server-2008-r2

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

兼容级别 80 的实际行为是什么?

有人可以让我更好地了解兼容模式功能吗?它的行为与我预期的不同。

据我所知,兼容模式是关于不同版本的 SQL Server 之间某些语言结构的可用性和支持。

它不会影响数据库引擎版本的内部工作。它将尝试阻止使用早期版本中尚不可用的功能和构造。

我刚刚在 SQL Server 2008 R2 中创建了一个兼容级别为 80 的新数据库。创建了一个只有一个 int 列的表,并用几行填充它。

然后用一个row_number()函数执行一个 select 语句。

我的想法是,由于 row_number 函数是在 2005 年才引入的,这会在兼容 80 模式下引发错误。

但令我惊讶的是,这工作得很好。然后,当然,只有在您“保存某些内容”时才会评估兼容规则。所以我为我的 row_number 语句创建了一个存储过程。

存储过程的创建进行得很顺利,我可以完美地执行它并获得结果。

有人可以帮助我更好地了解兼容模式的工作吗?我的理解显然有问题。

sql-server sql-server-2008-r2 compatibility-level

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

过多的排序内存授予

为什么这个简单的查询被授予如此多的内存?

-- Demo table
CREATE TABLE dbo.Test
(
    TID integer IDENTITY NOT NULL,
    FilterMe integer NOT NULL,
    SortMe integer NOT NULL,
    Unused nvarchar(max) NULL,

    CONSTRAINT PK_dbo_Test_TID
    PRIMARY KEY CLUSTERED (TID)
);
GO
-- 100,000 example rows
INSERT dbo.Test WITH (TABLOCKX)
    (FilterMe, SortMe)
SELECT TOP (100 * 1000)
    CHECKSUM(NEWID()) % 1000,
    CHECKSUM(NEWID())
FROM sys.all_columns AS AC1
CROSS JOIN sys.all_columns AS AC2;
GO    
-- Query
SELECT
    T.TID,
    T.FilterMe,
    T.SortMe,
    T.Unused
FROM dbo.Test AS T 
WHERE 
    T.FilterMe = 567
ORDER BY 
    T.SortMe;
Run Code Online (Sandbox Code Playgroud)

对于估计 …

sql-server execution-plan memory-grant

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

我可以看到在 SQL Server 数据库上运行的历史查询吗?

有人在我们的 SQL Server 数据库上远程运行查询,他们的系统崩溃了。

他们没有该查询的备份,并希望查看服务器上运行的内容。

是否可以在日志或历史记录中找到此查询?

sql-server logs

46
推荐指数
4
解决办法
31万
查看次数

什么时候可以收缩数据库?

我知道收缩是魔鬼:它会颠倒页面顺序并导致皮肤癌、数据碎片化和全球变暖。名单还在继续……话虽如此,假设我有一个 100 GB 的数据库,我删除了 50 GB 的数据——不是在一个表上,而是在数据库范围内对旧数据进行一般修剪,覆盖 90% 的数据表——这是否构成缩小数据库的适当用例?

如果没有,从数据库中删除如此高比例的数据后,应采取哪些适当的步骤来清理房屋?我可以想到两个:重建索引和更新统计。还有什么?

sql-server maintenance shrink disk-space

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

如何授予单个存储过程的执行权限?

通常,当我创建存储过程时,我使用以下作为排序模板

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end
Run Code Online (Sandbox Code Playgroud)

有没有办法在我使用时仅授予对该存储过程的执行权限?
比如像...

Grant execute [User_Execute] 
Run Code Online (Sandbox Code Playgroud)

...但仅针对此存储过程?

我见过一些其他类似的问题,但它们似乎都涉及所有存储过程,而不仅仅是一个,我也没有看到可以在create procedure脚本中指定权限的问题。甚至有关如何在没有 GUI 的情况下为特定存储过程设置权限的答案也将受到欢迎。

编辑 最重要的答案肯定为我指明了正确的方向,这基本上就是我正在寻找的,我没有考虑将我最终做的命令批处理,将命令与我的存储过程一起批处理。反正我觉得还挺好看的。

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
Run Code Online (Sandbox Code Playgroud)

sql-server

46
推荐指数
3
解决办法
25万
查看次数

我可以添加一个忽略现有违规的唯一约束吗?

我有一个表,该表当前在一列中有重复的值。

我无法删除这些错误的重复项,但我想防止添加其他非唯一值。

我可以创建一个UNIQUE不检查现有合规性的吗?

我曾尝试使用NOCHECK但未成功。

在这种情况下,我有一个表格将许可信息与“公司名称”联系起来

编辑:具有相同“公司名称”的多行是错误数据,但我们目前无法删除或更新这些重复项。一种方法是让INSERTs 使用一个存储过程,该过程将因重复而失败......如果可以让 SQL 自行检查唯一性,那将是可取的。

此数据按公司名称查询。对于少数现有的重复项,这意味着返回并显示多行...虽然这是错误的,但在我们的用例中是可以接受的。目的是防止将来发生。从评论看来,我必须在存储过程中执行此逻辑。

database-design sql-server azure-sql-database

46
推荐指数
3
解决办法
5万
查看次数

可以在一台 SQL Server 上放置的数据库数量是否有限制?

我正在建立一个 SaaS 系统,我们计划在其中为每个客户提供自己的数据库。系统已经设置好,如果负载变得太大,我们可以轻松地扩展到其他服务器;我们希望拥有数千甚至数万名客户。

问题

  • 在一个 SQL Server 上可以/应该拥有的微数据库数量是否有任何实际限制?
  • 它会影响服务器的性能吗?
  • 是拥有 10,000 个 100 MB 的数据库还是一个 1 TB 的数据库更好?

附加信息

当我说“微数据库”时,我的意思并不是“微”;我的意思是我们的目标是成千上万的客户,所以每个单独的数据库只会占总数据存储量的千分之一或更少。实际上,每个数据库都在 100MB 左右,具体取决于它的使用量。

使用 10,000 个数据库的主要原因是为了可扩展性。事实上,系统的 V1 有一个数据库,当数据库在负载下紧张时,我们有一些不舒服的时刻。

它使 CPU、内存、I/O 变得紧张 - 以上所有。尽管我们解决了这些问题,但它们让我们意识到,在某些时候,即使使用世界上最好的索引,如果我们像我们希望的那样成功,我们根本无法将所有数据放在一个大喇叭中' 数据库。因此,对于 V2,我们进行了分片,因此我们可以在多个数据库服务器之间分配负载。

去年我一直在开发这个分片解决方案。每台服务器一个许可证,但无论如何,因为我们在 Azure 上使用虚拟机,所以已经解决了这个问题。现在出现这个问题的原因是,以前我们只向大型机构提供服务,并自己建立每个机构。我们的下一个业务是自助服务模式,任何拥有浏览器的人都可以注册并创建自己的数据库。他们的数据库将比大型机构小得多,数量也多得多。

我们尝试了Azure SQL 数据库弹性池。性能非常令人失望,因此我们切换回常规 VM。

sql-server scalability azure-vm

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

被要求不使用事务并使用一种解决方法来模拟一个

我已经开发 T-SQL 好几年了,并且一直在深入挖掘,继续尽我所能学习语言的各个方面。我最近开始在一家新公司工作,并收到了我认为关于交易的奇怪建议。永远不要使用它们。相反,使用模拟事务的解决方法。这是来自我们的 DBA,他在一个数据库中工作,有很多事务,随后有很多阻塞。我主要工作的数据库没有遇到这个问题,我看到过去曾使用过事务。

我知道阻塞是预期的交易,因为这样做是他们的本性,如果你可以不使用它而逃脱,一定要这样做。但是我有很多情况下每个语句都必须成功执行。如果一个失败,他们都必须失败。

我总是尽可能缩小我的事务范围,总是与 SET XACT_ABORT ON 结合使用,并且总是在 TRY/CATCH 内。

例子:

CREATE SCHEMA someschema;
GO


CREATE TABLE someschema.tableA
(id   INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
 ColA VARCHAR(10) NOT NULL
);
GO

CREATE TABLE someschema.tableB
(id   INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
 ColB VARCHAR(10) NOT NULL
); 
GO


CREATE PROCEDURE someschema.ProcedureName @ColA VARCHAR(10), 
                                          @ColB VARCHAR(10)
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN
BEGIN TRY
    BEGIN TRANSACTION;

    INSERT INTO someschema.tableA(ColA)
    VALUES(@ColA);

    INSERT INTO someschema.tableB(ColB)
    VALUES(@ColB);

--Implement error
    SELECT 1/0 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql transaction

45
推荐指数
5
解决办法
5888
查看次数