标签: sql-server-2016

使用 SMO 收集读取路由信息在 SQL Server 2016 中不准确

我最近一直在使用 SMO 来检查一些属性,并且在尝试收集有关 SQL Server 2016 中的读取路由顺序的信息时遇到了一个问题。

在早期版本中,路由列表非常简单,列表将按顺序处理,但在 2016 年,他们引入了循环算法,允许您让多个辅助副本接受读取流量。

虽然此数据可通过 T-SQL 访问,但 SMO 似乎并未更新以反映这一点,这意味着您无法准确获取或设置配置,因为它仍然是一个简单的字符串集合。

是否有一些我遗漏的属性可以让我获得 SQL Server 2016 的准确数据?(下面的 C# 示例 SMO 调用)

它只是似乎无法访问的循环信息,它列出了读取路由列表中的所有副本,它似乎没有区分可能存在的各种副本组。

连接错误报告。 连接已死...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SmoTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter the servername");
            string connectServer = Console.ReadLine();
            Console.WriteLine("Enter the AG name");
            string agName = Console.ReadLine();

            Server srv = new Server();

            try
            {
                srv = new Server(connectServer);
                srv.ConnectionContext.StatementTimeout = …
Run Code Online (Sandbox Code Playgroud)

sql-server metadata smo availability-groups sql-server-2016

7
推荐指数
1
解决办法
207
查看次数

无法在 SSMS 中打开视图的设计

当我尝试打开视图的设计时,我收到此错误消息(您可以在下面看到)。它不会发生在表格中,只有在视图中并且只有当我尝试查看设计时才会发生,因此我能够从中检索数据,例如使用选择查询。因为我们将数据库移动到另一个虚拟服务器,所以我收到了这个错误。我在具有不同 Windows(7 和 10)和 SSMS(2008、2010、2012、2014)版本的不同计算机上进行了尝试。

在此处输入图片说明

标题:Microsoft SQL Server 管理工作室
------------------------------

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。(Microsoft.VisualStudio.OLE.Interop)

------------------------------
纽扣:

好的

====================================

当我点击详细信息时,我会看到以下信息:

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。(Microsoft.VisualStudio.OLE.Interop)

------------------------------
节目地点:

   在 Microsoft.VisualStudio.OLE.Interop.IOleCommandTarget.QueryStatus(Guid& pguidCmdGroup, UInt32 cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
   在 Microsoft.VisualStudio.Platform.WindowManagement.DocumentObjectSite.QueryStatus(Guid& pguidCmdGroup, UInt32 cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.QueryStatus(Guid& pguidCmdGroup, UInt32 cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
   在 Microsoft.Internal.VisualStudio.Shell.Interop.IVsTrackSelectionExPrivate.Register()
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.ConnectSelectionContext()
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.Activate()
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowManagerService.viewManager_ActiveViewChanged(Object sender, ActiveViewChangedEventArgs e)
   在 System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   在 Microsoft.VisualStudio.PlatformUI.ExtensionMethods.RaiseEvent[TEventArgs](EventHandler`1 eventHandler, Object source, TEventArgs args)
   在 Microsoft.VisualStudio.PlatformUI.Shell.ViewManager.SetActiveView(视图视图,ActivationType 类型)
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.ShowInternal(ShowFlags showFlags)
   在 Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.b__26()
   在 Microsoft.VisualStudio.ErrorHandler.CallWithCOMConvention(Func`1 方法) …

sql-server ssms view sql-server-2016

7
推荐指数
1
解决办法
5652
查看次数

BIT 列是否为 CCI 提供任何性能优势?

BIT列在聚集列存储索引中使用时是否提供任何性能优势?例如,我对在 CCI 中定义列BIT而不是 所获得的任何性能优势感兴趣BIGINT。我正在使用 SQL Server 2016。

我对 CCI 压缩的工作原理知之甚少,但根据我所阅读的内容和一些测试,似乎数据类型(仅限于存储整数的精确数字)在列存储压缩方面确实无关紧要. 例如,如果我将 10 个完整的行组插入到带有BIGINT列而不是BIT列的表中,我看不到压缩行组之间的大小差异。以下是一项测试的源数据:

DROP TABLE IF EXISTS dbo.CCI_BIT_TEST_SOURCE;

CREATE TABLE dbo.CCI_BIT_TEST_SOURCE (
    ID1 BIGINT NOT NULL,
    ID2 BIGINT NOT NULL,
    ID_BIT BIT NOT NULL,
    ID_BIGINT BIGINT NOT NULL,
    INDEX CCI__CCI_BIT_TEST_SOURCE CLUSTERED COLUMNSTORE
);

INSERT INTO dbo.CCI_BIT_TEST_SOURCE WITH (TABLOCK)
SELECT
  t.RN
, t.RN
, t.RN % 2
, t.RN % 2
FROM
(
    SELECT TOP (10485760) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) …
Run Code Online (Sandbox Code Playgroud)

sql-server columnstore sql-server-2016

7
推荐指数
1
解决办法
853
查看次数

使用 SSMS 进行数据库还原使源数据库处于还原状态

我正在使用 SQL Server 2016(开发人员版)并希望在我的服务器实例中创建数据库的副本。我做了一个简单的备份,然后通过再次右键单击数据库-> 任务-> 恢复来恢复。

通过更改数据库的名称,数据库确实在新创建的数据库中恢复。到现在为止还挺好。但是,我开始使用的原始数据库以及我从哪里开始恢复,会处于 (Restoring...) 状态,这是无法以正常方式更改的。

当然,我知道如何在不产生此问题的情况下以不同的方式恢复数据库,并且我的原始数据库再次运行,但我的问题是:

这是正常行为吗?我想我偶然发现了一个错误。

sql-server ssms restore sql-server-2016

7
推荐指数
1
解决办法
2706
查看次数

SQL 代理 PowerShell 任务永远不会完成

我对 PowerShell 很陌生,现在我找到了 dbatools.io,我想在其中运行 SQL 代理中的 PowerShell 任务,例如

$ExportPath = $env:TEMP + '\DriveSpace.csv'
$datatable = Import-Csv $ExportPath | Out-DbaDataTable
Write-DbaDataTable -SqlServer MyServer -Database Utils -InputObject  $datatable -Table dbo.FreeSpaceOnDiskDrive -AutoCreateTable
Run Code Online (Sandbox Code Playgroud)

它开始了,但它永远不会结束。我也尝试过执行此操作的任务:

Get-DbaDatabaseSpace -SqlServer MyServer -IncludeSystemDBs | Out-DbaDataTable | Write-DbaDataTable -SqlServer MyServer -database utils -Table dbo.DiskSpaceExample -AutoCreateTable
Run Code Online (Sandbox Code Playgroud)

同样的问题。它在 Windows PowerShell ISE 中运行正常,但只是在 SQL 代理中挂起。所以现在它为我创建了一个新表,并用数据填充它,但工作只是继续运行。

sql-server powershell sql-server-2016 dbatools

7
推荐指数
1
解决办法
4092
查看次数

为什么在 SQL Server 2016 上使用 XML 的函数编译时间长?

我们有内联函数,可以将数据收集到 XML 中,将派生的 XML 传递给其他函数,然后将其切碎并将其重组为字符串。

(你的“你不应该在 T-SQL 中做那种事情”是另一天的讨论。)

多年来,这在 2005 和 2008 R2 中一直运行良好。我们现在正在升级到 2016 SP1。使用这些函数在我们的生产服务器上运行不到一秒的查询现在在 2016 SP1 中运行得更快。那太好了,但是在 2016 SP1 上编译需要一个小时。严重地:

在此处输入图片说明

生产环境:

在此处输入图片说明

(它们都来自 SQL Sentry Plan Explorer。)

我们已经在 2008 (100) 和 2016 (130) 兼容性级别尝试了数据库(但我们还没有使用“传统基数估计”和“查询优化器修复”设置,目前这两个设置都为“关闭”)。我们尝试过使用QUERYTRACEON 9481,似乎没有效果。

同样,这与最终的计划无关,因为它们都在很短的时间内运行。这是制定计划所需的时间。

我们已经设法用一组简化的代码在一定程度上重现了这个问题。调用以下示例中的顶级函数的语句在 SQL Server 2016 (SP1-CU5) 上编译需要 30-60 秒,但在 SQL Server 2008 R2 (SP3) 上编译和运行只需不到 1 秒。

例子

/*

Create and populate table...

*/

CREATE TABLE TestXMLStuff (OrderID int, ProdLength int, ProdWidth int, ProdHeight int);
INSERT INTO TestXMLStuff (OrderID, ProdLength, ProdWidth, ProdHeight) …
Run Code Online (Sandbox Code Playgroud)

xml sql-server optimization functions sql-server-2016

7
推荐指数
1
解决办法
938
查看次数

查找设置了哪些 SESSION_CONTEXT 键值对

我发现以下查询显示设置了多少会话上下文变量:

SELECT cache_address
      ,name
      ,pages_kb
      ,pages_in_use_kb
      ,entries_count
      ,entries_in_use_count
FROM   sys.dm_os_memory_cache_counters
WHERE  TYPE = 'CACHESTORE_SESSION_CONTEXT';
Run Code Online (Sandbox Code Playgroud)

但现在我想知道设置了哪些键值对SESSION_CONTEXT()——如果有的话。

在对微软网站进行广泛研究后,我没有发现任何相关内容。

提前致谢。

sql-server session sql-server-2016

7
推荐指数
1
解决办法
1419
查看次数

大内存授予请求

我有一个带有多个执行计划的查询,与第二个计划相比,授予一个计划的内存是巨大的

在此处输入图片说明

在此处输入图片说明

基于这篇文章https://blogs.msdn.microsoft.com/sql_server_team/addressing-large-memory-grant-requests-from-optimized-nested-loops/

当嵌套循环联接的外部表具有将结果过滤为小输入的谓词时,会出现问题,但批处理排序似乎使用与整个外部表等效的基数估计值。这可能会导致感知到过多的内存授予,这在非常并发的服务器中可能会产生多种副作用,例如 OOM 条件、计划缓存驱逐的内存压力或意外的 RESOURCE_SEMAPHORE 等待。我们已经看到,匹配此模式的单个查询实际上可以在高端机器(1TB+ RAM)上获得几 GB 的授予内存。

到目前为止,一种选择是使用跟踪标志 2340 全局禁用此功能,如 KB 2801413 中所述。但是,在 SQL Server 2016 RC0 中,我们已更改行为以保持优化的优势,但现在最大授予限制基于在可用的内存授予空间上。这种改进也转化为更好的可扩展性,从某种意义上说,可以用更小的内存占用执行更多的查询。我们正在考虑将此行为反向移植到即将推出的已将此行为移植到 SQL Server 2014 Service Pack 2,并像往常一样为市场上的版本提供附加值。

这正是我所看到的,但是我使用的是 SQL Server 2016 Enterprise。

这些是执行计划

https://www.brentozar.com/pastetheplan/?id=SJ0mYAy0b

https://www.brentozar.com/pastetheplan/?id=BJzutC1R-

我的问题是

  1. 2个执行计划的原因是什么?

  2. 优化器正在使用顶部执行计划,我强迫它使用较低的计划,但过了一段时间它又回到顶部执行计划,有什么原因吗?

  3. 如何解决这个问题?这个问题导致应用程序崩溃(有很多RESOURCE_SEMAPHORE等待,应用程序变得无响应)?我应该使用提示:DISABLE_OPTIMIZED_NESTED_LOOP还是 Trace Flag 2340

    注意:我检查了 XML,两个计划都有 NestedLoops Optimized="false"

sql-server execution-plan sql-server-2016 memory-grant

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

如何格式化 OBJECT_DEFINITION 的输出,使其看起来与 sp_helptext 相同?

object_definitionsp_helptext都返回存储过程的源代码 - 但是如何object_definitionsp_helptext当前那样使用和获取包含换行符的源代码?

例如在下面的代码中,我创建了一个存储过程:

if OBJECT_ID('usp_radhe') is not null
   drop procedure usp_radhe
go
-- this procedure is just a test
-- it just returns a date in the past
-- how will I get its source code?
create procedure usp_radhe as 
begin
select dateadd(dd,-31,GETDATE()) 
end 
Run Code Online (Sandbox Code Playgroud)

使用sp_helptext我可以很好地查看源代码:

sp_helptext 'usp_radhe'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用object_definition我在一行中获得源代码,这对我不利:

select OBJECT_DEFINITION(object_id('usp_radhe'))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

sql-server metadata scripting sql-server-2016

7
推荐指数
3
解决办法
8156
查看次数

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

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

我发现这些约束引用的列

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

但我找不到计算列。

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

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

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

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

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