标签: sql-server-2016

如何使用 Sql Azure 在 SSMS 对象浏览器上启用查询存储?

我正在遵循本指南:Monitoring Performance By Use the Query Store

  • 我正在使用 SSMS 2016 CTP3.2 和 Sql Azure V12
  • 我已在数据库属性上启用查询存储。
  • 我可以使用 azure 门户上的查询性能洞察。

但是,当我在 SMSS 2016 CTP3.2 上打开 Azure 数据库并展开数据库树时,查询存储/回归查询或任何其他选项都可用。

我希望能够进行 IO 消耗最多的查询并分析执行计划。

我还需要启用什么吗?

sys.databases中相关的is_query_store_on列显示 0,但数据库属性表明它已启用。我执行了,但is_query_store_on仍然保持在 0。ALTER DATABASE <DB> SET QUERY_STORE = ON;

以下查询:

SELECT 
    actual_state, actual_state_desc, readonly_reason, 
    current_storage_size_mb, max_storage_size_mb
FROM sys.database_query_store_options;
Run Code Online (Sandbox Code Playgroud)

显示实际状态= 2;

sql-server azure-sql-database sql-server-2016 query-store

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

SSMS 2016 需要很长时间才能打开索引的上下文菜单

  1. 转到对象资源管理器中的随机表
  2. 将其扩展到索引
  3. 右键单击索引 - 大约需要10 秒才能出现

如果我尝试DROP & CREATE INDEX从上下文菜单创建脚本,则需要类似的时间。

我查看了 Profiler 跟踪,它有大约 4 页的大量重复查询。如果我查看任务管理器的“性能/以太网”选项卡,我会发现它以 800kb-1mb 的速率传输信息,并以大约 200kb 左右的速率发送信息。

这是一个错误吗?特征?我是否缺少一些简单的设置?

  • SSMS 版本:13.0.15900.1。
  • 将 SSMS 更新到 13.0.16000.28,但没有效果。
  • SQL Server 版本:2016,累积更新 2。
  • 我安装了 SQL Prompt 7。卸载了,但没有任何改变。
  • SELECT COUNT(*) FROM sys.indexes;返回 1979 年。
  • SELECT COUNT(*) FROM sys.partitions;返回 1973 年。

盒子是我自己的,所以没有争议。另外,这个盒子是我设计过的速度最快、规格最好的盒子。除了这个特定的操作之外,一切都很敏捷。

sql-server ssms sql-server-2016

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

清除计划缓存后如何重新生成执行计划?

清除 SQL Server 上的计划缓存后,如何重新生成存储过程的执行计划而不执行存储过程本身?

当我今天早上更新统计数据时,我的一个存储过程运行得非常缓慢。根据一些谷歌,我发现清除计划缓存可以解决这个问题 - 确实如此。但是,如果我必须再次执行此操作,我希望避免在用户等待响应时重新生成计划对性能造成影响。

SQL Server 的版本/版本是 2016 Enterprise。

sql-server execution-plan plan-cache sql-server-2016

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

是否可以将数据批量插入到具有使用 Always Encrypted 加密的列的表中?

在 SSMS 中,我们尝试将 csv 文件批量插入到具有使用 SQL Server 2016 的始终加密功能加密的列的表中。

这是我们正在使用的命令:

INSERT INTO membersE
SELECT *
FROM OPENROWSET(
    BULK 'c:\members.csv', 
    FORMATFILE = 'c:\membersEFormat.xml',
    FIRSTROW = 2
    ) m
Run Code Online (Sandbox Code Playgroud)

这将返回尝试插入加密列时出现的典型错误:

MSG 206,第16级,状态2,第6行
操作类型冲突:Varbinary与Varchar(50)与(Encryption_Type ='desirctionistist',Encryption_algorithm_name ='aead_aes_aes_aes_aes_aes_256_cbc_hmac_hmac_hmac_sha_256',column_encryetto ='aead_aes_aes_aes_aes_emcy_yerto ='aead_aes_aes_aes_256 ase_name ='数据库')排序规则名称 = 'Latin1_General_BIN2'

