如果我有一个UPDATE
实际上没有改变任何数据的语句(因为数据已经处于更新状态)。在WHERE
子句中进行检查以防止更新是否有任何性能优势?
例如,以下 UPDATE 1 和 UPDATE 2 之间的执行速度是否有任何差异:
CREATE TABLE MyTable (ID int PRIMARY KEY, Value int);
INSERT INTO MyTable (ID, Value)
VALUES
(1, 1),
(2, 2),
(3, 3);
-- UPDATE 1
UPDATE MyTable
SET
Value = 2
WHERE
ID = 2
AND Value <> 2;
SELECT @@ROWCOUNT;
-- UPDATE 2
UPDATE MyTable
SET
Value = 2
WHERE
ID = 2;
SELECT @@ROWCOUNT;
DROP TABLE MyTable;
Run Code Online (Sandbox Code Playgroud)
我问的原因是我需要行数来包含未更改的行,所以我知道如果 ID 不存在是否进行插入。因此,我使用了 UPDATE 2 表单。如果使用 UPDATE 1 表单有性能优势,是否有可能以某种方式获得我需要的行数?
我有两个存储过程在系统负载时会死锁。Proc A 正在从一个表中选择,而 Proc B 正在插入同一个表中。锁图显示 Proc A 有一个 S 模式页锁,而 Proc B 想要一个 IX 模式锁,但是 Proc A 正在等待另一个页面的 S 模式页锁,而 Proc B 已经有一个 IX 模式页锁.
显然,这可以通过确保两个查询以相同的顺序锁定表中的页面来解决,但我不知道如何做到这一点。
我的问题是:在执行 INSERT 和 SELECT 时,SQL Server 如何确定锁定页面的顺序以及如何修改此行为?
我可能不明白一些事情,但这是问题。
我已经对 dm_db_index_usage_stats 进行了查询。我注意到我的几个索引在 user_lookups 列中有很大的数字(650 万和 2 万),但这些在 user_seeks 和 user_scans 列中也有一个零。
我的理解(来自在线书籍)是 user_lookups 列计算书签查找。据我所知,这是数据库无法在索引中找到它需要的所有列,并且必须访问主表或剩余列的聚集索引的情况。但是,如果 SQL Server 从未对索引进行过搜索或扫描,为什么会这样做呢?
我正在将应用程序从 SQL Server 移植到 PostgreSQL。其中大部分很简单,因为应用程序只真正执行简单的选择、插入和更新。但是我需要创建一个用户来访问数据库。SQL Sever 代码像这样创建它的用户:
USE [master] CREATE LOGIN [ExampleUserName] WITH PASSWORD = 'ExamplePassword', CHECK_EXPIRATION=OFF, CHECK_POLICY=ON;
USE [ExampleDB];
CREATE USER [ExampleUserName] FOR LOGIN [ExampleUserName];
ALTER ROLE [db_datawriter] ADD MEMBER [ExampleUserName];
ALTER ROLE [db_datareader] ADD MEMBER [ExampleUserName];
Run Code Online (Sandbox Code Playgroud)
什么是 PostgreSQL 中的等价物?
是否可以获得使用创建的存储过程列表WITH EXECUTE
?
我尝试查看sys.procedures
,但它们都将主体设置为null
,并且我知道有一些程序是以这种方式创建的。
sql-server ×4
deadlock ×1
locking ×1
performance ×1
permissions ×1
postgresql ×1
role ×1
update ×1