标签: sql-server-2016

为具有 300 个分区的分区表重建索引

设想

分区表为空,我正在加载 1 个具有 180k 行的分区的数据。我禁用索引并加载数据并在加载数据后重建索引。

问题

在检查重建索引的查询计划时,我可以看到“估计行数”为 180k,但“实际行数”为 300 个分区 * 180,000 行 = 5400 万行,即使我只加载了一个分区的数据。

在此处输入图片说明 在此处输入图片说明

你能解释一下这种行为以及如何克服这个问题吗?

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64) Mar 18 2018 09:11:49 版权所有 (c) Windows Server 2012 R2 Standard 6.3(内部版本 9600)上的 Microsoft Corporation Enterprise Edition(64 位):

sql-server partitioning sql-server-2016 index-maintenance cardinality-estimates

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

SQL 临时表:主键聚集或堆

我们正在使用传统的平面 txt 文件并将它们插入到带有 SSIS 的阶段表中。问题出现了表是否应该具有主聚集键索引。这是没有转换的直接平面文件导入。

create table dbo.CustomerTransaction
(
     CustomerName varchar(255),
     PurchaseLocation varchar(255),
     Productid  int,
     AmountSold float,
     CustomerAddress varchar(50)
)

create table dbo.CustomerTransaction
(
     -- discussion for adding this column
     CustomerTransactionId int primary key clustered identity(1,1) 

     CustomerName varchar(255),
     PurchaseLocation varchar(255),
     Productid  int,
     AmountSold float,
     CustomerAddress varchar(50)
)

-- both tables have nonclustered indexes
create nonclustered index idx_ProductId on dbo.CustomerTransaction(ProductId)
create nonclustered index idx_CustomerAddress on dbo.CustomerTransaction(CustomerAddress)

-- Actually have more indexes, tables above are just for sample 
Run Code Online (Sandbox Code Playgroud)

1)在ETL之前,临时表被截断。没有删除和更新。仅插入。

truncate table dbo.[CustomerTransaction] …
Run Code Online (Sandbox Code Playgroud)

performance database-design sql-server etl sql-server-2016 performance-tuning

6
推荐指数
2
解决办法
1773
查看次数

查找子组的最小值,过滤掉同一父组中前面的最小值

如何获取组(Acc、TranType)的最小值,但过滤掉 Acc 组前面行中使用的任何最小值。前面的行将定义为 Acc asc,TranType asc。

PosCancelID 应该只在每个 Acc 组出现一次。但是相同的 PosCancelID 可能出现在数据集中的另一个 Acc Group 中。

因此,对于给定的数据集:

Acc  | TranType | PosCancelID
100     1               2
808     1               5
808     1               4
808     2               5
808     2               4<--To be filtered from min calc as it min for (808,1)
813     2               3
813     4               3<--To be filtered from min calc as it min for (813,2)
809     1               3
809     1               4
809     2               3<--To be filtered from min calc as (809,1) uses it …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2016

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

如何禁用和删除数据库中的所有临时表

我正在执行一项需要在另一个实例中备份和恢复数据库的任务。

但是,当我恢复那个数据库时,我需要删除所有与临时表关联的历史表。

有没有快速的方法来做到这一点?任何帮助表示赞赏。

sql-server sql-server-2016

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

QueryStore 计划强制限制

我有一个DELETE针对带有全文索引列的表运行的语句,cascade启用了一些外键。它看起来像这样:

DELETE FROM dbo.STUDENTS WHERE STUDENTID=@STUDENTID
Run Code Online (Sandbox Code Playgroud)

有时会编译一个计划,其中包括对所有索引操作的非常高的行估计,因此DELETE需要很长时间并导致锁定。

我试图迫使QueryStore一个很好的计划,但是这并不实际工作,表现出last forced plan failure descriptionNO_PLAN

我已确保没有可能使计划无效的架构更改。

查看执行计划,我看到这DELETE涉及到一个包含 FT 索引的系统表的连接:

在此处输入图片说明

加入 FT 索引是否意味着不支持计划强制?

sql-server full-text-search execution-plan sql-server-2016 query-store

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

Alwayson AG 租约超时和健康检查超时

我们有一个带有两个实例的物理 SQL Server 2016 Enterprise SP2,每个实例包含一个 AG。有时会发生一个AG去resolve(没有failover),集群资源在500ms后自动重启,然后一切又重新上线。但是我还没有找到原因。

当我检查错误日志时,我看到以下条目:

日期 14/04/2019 23:35:37
SQL Server 托管可用性组“AG_PROD”在租用超时期限内未收到来自 Windows Server 故障转移群集的进程事件信号。

日期 14/04/2019 23:35:37
SQL Server 托管可用性组“AG_PROD”在租用超时期限内未收到来自 Windows Server 故障转移群集的进程事件信号。

