小编Mar*_*own的帖子

没有数据更改的 UPDATE 性能

如果我有一个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 表单有性能优势,是否有可能以某种方式获得我需要的行数?

performance sql-server update query-performance

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

SQL Server 如何确定选择表时锁定的顺序?

我有两个存储过程在系统负载时会死锁。Proc A 正在从一个表中选择,而 Proc B 正在插入同一个表中。锁图显示 Proc A 有一个 S 模式页锁,而 Proc B 想要一个 IX 模式锁,但是 Proc A 正在等待另一个页面的 S 模式页锁,而 Proc B 已经有一个 IX 模式页锁.

显然,这可以通过确保两个查询以相同的顺序锁定表中的页面来解决,但我不知道如何做到这一点。

我的问题是:在执行 INSERT 和 SELECT 时,SQL Server 如何确定锁定页面的顺序以及如何修改此行为?

sql-server deadlock locking

10
推荐指数
1
解决办法
1374
查看次数

dm_db_index_usage_stats 如何为 user_seeks 和用户扫描显示 0 而对于 user_lookups 显示大量?

我可能不明白一些事情,但这是问题。

我已经对 dm_db_index_usage_stats 进行了查询。我注意到我的几个索引在 user_lookups 列中有很大的数字(650 万和 2 万),但这些在 user_seeks 和 user_scans 列中也有一个零。

我的理解(来自在线书籍)是 user_lookups 列计算书签查找。据我所知,这是数据库无法在索引中找到它需要的所有列,并且必须访问主表或剩余列的聚集索引的情况。但是,如果 SQL Server 从未对索引进行过搜索或扫描,为什么会这样做呢?

sql-server sql-server-2008-r2

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

PostgreSQL 中 SQL Server 的 db_datareader/db_datawriter 相当于什么?

我正在将应用程序从 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 中的等价物?

postgresql permissions role

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

是否可以获得使用 WITH EXECUTE 创建的过程列表?

是否可以获得使用创建的存储过程列表WITH EXECUTE

我尝试查看sys.procedures,但它们都将主体设置为null,并且我知道有一些程序是以这种方式创建的。

sql-server stored-procedures sql-server-2014

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