我继承了执行以下操作的维护计划:
在 23 分钟的维护计划中,更新统计数据需要惊人的 13 分钟。在这 13 分钟期间,对数据库的访问被阻止(或者至少,从这个数据库到我们其他数据库的复制被暂停)。
我的问题是:
我们应该什么时候更新统计数据,为什么?
这似乎是我们应该比每天少做的事情。我试图让我们摆脱“仅仅因为”进行不必要维护的心态。
SQL Server 中数据混淆的最佳实践是什么?
我们想在我们的 UAT 系统中使用屏蔽的生产数据。
如果我们想快速完成,并且混淆程度更高,应该采取什么方法?我正在考虑角色争夺人们的名字和姓氏,但如何?我应该自己创建一个函数还是有任何可用的预定义函数?我不想花时间重新发明轮子:)
日期字段怎么样?例如,是否应该从整个表中随机选择出生日期并分配给记录,或者有更好的方法吗?
有人可以让我更好地了解兼容模式功能吗?它的行为与我预期的不同。
据我所知,兼容模式是关于不同版本的 SQL Server 之间某些语言结构的可用性和支持。
它不会影响数据库引擎版本的内部工作。它将尝试阻止使用早期版本中尚不可用的功能和构造。
我刚刚在 SQL Server 2008 R2 中创建了一个兼容级别为 80 的新数据库。创建了一个只有一个 int 列的表,并用几行填充它。
然后用一个row_number()函数执行一个 select 语句。
我的想法是,由于 row_number 函数是在 2005 年才引入的,这会在兼容 80 模式下引发错误。
但令我惊讶的是,这工作得很好。然后,当然,只有在您“保存某些内容”时才会评估兼容规则。所以我为我的 row_number 语句创建了一个存储过程。
存储过程的创建进行得很顺利,我可以完美地执行它并获得结果。
有人可以帮助我更好地了解兼容模式的工作吗?我的理解显然有问题。
为什么这个简单的查询被授予如此多的内存?
-- 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 数据库上远程运行查询,他们的系统崩溃了。
他们没有该查询的备份,并希望查看服务器上运行的内容。
是否可以在日志或历史记录中找到此查询?
我知道收缩是魔鬼:它会颠倒页面顺序并导致皮肤癌、数据碎片化和全球变暖。名单还在继续……话虽如此,假设我有一个 100 GB 的数据库,我删除了 50 GB 的数据——不是在一个表上,而是在数据库范围内对旧数据进行一般修剪,覆盖 90% 的数据表——这是否构成缩小数据库的适当用例?
如果没有,从数据库中删除如此高比例的数据后,应采取哪些适当的步骤来清理房屋?我可以想到两个:重建索引和更新统计。还有什么?
通常,当我创建存储过程时,我使用以下作为排序模板
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) 我有一个表,该表当前在一列中有重复的值。
我无法删除这些错误的重复项,但我想防止添加其他非唯一值。
我可以创建一个UNIQUE不检查现有合规性的吗?
我曾尝试使用NOCHECK但未成功。
在这种情况下,我有一个表格将许可信息与“公司名称”联系起来
编辑:具有相同“公司名称”的多行是错误数据,但我们目前无法删除或更新这些重复项。一种方法是让INSERTs 使用一个存储过程,该过程将因重复而失败......如果可以让 SQL 自行检查唯一性,那将是可取的。
此数据按公司名称查询。对于少数现有的重复项,这意味着返回并显示多行...虽然这是错误的,但在我们的用例中是可以接受的。目的是防止将来发生。从评论看来,我必须在存储过程中执行此逻辑。
我正在建立一个 SaaS 系统,我们计划在其中为每个客户提供自己的数据库。系统已经设置好,如果负载变得太大,我们可以轻松地扩展到其他服务器;我们希望拥有数千甚至数万名客户。
当我说“微数据库”时,我的意思并不是“微”;我的意思是我们的目标是成千上万的客户,所以每个单独的数据库只会占总数据存储量的千分之一或更少。实际上,每个数据库都在 100MB 左右,具体取决于它的使用量。
使用 10,000 个数据库的主要原因是为了可扩展性。事实上,系统的 V1 有一个数据库,当数据库在负载下紧张时,我们有一些不舒服的时刻。
它使 CPU、内存、I/O 变得紧张 - 以上所有。尽管我们解决了这些问题,但它们让我们意识到,在某些时候,即使使用世界上最好的索引,如果我们像我们希望的那样成功,我们根本无法将所有数据放在一个大喇叭中' 数据库。因此,对于 V2,我们进行了分片,因此我们可以在多个数据库服务器之间分配负载。
去年我一直在开发这个分片解决方案。每台服务器一个许可证,但无论如何,因为我们在 Azure 上使用虚拟机,所以已经解决了这个问题。现在出现这个问题的原因是,以前我们只向大型机构提供服务,并自己建立每个机构。我们的下一个业务是自助服务模式,任何拥有浏览器的人都可以注册并创建自己的数据库。他们的数据库将比大型机构小得多,数量也多得多。
我们尝试了Azure SQL 数据库弹性池。性能非常令人失望,因此我们切换回常规 VM。
我已经开发 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 ×10
maintenance ×2
azure-vm ×1
disk-space ×1
logs ×1
memory-grant ×1
performance ×1
scalability ×1
shrink ×1
statistics ×1
t-sql ×1
transaction ×1