标签: sql-server

如何优化在嵌套循环(内部联接)上运行缓慢的查询

TL; 博士

由于这个问题一直有意见,我在这里总结一下,这样新人就不必忍受历史:

JOIN table t ON t.member = @value1 OR t.member = @value2 -- this is slow as hell
JOIN table t ON t.member = COALESCE(@value1, @value2)    -- this is blazing fast
-- Note that here if @value1 has a value, @value2 is NULL, and vice versa
Run Code Online (Sandbox Code Playgroud)

我意识到这可能不是每个人的问题,但通过突出 ON 子句的敏感性,它可能会帮助您寻找正确的方向。无论如何,原文是为未来的人类学家准备的:

原文

考虑以下简单查询(仅涉及 3 个表)

    SELECT

        l.sku_id AS ProductId,
        l.is_primary AS IsPrimary,
        v1.category_name AS Category1,
        v2.category_name AS Category2,
        v3.category_name AS Category3,
        v4.category_name AS Category4,
        v5.category_name AS Category5

    FROM category c4 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

43
推荐指数
2
解决办法
10万
查看次数

ALLOW_SNAPSHOT_ISOLATION 和 READ_COMMITTED_SNAPSHOT

大部分的论坛和榜样的网上总是建议同时拥有ALLOW_SNAPSHOT_ISOLATIONREAD_COMMITTED_SNAPSHOT设置为ON,每当别人问快照,行版本或类似的问题。

我想这两种设置中的 SNAPSHOT 一词都有些令人困惑。我认为,为了让数据库引擎对 READ_COMMITTED 默认行为使用行版本控制而不是锁定,无论设置如何,数据库READ_COMMITTED_SNAPSHOT都设置为 ON 。ALLOW_SNAPSHOT_ISOLATION

ALLOW_SNAPSHOT_ISOLATION设定被设定为ON只允许快照隔离启动事务(例如SET TRANSACTION ISOLATION级快照)时无论READ_COMMITTED_SNAPSHOT设置。

将这两个设置设置为 ON 的唯一原因是它需要具有 READ COMMITTED 行版本控制 快照隔离。

我的问题是,我的理解在某种程度上是错误的吗?并且这两个设置必须始终一起设置为 ON(特别是对于 READ COMMITTED 行版本控制)?

sql-server configuration isolation-level

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

执行计划基础——哈希匹配混淆

我开始学习执行计划,并且对哈希匹配的工作原理以及为什么在简单连接中使用它感到困惑:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

据我了解,顶部索引扫描的结果变为可散列的,底部索引聚集扫描中的每一行都被查找。我至少在某种程度上了解哈希表是如何工作的,但我对在这样的示例中究竟哪些值进行了哈希处理感到困惑。

我认为它们之间的公共字段,即 id 被散列是有意义的——但如果是这种情况,为什么要散列一个数字?

sql-server execution-plan sql-server-2008-r2

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

更改列宽

增加一列(nvarchar)的宽度一定会删除表格吗?

换句话说,在有活跃用户的生产环境中,宽度可以改变吗?

我认为如果大小增加(而不是减少),这将不是问题。

sql-server

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

数据库主体在数据库中拥有一个架构,并且无法删除消息

我试图从数据库中删除一个主体,但不能,因为它拥有一个架构。但是,当我去编辑用户时,取消选中架构的框是蓝色的并且无法移除。如何从这些架构中删除主体?

sql-server-2008 sql-server

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

如何识别负责“字符串或二进制数据将被截断”的列。

我正在使用我从远程 Pg 数据库写入 SELECT 的代码自动生成一些查询,并插入到本地 SQL Server 数据库中。但是,其中之一正在生成此错误:

[Microsoft][ODBC SQL Server 驱动程序][SQL Server]字符串或二进制数据将被截断。(SQL-22001) [状态是 22001 现在是 01000]

[Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止。(SQL-01000) 在 .\insert.pl 第 106 行。

我如何找出哪个列产生了该错误并且缺少输入的长度?有没有办法做到这一点而不用蛮力猜测所有varchar

sql-server-2008 sql-server

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

将最后一个身份插入表中的最佳方法

哪个是获取我刚刚通过插入生成的标识值的最佳选择?这些语句对性能有什么影响?

  1. SCOPE_IDENTITY()
  2. 聚合函数 MAX()
  3. SELECT TOP 1IdentityColumn FROM TableNameORDER BY IdentityColumn DESC

sql-server sql-server-2008-r2 identity

42
推荐指数
2
解决办法
22万
查看次数

检查用户是否存在于 SQL Server 数据库中

我正在使用 SQL Server 2012。我想在将用户添加到数据库之前检查用户是否存在。

这是我测试过的:

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT name 
                FROM [sys].[server_principals]
                WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Run Code Online (Sandbox Code Playgroud)

但是,SELECT name FROM [sys].[server_principals]如果该用户存在于MyDatabase.

如何检查用户是否存在于MyDatabase

sql-server sql-server-2012

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

为什么更改声明的连接列顺序会引入排序?

我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.

测试设置

设置脚本,包括一些真实的统计数据:

DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;

CREATE TABLE #left (
    a       char(4) NOT NULL,
    b       char(2) NOT NULL,
    c       varchar(13) NOT NULL,
    d       bit NOT NULL,
    e       char(4) NOT NULL,
    f       char(25) NULL,
    g       char(25) NOT NULL,
    h       char(25) NULL
    --- and a few other columns
);

CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)

UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;

CREATE …
Run Code Online (Sandbox Code Playgroud)

join sql-server sql-server-2014 sort-operator sql-server-2017

42
推荐指数
2
解决办法
1878
查看次数

在 SQL Server 2016 中,始终加密和透明数据加密有什么区别?

在我撰写本文时,我仍在等待 SQL Server 2016 的正式发布,以便我们可以探索其“始终加密”功能的实用性。

我只想知道 SQL Server 2016 中的 Always Encrypted 和当前可用的透明数据加密之间的具体区别是什么,以便我们可以为未来的项目做出正确的决定。

sql-server transparent-data-encryption sql-server-2016 always-encrypted

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