日期 14/04/2019 23:35:14
SQL Server 在数据库 ID 6 中的文件 [e:\sqlData\db.mdf] 上遇到了 1 次 I/O 请求需要超过 15 秒才能完成。操作系统文件句柄是 0x0000000000001128。最新的long I/O的偏移量为:0x00010de65c0000

日期 14/04/2019 23:33:10
BACKUP DATABASE WITH DIFFERENTIAL 在 61.045 > 秒(6.585 MB/秒)内成功处理了 51459 页。

如您所见,有一个 IO 请求需要的时间超过 15 秒,我希望能在*_SQLDIAG_*.xel文件中找到它,但此处未发现任何错误。

当我检查集群日志时,我发现以下内容:

2019/04/14-23:35:09.430 INFO [NM] 收到来自客户端地址 SQL1 的请求。
2019/04/14-23:35:09.444 INFO [NM] 收到来自客户端地址 SQL1 的请求。
2019/04/14-23:35:09.459 …

clustering database-internals availability-groups sql-server-2016

6
推荐指数
0
解决办法
5179
查看次数

如何查找计算列中是否引用了列?

我正在尝试批量重新输入列。这意味着首先删除并重新创建它们所属的任何约束。

我发现这些约束引用的列

  • 外键,
  • 主键,
  • 索引,
  • 检查约束,
  • 规则,
  • 默认约束。

但我找不到计算列。

我已经研究过INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE,但它不包括计算列。

还有sys.computed_columnswhich 显示定义,但不以可搜索的方式列出列。

我还有其他地方可以看吗?如果 SQL Server 可以弄清楚依赖关系,我想我也可以。

sql-server t-sql dmv system-tables sql-server-2016

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

兼容级别 80 和 100 之间的可变长度字符串问题

在我当前的企业中,我遇到了大量与特定场景相关的问题。

我们有一个 SQL Server 2008,我们想迁移到 SQL Server 2016,所以我们将兼容性从 80 迁移到 100,但是我们的一些存储过程有问题,如下代码所示:

CREATE TABLE #PRUEBA (texto1 char(30), condicion char(30)) 
INSERT INTO  #PRUEBA VALUES ('PFI','1') 
INSERT INTO #PRUEBA VALUES ('CFI','2') 
SELECT 
    CASE
        WHEN condicion= '1' THEN texto1 
        ELSE 'TFI'
    END 
FROM  #PRUEBA 
DROP TABLE #PRUEBA
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 80

'PFI                           ' -> char of 30 length 
'TFI                           ' -> char of 30 length
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 90

'PFI                           ' -> varchar of 30 length
'TFI'                            -> varchar of 3 length
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 100

'PFI …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server varchar sql-server-2016 compatibility-level

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

如何强制 SQL Server 通过视图使用我的空间索引?

我有一些表,其中包含存储为 lat long 对的属性的事务。(然后在我的示例架构中有更多的列和数据点)。

一个常见的请求是查找特定点 X 英里范围内发生的交易,并且只检索附近每个房产发生的 5 个最近的交易。

为了完成这项工作,我决定添加一个视图来封装最新的逻辑:

create or alter view dbo.v_example
with schemabinding as
select example_id
      ,transaction_dt
      ,latitude
      ,longitude
      ,latlong
      ,most_recent= iif(row_number() over (partition by latitude,longitude order by transaction_dt desc) < 5,1,null)
from dbo.example;
Run Code Online (Sandbox Code Playgroud)

所以一个查询可能看起来像这样:

create or alter view dbo.v_example
with schemabinding as
select example_id
      ,transaction_dt
      ,latitude
      ,longitude
      ,latlong
      ,most_recent= iif(row_number() over (partition by latitude,longitude order by transaction_dt desc) < 5,1,null)
from dbo.example;
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我通过视图查询时,SQL Server 不想使用空间索引。如果我删除schemabinding并尝试在视图上添加提示,我会发现查询处理器无法创建计划。

如何封装逻辑并仍然让它使用我的空间索引?

这是一个带有示例数据和计划形状的 db<>fiddle

该表要大得多,扫描它然后进行聚集索引查找然后逐点查找要慢得多。

sql-server spatial sql-server-2016

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

使用 SQL 作业进行备份时是否可以使数据库脱机?

我有一个场景,我必须生成数据库的备份(SQL Server 2008)并恢复到新服务器(SQL Server 2016)。在采取备份数据时,无论如何都不应更改。所以我有两个选择来做到这一点,但我不确定它会如何工作。(一切都只使用 SQL 作业。)

  1. 设置只读数据库并恢复到新的数据库服务器。

    ? 是否可以在新服务器上恢复只读数据库?目标服务器已经有一个同名的读写(在线)数据库。

  2. 设置离线数据库并恢复到新的数据库服务器。

    ? 是否可以在新服务器中恢复离线数据库?目标服务器已经有一个同名的在线(读写)数据库。

sql-server backup sql-server-2008-r2 sql-server-2016

6
推荐指数
2
解决办法
2107
查看次数