标签: sql-server-2016

SQL Server 没有消除死锁吗?

我遇到过一种情况,用户在我们的一个运行存储过程的应用程序中运行了某些内容。存储过程执行一些日志记录(INSERT记录到日志表),然后以以下格式执行简单的删除

DELETE FROM MyTable WHERE Id = 1

从具有数百万行的表中删除DELETE数万条记录(存储过程对多个表执行此操作)并生成并行执行计划。Id 列是复合主键中的第二列,但该表没有任何以该列开头的索引。

删除计划可在此处获取

表的匿名 DDL 如下

CREATE TABLE [dbo].MyTable
(
    [Column15] [varchar](50) NULL,
    [Column16] [int] NULL,
    [Column2] [datetime] NULL,
    [Column3] [datetime] NULL,
    [Column4] [varchar](50) NOT NULL,
    [Column5] [datetime] NULL,
    [Column17] [varchar](8) NULL,
    [Column18] [varchar](50) NULL,
    [Column6] [int] NULL,
    [Column7] [int] NULL,
    [Column9] [int] NULL,
    [Column8] [int] NULL,
    [Column19] [varchar](50) NULL,
    [Column20] [varchar](50) NULL,
    [Column21] [varchar](50) NULL,
    [Column22] [varchar](50) NULL,
    [Column23] [varchar](50) NULL,
    [Column24] [varchar](50) NULL,
    [Column25] [varchar](50) …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock blocking sql-server-2016

10
推荐指数
0
解决办法
362
查看次数

临时表在没有时记录更改吗?

不幸的是,我没有准备好访问 SQL 2016 实例来测试这个。如果我有一个具有以下架构的时态表:

create table blah (
    foo int identity(1,1),
    baa int
)
Run Code Online (Sandbox Code Playgroud)

我要运行以下语句:

update blah set baa = baa
Run Code Online (Sandbox Code Playgroud)

它会像我实际更新数据一样记录更改吗?

我已经查看了MSDN 文章中的临时表修改数据的文章,但在那里找不到任何指定此内容的内容。

sql-server temporal-tables sql-server-2016

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

如何为 SQL Server 2016 Management Studio 安装 TFS 插件?

如何为 SQL Server 2016 Management Studio 安装 TFS 插件?

源代码管理选项不再在选项列表中,因此现有的解决方法似乎不再有效。

source-control sql-server ssms sql-server-2016

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

为什么时态表会记录事务的开始时间?

更新时态表中的一行时,该行的旧值存储在历史表中,事务开始时间为SysEndTime. 当前表中的新值将事务开始时间作为SysStartTime

SysStartTimeSysEndTime是时datetime2态表用于记录某行何时是当前版本的列。事务开始时间是包含更新的事务开始的时间。

BOL 说:

系统 datetime2 列中记录的时间基于事务本身的开始时间。例如,在单个事务中插入的所有行都将在对应于 SYSTEM_TIME 周期开始的列中记录相同的 UTC 时间。

示例:我开始更新 Orders 表中的所有行,20160707 11:00:00事务运行需要 5 分钟。这会在历史记录表中为每一行创建一行SysEndTimeas 20160707 11:00:00。当前表中的所有行都有一个SysStartTimeof 20160707 11:00:00

如果有人在20160707 11:01:00(更新正在运行时)执行查询,他们将看到旧值(假设默认读已提交隔离级别)。

但是,如果有人然后使用AS OF语法来查询时态表,因为20160707 11:01:00他们会看到新值,因为他们SysStartTime将是20160707 11:00:00.

对我来说,这意味着它不会像当时那样显示这些行。如果它使用事务结束时间,则问题将不存在。

问题:这是设计使然吗?我错过了什么吗?

我认为它使用事务开始时间的唯一原因是它是事务开始时唯一的“已知”。它不知道事务开始时何时结束,并且在结束时应用结束时间需要时间,这会使它应用的结束时间无效。这有意义吗?

应该允许您重新创建问题。

transaction temporal-tables sql-server-2016

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

JOIN FOR SYSTEM TIME 以列作为有效系统时间

想象一下,我有一个模式,其中包括ProductsOrders,和OrderLineItems,与Products作为一个系统版本态表。

架构:

CREATE TABLE dbo.Products
(
    ProductID INT NOT NULL IDENTITY PRIMARY KEY,
    Name nvarchar(255) not null,
    SysStart DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
    SysEnd DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL,
    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE = dbo.Products_History, DATA_CONSISTENCY_CHECK = ON));
GO

CREATE TABLE dbo.Orders
(
    OrderID int not null identity primary key,
    OrderDate datetime2 (7) not null
);

CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

sql-server temporal-tables sql-server-2016

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

链接 SQL Server 有哪些重大限制?

我们的产品基于 Microsoft SQL Server。目前,我们使用了三个数据库,并且始终将它们部署在一个 SQL Server 实例上。

这三个数据库是OLTP、OLAP和审计。OLAP 数据库有大量来自 OLTP 和审计的 EOD 入站数据,使用跨数据库查询。

问题

