情况:开发人员工作站,通常只使用客户端工具连接到其他非本地 sql 服务器。但是,很少有使用完整版 sql server 进行本地开发的情况。为了不浪费一直运行 sql server 的系统资源,我想知道在仍然允许使用客户端工具(管理工作室等)的同时“关闭它”的最佳方法。
我正在考虑教育一个团队编写更好的 SQL Server 查询,并想知道人们对提高性能的最佳提示是什么。
例如,我曾经有一个 DBA,他坚持认为 count(*) 的性能会比 count(1) 差(我不知道她是否正确,或者它是否仍然适用于最新的查询优化器)。
我应该告诉团队尝试并始终使用或避免哪些简单的事情?理想情况下,我正在寻找 (a) 可能产生合理差异和 (b) 直截了当的事情,1 - 2 行说明。
我们有 3 个完全相同数据库的副本。所有 3 个数据库都有一个Users表,并且一个用户将始终存在于所有 3 个数据库中,并且具有完全相同的设置。任何时候我们想要添加或编辑用户,我们都必须更新 3 个数据库。
Users从数据库 2 和 3 中删除表并将其替换为Synonym指向数据库 1的表是否更好?
这是我能想到的优点/缺点:
优点
缺点
这是我正在考虑的一个选项,用于包含数据库之间相同设置的几个不同表,而不仅仅是Users表。我在示例中使用用户,因为它很容易理解。
我在存储过程中的插入有并发问题。该程序的相关部分是这样的:
select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
insert into table1 (othervalue) values (@_othervalue)
select @_id = Id from table1 where othervalue = @_othervalue
END
Run Code Online (Sandbox Code Playgroud)
当我们同时运行 3 个或 4 个这些存储过程时,我们有时会得到多个插入。
我打算像这样解决这个问题:
insert into table1 (othervalue)
select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK)
where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )
select @_id = Id from table1 where othervalue = @_othervalue
Run Code Online (Sandbox Code Playgroud)
问题是,如何在sql server中并发插入而不重复?我必须使用 TOP 只插入一次的事实让我感到不安。
我有一个开发环境,它正在快速部署到生产环境中,并且在日志中注意到大约每 20 秒我就会看到一条消息:
Starting up database 'dbname'
CHECKDB for database 'dbname' finished without errors
Run Code Online (Sandbox Code Playgroud)
我注意到这一点是因为正在测试它的最终用户有一个问题,我将其与我在 Windows 事件日志(应用程序日志)中注意到的错误隔离开来:
The log for database 'dbname' is not available. Check event log for related messages.
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我没有发现相关消息,但通过离线/在线循环解决了。
我唯一能想到的是,这个应用程序每 1 毫秒收集一次数据,但所有这些数据都没有插入到数据库中。作为一个开发服务器,它被配置为日志和数据在同一个驱动器上。考虑到这两条信息,我倾向于这是一个 IO 问题,并且服务器正试图从与存储 (SAN) 的连接丢失中恢复。然而,即使这对我来说也没有意义,因为它并没有丢失所有 dbs,只是丢失了这个。还有什么可能导致这种情况?
平台:Windows Server 2008 R2 (Std.) 上的 SQL Server 2008 R2 (Ent.)
我在表上有一个 UPDATE 触发器,用于监视从一个特定值更改为任何其他值的特定列。发生这种情况时,它会通过单个 UPDATE 语句更新另一个表中的一些相关数据。
触发器所做的第一件事是检查是否有任何更新的行的该列的值与相关值发生了变化。它只是将 INSERTED 连接到 DELETED 并比较该列中的值。如果没有任何条件,它会提前退出,因此 UPDATE 语句不会运行。
IF NOT EXISTS (
SELECT TOP 1 i.CUSTNMBR
FROM INSERTED i
INNER JOIN DELETED d
ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
AND i.CUSTCLAS != 'Misc'
)
RETURN
Run Code Online (Sandbox Code Playgroud)
在这种情况下,CUSTNMBR 是基础表的主键。如果我对此表进行大量更新(例如 5000 多行),即使我没有触及 CUSTCLAS 列,该语句也需要 AGES。我可以在 Profiler 中看到它在这个语句上停滞了几分钟。
执行计划很奇怪。它显示了具有 3,714 次执行和约 1,850 万行输出的插入扫描。它通过 CUSTCLAS 列上的过滤器运行。它将这个(通过嵌套循环)连接到一个删除扫描(也在 CUSTCLAS 上过滤),它只执行一次并且有 5000 个输出行。
我在这里做了什么愚蠢的事情来导致这种情况?请注意,触发器绝对必须正确处理多行更新。
编辑:
我也尝试过这样写(以防 EXISTS 做了一些不愉快的事情),但它仍然一样糟糕。
DECLARE @CUSTNMBR varchar(31)
SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR
FROM INSERTED i
INNER …Run Code Online (Sandbox Code Playgroud) 我面临的问题是 sql server 2008 因某些高负载而失败。我需要找到那个负载情况并需要优化代码以便它可以处理负载。我在 Internet 上发现 SQL 分析器可用于跟踪数据库交互,稍后可以对其进行分析以找到问题发生的确切点。我还发现了如何启动 sql 分析器。但现在我的问题是,通过启动 sql profiler 我会影响服务器性能吗?
我正在尝试从 SQL Server 实例导出一个简单的维护计划。
我想检查导出到源代码管理,并将导出的维护计划应用于功能相同的实例。
StackOverflow和SQL Server Newbie建议使用 Integration Services 导出维护计划。
当我尝试连接到导出目标上的集成服务时,我收到以下错误:
连接到计算机“WEBSERVER”上的集成服务服务失败并出现以下错误:指定的服务不作为已安装的服务存在。
我们选择在 WEBSERVER 上禁用集成服务,因为我们仅使用此框为消费者应用程序提供数据。WEBSERVER 上的所有数据都是从后端实例复制的。Integration Services 大量用于处理后端实例上的数据。
是否有不使用集成服务导出维护计划的文档化方法?微软支持吗?
我在表 X 中添加了一个新列
“cn”这一列必须是唯一的和强制性的,但旧数据没有任何价值。
如何使用顺序或随机唯一数据更新现有记录?
谢谢你。
我有一个执行MERGE语句的存储过程。
在执行合并时,它似乎默认锁定整个表。
我在一个事务中调用这个存储过程,我也在做一些其他的事情,我希望它只会锁定受影响的行。
我尝试了提示MERGE INTO myTable WITH (READPAST),它似乎锁定较少。但是ms doc中有一个警告说它可以插入重复的键,甚至绕过主键。
这是我的表架构:
CREATE TABLE StudentDetails
(
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(15)
)
GO
INSERT INTO StudentDetails
VALUES(1,'WANG')
INSERT INTO StudentDetails
VALUES(2,'JOHNSON')
GO
CREATE TABLE StudentTotalMarks
(
Id INT IDENTITY PRIMARY KEY,
StudentID INTEGER REFERENCES StudentDetails,
StudentMarks INTEGER
)
GO
INSERT INTO StudentTotalMarks
VALUES(1,230)
INSERT INTO StudentTotalMarks
VALUES(2,255)
GO
Run Code Online (Sandbox Code Playgroud)
这是我的存储过程:
CREATE PROCEDURE MergeTest
@StudentId int,
@Mark int
AS
WITH Params
AS
(
SELECT @StudentId as StudentId,
@Mark …Run Code Online (Sandbox Code Playgroud)