我们知道您无法通过 SSMS 插入加密列,并且您需要使用 .NET 4.6.1+ 客户端,但我们想知道批量插入操作是否也无法实现?

对我有用的示例代码
(满足 Windows10 的要求)

        SqlCommand cmd;
        SqlConnection conn;
        SqlBulkCopy copy;
        SqlDataAdapter da;
        DataTable dt;

        using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString))
        {
            conn.Open();

            using (cmd = new SqlCommand("SELECT * FROM members", conn))
            using (copy = new SqlBulkCopy(conn)) …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016 always-encrypted bulk-insert

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

索引视图会减慢更新速度。有解决方法的提示吗?

我尝试创建索引视图。我终于有了一个(几乎)符合标准的案例。所有内部联接、极少数非确定性函数(已移至外部视图)和自联接仅位于移至外部视图的两个表中。

问题是仅视图就需要 3 秒以上的时间来编译,这对于用例来说太慢了。遵循这样的建议:

索引视图也是提高 INNER JOINS 性能的好方法。当两个或多个表在索引视图中预联接时,查询优化器可以选择检索物化视图数据,而不是执行昂贵的联接操作。

我正在考虑用索引视图解决问题。

然而,一旦创建了这个索引视图(它包含大约 20 个连接),对基础表的每次更新都会变得非常慢。设置统计 IO On 显示它正在重新访问语句上的所有基础表,这些表在重新评估视图时甚至不修改任何数据,例如如下所示的更新:

update a
  set y = b.y, z = b.z
from a inner join b on a.x = b.x
where exists (select a.x, a.y, a.z except select b.x, b.y, b.z)
Run Code Online (Sandbox Code Playgroud)

因此,受影响的行数为零,但整个索引视图及其依赖项仍然会执行一系列操作,并且执行时间会显示这一点。

有没有办法让 SQL Server 不使用该视图,除非它确实需要更新记录?也许有我不知道的暗示。

sql-server materialized-view sql-server-2016

5
推荐指数
0
解决办法
732
查看次数

向表添加列存储索引是否会影响在同一表上使用行存储索引的查询的读取性能?

我正在对具有大约 5 亿行的单个表上的列存储索引进行一些测试。聚合查询的性能提升非常棒(以前运行大约需要 2 分钟的查询现在可以在 0 秒内运行以聚合整个表)。

但我也注意到另一个测试查询,它利用在同一个表上的现有行存储索引上进行搜索,现在运行速度是创建列存储索引之前的 4 倍。我可以反复演示当删除列存储索引时,行存储查询在 5 秒内运行,通过添加回列存储索引,行存储查询在 20 秒内运行。

我一直关注行存储索引查询的实际执行计划,无论是否存在列存储索引,这两种情况几乎完全相同。(它在两种情况下都使用行存储索引。)

行存储测试查询是:

SELECT *
INTO #TEMP
FROM Table1 WITH (FORCESEEK)
WHERE IntField1 = 571
    AND DateField1 >= '6/01/2020'
Run Code Online (Sandbox Code Playgroud)

此查询中使用的行存储索引是: CREATE NONCLUSTERED INDEX IX_Table1_1 ON Table1 (IntField1, DateField1) INCLUDE (IntField2)

列存储测试查询是:

SELECT COUNT(DISTINCT IntField2) AS IntField2_UniqueCount, COUNT(1) AS RowCount
FROM Table1
WHERE IntField1 = 571 -- Some other test columnstore queries also don't use any WHERE predicates on this table
    AND DateField1 >= '1/1/2019' 
Run Code Online (Sandbox Code Playgroud)

列存储索引是: CREATE NONCLUSTERED …

index sql-server columnstore nonclustered-index sql-server-2016

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

DATEADD 和 DATEPART 以毫秒为单位产生奇怪的结果

我有一个包含 unix 时间日期和一个单独的毫秒字段的表。我现在尝试从两个字段中创建一个日期以供以后计算(例如过滤时间范围)。将毫秒添加到通过...创建的日期后

 dateadd(S, [timestamp_s], '1970-01-01')
Run Code Online (Sandbox Code Playgroud)

通过添加另一个DATEADD...

dateadd(MS, [timestamp_ms], dateadd(S, [timestamp_s], '1970-01-01')) eventdate
Run Code Online (Sandbox Code Playgroud)

...然后输出日期毫秒有时关闭一毫秒。出于好奇,我然后尝试提取毫秒,看看这给出了什么,然后又减少了 1 毫秒。

在此处输入图片说明

我认为这与内部浮点精度有关,但我在数据中看不到任何规则。有时每个操作都会减少 1 毫秒,有时第一个会减 1,但 DATEPART 然后会再次加 1,等等。

由于这可能会导致某些用户感到沮丧,因此我想了解这种行为并在理想情况下找到问题的解决方案。提前致谢。

sql-server datatypes datetime sql-server-2016

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

发出 CHECKPOINT 后的脏缓冲区页

我目前正在开发一个测试系统,并且由于我想要优化的查询的性质,我正在尝试尽可能模拟“冷”读取。其中一部分是在执行查询之前清除缓冲区缓存。从我可以找到的所有内容中,应该在检查点期间写入脏缓冲区页面。但是,即使在发出 CHECKPOINT 之后,缓冲池中似乎仍然有 169 个我的数据库的脏页(通过 评估SELECT * FROM sys.dm_os_buffer_descriptors WHERE database_id=7 AND is_modified=1)。

我对检查点或 sys.dm_os_buffer_descriptors 的内容有什么误解吗?如果没有,为什么我应该写掉它们之后我仍然有脏页?

sql-server checkpoint sql-server-2016

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

为什么更改数据类型不会影响数据库大小?

我有一个包含四列和约 6.6 亿行的表格。其中两列是 bigint,尽管它们实际上并不需要包含任何不能放入 int 的内容。因此作为测试,我将它们的数据类型从 bigint 更改为 int。该表上有一个聚集索引,它的键不使用这两列。

结果令我困惑。数据空间(在表属性中)保持不变,而索引空间下降了 23.5%。有人可以向我解释那里发生了什么吗?为什么数据空间没有改变?

顺便说一句,我做了类似于另一张桌子的事情。那里的数据空间下降了 30.4%,这正是我根据行大小的变化计算得出的。索引空间的下降类似。

[编辑说明:我最初忽略了恢复一个非聚集索引。这已得到修复,问题也相应更改]

sql-server datatypes sql-server-2016

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

一次合并多条记录

有一段代码来自之前的开发人员,它使用变量执行合并语句,并一次处理一条记录。

我确信合并可以同时处理多个记录。

create table dbo.Staging
(
    transactionID bigint not null primary key nonclustered,
    transactionDate date not null,
    productId int not null,
    orderId int not null,
    qty int not null,
    unitPrice decimal(8,2) not null
)

create table dbo.Transactions
(
    transactionID bigint not null primary key clustered,
    transactionDate date not null,
    productID int not null,
    ReferenceOrderID  int not null,
    Qty int not null,
    ActualCost decimal(8,2) not null
)
insert into dbo.Staging(transactionID,transactionDate,productId,orderId,qty,unitPrice)
values(1001,'20210101',45889,1501,5,105),
      (1002,'20210102',45892,1503,2,8),
      (1003,'20210103',45555,1555,5,5),
      (1004,'20210104',44444,1444,4,4)

insert into dbo.Transactions(transactionID,transactionDate,productId,ReferenceOrderID,qty,ActualCost)
values
      (1003,'20210101',41111,1111,1,1),
      (1004,'20210101',41111,1111,1,1)
Run Code Online (Sandbox Code Playgroud)

代码要长得多,但这里是代码: …

sql-server t-sql sql-server-2016

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