如果我们将这三个数据库部署到单个物理服务器内的三个独立的标准版实例上,并使用 SQL Server 的链接服务器功能将它们绑定在一起:

  1. 它对应用程序代码有多透明?我应该期待多少变化?
  2. 到 OLAP 的入站数据为 50k-100k 行,每个 EOD 的有效负载为 200-500MB。我应该期望多少性能下降?
  3. 我应该期待哪些其他重大限制?

背景

目前,我们正在向拥有 500 多个并发用户的潜在客户进行宣传。

我们正在起草服务器规范,其中包括 64 个内核和 256GB RAM。为了让 SQL Server 能够利用所有这些丰富的资源,客户必须购买企业版,而对于 SQL Server 2016,它仅在基于每核的许可中可用。

我们担心仅许可成本(64 x 7400 美元)就会让他们失望。所以我想把数据库拆分成三个标准版的实例,并把它们链接在一起,希望链接功能对应用程序代码是透明的。

performance sql-server linked-server sql-server-2016

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

在不使用 CLR 的情况下创建数据库级常量(枚举)?

我有几个 SQL 对象,它们需要根据请求的所需状态采取备用操作。有没有办法创建可以传递给存储过程、表值函数并在查询中使用(不使用 CLR)的数据库级常量(枚举)?

CREATE PROCEDURE dbo.DoSomeWork(@param1 INTEGER, ..., @EnumValue myEnumType)  AS ...;
Run Code Online (Sandbox Code Playgroud)

然后使用它:

EXEC doSomeWork 85, ..., (myEnumType.EnumValue1 + myEnumType.EnumValue2);
Run Code Online (Sandbox Code Playgroud)

哪里myEnumType会保存一些枚举值。

在该过程中,我将能够使用@EnumValue它并针对其中的值对其进行测试myEnumType以完成所需的工作。我会myEnumType为我正在考虑的情况设置位掩码的值。

举一个简单的例子,考虑一个昂贵的过程,它需要一个巨大的数据集,并将其缩减为一个较小但仍然非常大的数据集。在这个过程中,您需要在该过程中进行一些会影响结果的调整。假设这是根据减少中的中间计算的某些状态过滤(或反对)某些类型的记录。该@EnumValue类型的myEnumType可以用来测试此

SELECT   ...
FROM     ...
WHERE       (@EnumValue & myEnumType.EnumValue1 = myEnumType.EnumValue1 AND ...)
        OR  (@EnumValue & myEnumType.EnumValue2 = myEnumType.EnumValue2 AND ...)
        OR  ...
Run Code Online (Sandbox Code Playgroud)

在不使用 CLR 的情况下,SQL Server 中是否可以使用这些类型的数据库级常量?

我正在寻找可以作为参数传递给存储过程、函数等的数据库级枚举或常量集。

sql-server enum sql-server-2016

9
推荐指数
3
解决办法
1639
查看次数

SQL Server --> Informix DB 链接服务器

经过大约 3 天的尝试,我无法创建从 SQL Server 2016 到 Informix 11.5 的链接服务器。我没有在其他版本(2008R2 等)上尝试过这个,因为我想先在测试环境中设置连接。

我做了什么

1) 将 IBM Informix指令与 OLE DB 提供程序一起使用,在其中我收到以下错误(无论我是否在提供程序字符串中使用 DNS):

无法为链接服务器“UCCX”初始化 OLE DB 提供程序“Ifxoledbc”的数据源对象。链接服务器“UCCX”的 OLE DB 提供程序“Ifxoledbc”返回消息“EIX000: (-23197)”数据库区域设置信息不匹配”(Microsoft SQL Server,错误:7303)

DB Locale 是 en_US.57372

2)如本博客所述,使用 Microsoft OLE DB Provider for SQL Server返回错误:

命名管道提供程序:无法打开与 SQL Server 的连接。链接服务器 UCCX 的 OLE DB 提供程序 SQLNCLI11 返回消息“登录超时已过期” 链接服务器 UCCX …

sql-server linked-server informix sql-server-2016

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

无法确定元数据,因为语句调用了扩展存储过程

在 sql server 2012 中,我曾经通过获取 SP_HELP_JOB 的输出来查看作业

-- https://www.sqlservercentral.com/Forums/Topic259078-8-1.aspx
-- getting data from sp_help_job into a temp table
-- marcelo miorelli
-- 01-april-2013

IF OBJECT_ID('TEMPDB..#JOBiNFO') IS NOT NULL
   DROP TABLE #JobInfo

IF OBJECT_ID('TEMPDB..#ScheduleInfo') IS NOT NULL
   DROP TABLE #ScheduleInfo


SELECT * INTO #JobInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off exec msdb.dbo.sp_help_job -- @execution_status=4')


SELECT * INTO #ScheduleInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off  exec msdb.dbo.sp_help_schedule')
Run Code Online (Sandbox Code Playgroud)

现在在 sql server 2016 上这不起作用。

我收到此错误消息:

消息 11520,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 …

sql-server dynamic-sql jobs openrowset sql-server-2016

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

更改最大内存设置会使查询计划失效吗?

我最近将最大内存从默认(无限制)降低到 20 GB。这会清除计划缓存中最旧的查询吗?

sql-server memory configuration plan-cache sql-server-2016

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