我最近一直在使用 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) 当我尝试打开视图的设计时,我收到此错误消息(您可以在下面看到)。它不会发生在表格中,只有在视图中并且只有当我尝试查看设计时才会发生,因此我能够从中检索数据,例如使用选择查询。因为我们将数据库移动到另一个虚拟服务器,所以我收到了这个错误。我在具有不同 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 方法) …
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 2016(开发人员版)并希望在我的服务器实例中创建数据库的副本。我做了一个简单的备份,然后通过再次右键单击数据库-> 任务-> 恢复来恢复。
通过更改数据库的名称,数据库确实在新创建的数据库中恢复。到现在为止还挺好。但是,我开始使用的原始数据库以及我从哪里开始恢复,会处于 (Restoring...) 状态,这是无法以正常方式更改的。
当然,我知道如何在不产生此问题的情况下以不同的方式恢复数据库,并且我的原始数据库再次运行,但我的问题是:
这是正常行为吗?我想我偶然发现了一个错误。
我对 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 代理中挂起。所以现在它为我创建了一个新表,并用数据填充它,但工作只是继续运行。
我们有内联函数,可以将数据收集到 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) 我发现以下查询显示设置了多少会话上下文变量:
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()——如果有的话。
在对微软网站进行广泛研究后,我没有发现任何相关内容。
提前致谢。
我有一个带有多个执行计划的查询,与第二个计划相比,授予一个计划的内存是巨大的
当嵌套循环联接的外部表具有将结果过滤为小输入的谓词时,会出现问题,但批处理排序似乎使用与整个外部表等效的基数估计值。这可能会导致感知到过多的内存授予,这在非常并发的服务器中可能会产生多种副作用,例如 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-
我的问题是
2个执行计划的原因是什么?
优化器正在使用顶部执行计划,我强迫它使用较低的计划,但过了一段时间它又回到顶部执行计划,有什么原因吗?
如何解决这个问题?这个问题导致应用程序崩溃(有很多RESOURCE_SEMAPHORE等待,应用程序变得无响应)?我应该使用提示:DISABLE_OPTIMIZED_NESTED_LOOP还是 Trace Flag 2340?
注意:我检查了 XML,两个计划都有 NestedLoops Optimized="false"
object_definition和sp_helptext都返回存储过程的源代码 - 但是如何object_definition像sp_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)
我正在尝试批量重新输入列。这意味着首先删除并重新创建它们所属的任何约束。
我发现这些约束引用的列
但我找不到计算列。
我已经研究过INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE,但它不包括计算列。
还有sys.computed_columnswhich 显示定义,但不以可搜索的方式列出列。
我还有其他地方可以看吗?如果 SQL Server 可以弄清楚依赖关系,我想我也可以。
sql-server ×10
sql-server-2016 ×10
metadata ×2
ssms ×2
columnstore ×1
dbatools ×1
dmv ×1
functions ×1
memory-grant ×1
optimization ×1
powershell ×1
restore ×1
scripting ×1
session ×1
smo ×1
t-sql ×1
view ×1
xml ×1