AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 150888
Accepted
VansFannel
VansFannel
Asked: 2016-09-29 06:57:04 +0800 CST2016-09-29 06:57:04 +0800 CST 2016-09-29 06:57:04 +0800 CST

更新表比 INNER JOIN 快

  • 772

我有一个带有内部连接的 SQL Server 2012 存储过程,执行时间为 7,387 毫秒(我在 Activity Monitor 中看到了它):

[...]
declare @childrenIds as dbo.CodeIdList;

[...]
Update
    dbo.Code
set
    dbo.Code.CommissioningFlag = 21
From 
    dbo.Code
INNER JOIN
    @childrenIds c
ON
    dbo.Code.CodeId =  c.CodeId

CodeIdList是:

CREATE TYPE [dbo].[CodeIdList] AS TABLE (
    [CodeId] INT NULL
);

有没有比使用 更新代码表更快的方法INNER JOIN?

我不是 dba,所以我不知道您是否需要有关我的问题的更多详细信息。如果您需要它们,请询问。

我sp_helpindex在代码表上运行了这些结果:

索引名称 | index_description
PK_CODE | 位于 PRIMARY 上的聚集的、唯一的主键 | 代码ID
UC_CODE_SERIAL | 位于 PRIMARY | 上的非聚集、唯一、唯一键 串行

Code建表脚本:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [ ...]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)

此时代码表中有 1.006.896 行。

执行计划:

在此处输入图像描述

XML 版本位于http://pastebin.com/9yXsRfva

SQL Server 版本信息:

Microsoft SQL Server Management Studio 11.0.6020.0 Herramientas cliente de Microsoft Analysis Services 11.0.6020.0 Microsoft Data Access Components (MDAC) 6.1.7601.17514
微软 MSXML 3.0 4.0 6.0
微软 Internet Explorer 9.11.9600.18314
微软 .NET 框架 4.0.30319.42000
手术系统 6.1.7601

Select @@VERSION:

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
2015 年 10 月 20 日 15:36:27
版权所有 (c) Microsoft Corporation Enterprise Edition(64 位)
Windows NT 6.1(内部版本 7601:Service Pack 1)
sql-server performance
  • 4 4 个回答
  • 3372 Views

4 个回答

  • Voted
  1. Best Answer
    VansFannel
    2016-09-30T22:14:20+08:002016-09-30T22:14:20+08:00

    我已经添加了这个索引,它已经将连接加速到 0ms 平均持续时间:

    CREATE INDEX [IDX_FLAG_LEVEL_CODE]
         ON Code (CommissioningFlag, AggregationLevelId)
         INCLUDE (Serial, CodeId);
    

    我在解决我之前的问题时偶然找到了解决方案。

    • 4
  2. Scott Hodgin - Retired
    2016-09-30T02:55:24+08:002016-09-30T02:55:24+08:00

    您没有指明您的服务包级别,但您可能想查看Aaron Bertrand 的这篇关于 2012 Service Pack 2 跟踪标志的帖子,该标志“可能”在加入表变量时提高性能。根据帖子:

    “如果一个表变量与 SQL Server 中的其他表连接,可能会由于查询计划选择效率低下而导致性能下降,因为 SQL Server 在编译查询计划时不支持统计或跟踪表变量中的行数。”

    此外,看看使用临时表而不是表变量是否会产生影响会很有趣。

    发布“实际”执行计划的 XML 可能会为我们提供有关如何执行连接的更多信息。

    • 2
  3. paparazzo
    2016-09-29T07:24:12+08:002016-09-29T07:24:12+08:00

    我会添加一个 <> 21 所以它可以跳过任何已经设置的

    Update dbo.Code
    set    dbo.Code.CommissioningFlag = 21
    From   dbo.Code
    JOIN   @childrenIds c
    ON     dbo.Code.CodeId =  c.CodeId 
    where  dbo.Code.CommissioningFlag <> 21 or dbo.Code.CommissioningFlag is null
    

    如果 CodeID 在 CodeIdList 中是唯一的,那么将其声明为 PK 可能会有所帮助

    • 1
  4. Y.B.
    2016-10-01T00:26:24+08:002016-10-01T00:26:24+08:00

    UPDATE声明_

    UPDATE dbo.Code
    SET dbo.Code.CommissioningFlag = 21
    FROM dbo.Code
    INNER JOIN @childrenIds c
    ON dbo.Code.CodeId = c.CodeId;
    

    建议@childrenIds应该是唯一的而不是空的。

    尝试

    DECLARE @childrenIds AS table ([CodeId] int PRIMARY KEY);
    

    并在填充时遵守此约束@childrenIds(注意不要尝试在任何时候插入重复项或 NULL)CodeId。@childrenIds

    • 0

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve