我正在尝试为我们计划的数据仓库升级编写数据仓库服务器的规范。
当我们在 VMWare 主机上运行虚拟服务器时,我们能够根据需要添加或删除资源。过去,我们根据需要逐步添加 RAM 和 CPU。随着我们需求的增加,我们已经游说获得更多资源。(主要是磁盘和 RAM)。
我们要求更多。他们给我们尽可能少。
然而,最近每当我们谈论资源时,我们都会因为没有首先正确指定机器而受到批评,现在我被告知开发主机已用完,没有更多可用的 RAM。
我们是一个小型的地方政府组织,拥有约 50 名 DW 的常规用户。在正常的日常使用中,它运行良好。我们获得了良好的 mdx 查询性能,并且我们的报告和仪表板速度很快。用户很高兴。
然而,我们的 ETL 过程整夜运行,当同时处理数据集市时,我们开始看到内存压力的迹象。昨晚 SSIS 因“内存不足错误”的警告而失败。
我们现有的 DW 服务器是 Win 2008 R2,带有 4 个 CPU 和 16Gb 的 RAM,运行 SQL 2012 Std。我将最大服务器内存设置为 12GB,为操作系统和服务等留出 4GB。我们现有的 DW 有 3 个数据集市/OLAP 多维数据集,我们正在开发另外 2 个。
+----------+----------+---------------+-----------+---------------+
| Datamart | Files GB | Fact (Rows) | Fact (Mb) | ETL & Process |
| OLAP cube| | | | Time (hours) |
+----------+----------+---------------+-----------+---------------+
| PBI | …
Run Code Online (Sandbox Code Playgroud) 我目前正在将我们的数据仓库从 SQL 2012 升级到 SQL 2016。我的旧数据仓库和新数据仓库并行运行。
我的 ETL 过程(由第 3 方在 SSIS 中开发的框架)在 2012 年成功运行了 2 年多,但在 2016 年失败。到目前为止,数据库和 ETL 过程是相同的。
两个服务器都是在 VMWare 上运行的虚拟机。旧服务器是带有 24Gb RAM 的 Win 2008。SQL 2012 标准版 最大内存设置为 16Gb。新服务器是带有 64Gb RAM 的 Win 2012。SQL 2016 开发。最大内存设置为 50Gb。新 DW 运行 v13.0.1601.5 RTM 开发者版(64 位)。
在运行我的 ETL 过程时,使用 SQL 合并到维度或事实表的加载步骤失败并显示以下错误。
全文:
描述:SQL Server 断言:文件:, line=951 Failed Assertion = 'IS_OFF (BUF_MINLOGGED, m_buf->bstat) || pageModifyType != PageModifyType_Contents || GetPagePtr()->IsTextPage()'。此错误可能与时间有关。如果重新运行语句后错误仍然存在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或重新启动服务器以确保内存中的数据结构未损坏。
按照建议,我运行了 DBCC 并且没有发现错误。我也重新启动了 SQL。然后我重新启动了 ETL 过程并得到了同样的错误。
我对此错误的搜索表明,这是SQL …
我们最近将我们的 ERP 系统从 IBM Universe 转换为 SQL Server。应用程序性能通常是可以接受的,但偶尔会降级到可怕的程度。
我们在具有 32 Gb RAM 的 VMWare 上的 Win Server 2012 和 SQL Server 2012 上运行数据库。SQL 最大内存设置为 27Gb。db 服务器仅托管此数据库,不执行任何其他功能。总数据库大小约为 110Gb。该应用程序有它自己的专用服务器。
供应商广泛使用 CLR 来移植代码(超过 36,000 个标量函数)。我了解单个 CLR 在应用程序 OLTP 上下文中运行正常,但由于逐行而不是基于设置的操作而尝试执行批量作业时,不能很好地扩展。很好……很酷……继续前进。
我运行了Brent Ozar 的脚本,该脚本将高可用内存确定为需要查看的内容,以及每个查询的大量执行计划。供应商建议向服务器添加更多 RAM,但这让我很恼火,因为应用程序似乎没有使用现在的内存。
我感兴趣的是 SQL 的整体性能和行为。我看到一系列症状表明某些事情不正确,但我无法确定。这就像服务器拒绝运行。它决心走。
粗略地说,在我看来,大约 10Gb 的内存被数据库用于缓存,大约 11GB 是免费的,大约 3.5Gb 用于计划缓存,其余的我无法解释。我对一些定义有点不确定,例如免费、保留、被盗等。它们是否重复计算?
活动监视器显示:
当我运行此查询时:
-- what's happening inside my buffer pool?
SELECT counter_name, instance_name, mb = cntr_value/1024.0
FROM sys.dm_os_performance_counters
WHERE (counter_name = …
Run Code Online (Sandbox Code Playgroud) performance sql-server memory sql-server-2012 sql-clr performance-tuning
我刚刚将我们的数据仓库升级到 SQL 2016。我在查询存储中看到了一些非常有趣的图表(我喜欢这个功能!)。下面是我见过的最奇怪的例子。同一查询的 22 个计划。
这让我开始考虑 ETL 过程的性能调优、临时表的优缺点以及如何影响执行计划行为。
我的 ETL 过程使用了许多存储过程,这些过程混合使用标准和临时 #tables 作为临时表。#tables 通常使用一次然后删除。有些只有几千行。有些是数百万。SSMS 建议缺少索引,但是在较小的表上,它们是否会产生足够的差异以值得添加它们?更好的统计数据就足够了吗?
我刚刚阅读了有关临时表统计信息的Brent Ozar 博客文章,以及 Paul White 关于存储过程中的临时表的文章
它说统计信息是在查询#table 时自动创建的,然后大概由优化器使用。
我的问题是:在#table 上创建索引是否有很多意义或好处。和/或:在查询中使用统计信息之前,是否值得显式更新统计信息作为存储过程中的一个步骤,因为它们只使用一次。
额外的步骤和开销是否值得?它会导致明显更好或不同的执行计划吗?
sql-server index-tuning temporary-tables sql-server-2016 query-store
我必须提供有关文件系统使用情况的报告。
我正在收集有关文件服务器使用情况的统计数据,具体到单个文件级别,以便我们可以查看谁在使用哪些文件/文件夹、他们使用了多少存储空间、他们拥有多少文件、创建时间和上次使用时间。
为此,我有 2 个 powershell 脚本。
第一个读取文件系统并捕获我想要的属性并将它们保存到文件中。
dir -rec G:\ | Select LastWriteTime, Directory, Name, Extension, Length, @{Name="Owner";Expression={get-acl $_.FullName| select Owner}} | export-csv FileInfo.csv
Run Code Online (Sandbox Code Playgroud)
第二个脚本读取 csv 文件并将数据插入表中。
一旦数据在 SQL 中,我可以解析文本并将其拆分为不同的列,然后生成各种报告并以不同的方式分析数据。我的方法有效,但很麻烦。
有没有更好的方法来收集 NTFS 信息并将其保存到 SQL Server 中?有哪些替代方案?情报局?
编辑:这一切可以组合在一起在一个过程中一起运行吗?
每次我尝试查看查询存储中缺少的索引详细信息时,都会收到以下错误:
文档框架(SQL 编辑器)
程序位置:在 Microsoft.SqlServer.Management.UI.VSIntegration.Editors.ShowPlan.ShowPlanControl.OnMissingIndexDetails(Object sender, EventArgs a) 在 System.ComponentModel.Design.MenuCommand.Invoke() 在 Microsoft.SqlServer.Management.UI.VSIntegration .Editors.ShowPlan.ShowPlanControl.Microsoft.VisualStudio.OLE.Interop.IOleCommandTarget.Exec(Guid&guidGroup, UInt32 nCmdId, UInt32 nCmdExcept, IntPtr vIn, IntPtr vOut)
有没有其他人遇到过这种情况?这是我可以修复的东西还是一个错误?
SSMS 版本 13.0.16106.4
这有点令人沮丧,因为我无法查看创建索引建议的结尾。
我刚刚调试了一个让我完全困惑的问题。
我们的开发数据仓库上的 ETL 转换流程在每天成功运行数月后刚刚失败。使用相同的表架构、索引和数据调用相同存储过程的相同 SSIS 作业在生产中工作正常。
此步骤通常需要不到 2 分钟。今天,在 4 小时后,工作尚未完成,但也没有失败。没有报告的错误。SQL 日志sp_who2
中没有任何内容,也没有显示任何阻塞。
该作业会截断临时表,然后插入大约 600,000 行数据。ETL 进程具有对该表的独占访问权。当我检查时,我只能看到等待CXPACKET
。
我已将故障追溯到唯一的聚集索引。
该表在标识列上有一个非聚集主键(见下文)
CREATE TABLE [dbo].[Transform_JobCosting_Transaction](
[ETL_TransformKey] [int] IDENTITY(1,1) NOT NULL,
[TransactionId] [varchar](255) NOT NULL,
[KeyType] [varchar](255) NOT NULL,
[FinancialYear] [varchar](255) NOT NULL,
[Job] [varchar](255) NOT NULL,
[Subjob] [varchar](255) NOT NULL,
[AnalysisCode] [varchar](255) NULL,
[etc] [varchar](255) NOT NULL,
[etc] [varchar](255) NOT NULL,
[etc] [varchar](255) NOT NULL
CONSTRAINT [PK_Transform_JobCosting_Transaction] PRIMARY KEY NONCLUSTERED
(
[ETL_TransformKey] ASC
)WITH (PAD_INDEX = …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它在 XML 字段中存储可选的站点信息。
示例表:
CREATE TABLE [dbo].[Sites](
[SiteID] [int] IDENTITY(1,1) NOT NULL,
[SiteName] [nvarchar](80) NULL,
[SiteInfo] [xml] NULL );
INSERT INTO [dbo].[Sites] ([SiteName]) VALUES ('TestSite1') ;
Run Code Online (Sandbox Code Playgroud)
如果没有应用属性,则 XML 字段为 NULL。如果这些属性中的任何一个确实适用,则应用程序会插入一个 XML 文档和相关节点。
一个有效的例子如下所示:
<SiteInfo>
<BoreID>ABC123</BoreID>
<ConsentCompliance>true</ConsentCompliance>
</SiteInfo>
Run Code Online (Sandbox Code Playgroud)
我需要从另一个系统迁移一些数据,所以我试图将数据插入到这个字段/XML 中。到目前为止,我的尝试导致了应用程序不喜欢的单例节点。
使用我在网上找到的一些示例,我尝试了以下操作:
update [dbo].[Sites]
SET [SiteInfo].modify('insert <Anothernode>ABC123</Anothernode> into (/SiteInfo)')
where Siteid = 1
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
消息 2226,级别 16,状态 1,第 1 行 XQuery [dbo.Sites.SiteInfo.modify()]:'insert' 的目标必须是单个节点,找到 'element(SiteInfo,xdt:untyped) *'
问题:
For example: <BoreID>ABC123</BoreID> vs a single side <BoreID=ABC123/>
我刚刚使用 SSRS 2016 将 2018 年 8 月版的 PowerBI 报表服务器安装到同一台 Win 2012 服务器上。我可以让它运行,但它与带有 URL 保留的 SSRS 发生冲突。
我已将它们配置为使用不同的虚拟目录和端口,但 SSRS 不断中断。
我错过了什么?
编辑:我的笔记本电脑上同时运行 SSRS 2017 和 PBIRS。两者都在端口 80 上,但具有不同的虚拟目录。
sql-server ×7
index-tuning ×1
insert ×1
memory ×1
performance ×1
powershell ×1
query-store ×1
sql-clr ×1
ssms ×1
ssrs-2016 ×1
xml ×1