Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
升序关键问题-品牌为“ Stationary”的前导列-SQL Server
我一直在研究数据库中运行缓慢的查询,并得出结论,这是一个经典的升序关键问题。由于几乎总是不断地插入新行,并且每隔30分钟就会运行一条用于从数据库中提取最新数据的SQL代码,因此每30分钟更新一次统计信息的第一种选择听起来像是在浪费资源。 因此,我研究了跟踪标志2389,它在原则上应该有帮助,但是这要求Leading列被标记为Ascending,并且当我使用Trace Flag 2388检查(PK)索引统计信息时,我发现该领先列实际上是品牌为固定-与同时更新其他表上的多个PK索引相同。 关于文具品牌的结果似乎没有太多指导,但是我确实发现KB2952101表示如果少于90%的插入物大于旧的最大值,它将被归类为文具。我们所有的插入内容都是新提交的内容,前导列是bigint IDENTITY列,因此100%的插入内容应大于先前的最大值。 所以我的问题是,当列显然是升序的时候,为什么要将该列打上固定的名称? 较早尝试解决某些日常运行的SQL(确实运行良好)的问题,导致设置了一项工作来每晚更新此表的统计信息。该更新不执行FULLSCAN,所以采样扫描有时可能会丢失新行,因此它并不总是以升序显示吗? 我唯一想到的可能会影响此的原因是,我们有一个后台运行的存档作业,删除了一定期限内的行。这会对品牌产生影响吗? 该服务器是SQL Server 2012 SP1。 更新:另一天,另一项统计信息更新-相同的固定品牌。自从之前的统计信息更新以来,已经有28049个新插入内容。每行都有插入时间的时间戳,因此如果我从timestamp <'20161102'的表中选择max(id),则会得到23313455类似地,如果我对今天的统计信息进行更新,则会得到23341504。 它们之间的区别是28049个新插入物,因此,如您所见,所有新插入物都被赋予了新的升序键(如预期的那样),这表明前导柱应被标记为升序而不是固定的。 在同一时期,我们的归档作业删除了213,629行(我们正在慢慢清除旧数据)。行数减少是否有可能为固定品牌做出贡献?我之前对此进行了测试,但看起来没有任何区别。 更新2:另一天,另一项统计信息更新,该列现在标记为升序!根据有关影响删除的理论,我检查了插入与删除相比更新的百分比,昨天有13%是插入,而前两天插入约占12%。我认为这没有任何决定性的意义。 有趣的是,相关表平均插入该主表中的每一行都会插入4行,并同时更新其统计信息,其IDENTITY PK列是否仍为Stationary !? 更新3:在周末,我们会获得更多插入。今天早上,领导小组回到了固定式。在上次统计信息更新中,我们有46840次插入,而只有34776次删除。 再次,有趣的是,我上面提到的相关表现在将其前导列标记为Ascending。没有文档可以解释这一点吗? 更新4:大约一周前,归档作业已经清除了积压的订单,因此我们一直在删除大约三分之二的要插入的行。这些统计数据在相关表中显示出混合的结果,其中一个显示固定,而两个显示上升,尽管它们均按相似的比例进行更新。

3
应该允许开发人员使用LocalDB还是“开发”实例?
就像之前在此处围绕“ 开发人员是否能够查询生产数据库? ” 这一问题的脉络一样,我想让您对另一个特别烦人的话题发表想法! 许多公司阻止开发人员在开发计算机上安装SQL Server Express等,而是促进使用集中式开发SQL Server。 具体而言,这样做是为了确保: 开发服务器和生产之间的补丁程序级别一致性 能够证明和验证上面的任何补丁 数据安全; 仅开发服务器上的数据用于开发 可恢复性;数据是可恢复的并且仍在备份 整理差异可能会在转移到生产中时引​​起问题 在我看来,所有这些论点都是特别无效的,也许是补丁的例外。但是,如果本地计算机上的数据库仅用于开发活动而不是测试,则当应用程序通过Test / UAT等进行生产时,将证明补丁是可行的。 排序规则似乎不是一个正当的理由,好像这是数据库的问题一样,无论如何在创建数据库时都应进行设置。据我所知,只有SharePoint和SCCM对此有问题;) 现在,假设它仅用于开发,并且数据库不会“移至”生产环境,唯一的移动是: 创建数据库的脚本正在生成以部署到生产环境 来自“生产”第三方系统的备份在适用于验证和开发的情况下被还原和截断 谁能看到任何问题吗?我想念什么吗? 我想最大的担忧之一是本地数据库实例过时的能力,但这就是软件管理问题,而不是DBA IMO。

3
计算总和(列)
我有这段代码,用于总结某个商品(itemid)的数量及其产品日期代码(proddte)。 select sum(qty), itemid, proddte from testtable where .... group by itemid, proddte 我想做的就是qty不计其数地求和itemid/proddte。我努力了: select sum(qty), itemid, proddte, sum(qty) over() as grandtotal from testtable where .... group by itemid, proddte 但是它说我也应该qty在group by条款中。如果这样做,结果将不会与预期结果相同。 它不一定需要表示为单独的列,每一行中的值都相同。只要我可以显示整体总数,任何表示形式都可以接受。
9 sql-server  sum 

1
索引列顺序的WHERE-JOIN-ORDER-(SELECT)规则是否错误?
我正在尝试将此(子)查询改进为更大查询的一部分: select SUM(isnull(IP.Q, 0)) as Q, IP.OPID from IP inner join I on I.ID = IP.IID where IP.Deleted=0 and (I.Status > 0 AND I.Status <= 19) group by IP.OPID Sentry Plan Explorer指出了由上面的查询执行的一些相对昂贵的表dbo。[I]键查找。 表dbo.I CREATE TABLE [dbo].[I] ( [ID] UNIQUEIDENTIFIER NOT NULL, [OID] UNIQUEIDENTIFIER NOT NULL, [] UNIQUEIDENTIFIER NOT NULL, [] …

1
通过删除运算符哈希匹配内部联接来提高查询性能
在尝试将以下问题的内容应用于我自己的情况时,我有点困惑,因为如果可能的话,如何摆脱运算符哈希匹配(内部联接)。 SQL Server查询性能-无需哈希匹配(内部联接) 我注意到了10%的成本,并且想知道是否可以降低它。请参阅下面的查询计划。 这项工作来自我今天必须调整的一个查询: SELECT c.AccountCode, MIN(d.CustomerSID) FROM Stage.Customer c INNER JOIN Dimensions.Customer d ON c.Email = d.Email OR ( c.HomePostCode = d.HomePostCode AND c.StrSurname = d.strSurname ) GROUP BY c.AccountCode 在添加这些索引之后: --------------------------------------------------------------------- -- Create the indexes --------------------------------------------------------------------- CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL ON Stage.Customer(HomePostCode ,strSurname) INCLUDE (AccountCode) --WHERE HASEMAIL …

2
如果复合索引包含主键,是否应该将其标记为唯一?
给定一些带有主键的表,例如: CREATE TABLE Customers ( CustomerID int NOT NULL PRIMARY KEY, FirstName nvarchar(50), LastName nvarchar(50), Address nvarchar(200), Email nvarchar(260) --... ) 我们在上有一个唯一的主键CustomerID。 传统上,我可能需要一些额外的覆盖索引。例如,通过CustomerID或快速查找用户Email: CREATE INDEX IX_Customers_CustomerIDEmail ON Customers ( CustomerID, Email ) 这些都是我数十年来创建的索引。 不一定要唯一,但实际上是 索引本身的存在是为了避免进行表扫描。它是覆盖索引,以帮助提高性能(该索引不存在作为强制执行唯一性的约束)。 今天,我想起了一些信息-SQL Server可以使用以下事实: 列具有外键约束 列具有唯一索引 约束是可信的 为了帮助它优化查询执行。实际上,根据《SQL Server索引设计指南》: 如果数据是唯一的并且您要强制执行唯一性,那么在相同的列组合上创建唯一索引而不是非唯一索引将为查询优化器提供附加信息,从而可以产生更有效的执行计划。在这种情况下,建议创建唯一索引(最好通过创建UNIQUE约束)。 鉴于我的多列索引包含主键,因此该复合索引实际上将是唯一的。这不是我特别需要SQL Server在每次插入或更新期间强制执行的约束;但是事实是该非聚集索引是唯一的。 将这个事实上的唯一索引标记为实际上唯一有什么好处吗? 在客户上创建唯一索引IX_Customers_CustomerIDEmail ( 客户ID, 电子邮件 …

4
按表格显示数据和磁盘使用明细
我有一个SQL Server 2008 R2数据库,已由多个已部署程序使用。 问题:是否有一种简单的方法来显示数据库中所有表的每个表占用多少空间,并区分逻辑空间和磁盘空间? 如果我使用SSMS(Management Studio),则显示的数据库存储属性为167 MB,其中“可用”为3 MB(大约正确的大小,但我担心可用的3 MB)-这是一个值得关注的限制吗,假设我知道我有足够的磁盘空间?) 我可以深入研究每个表格,但这需要永远做。 我知道我可以编写自己的查询并进行测试,但是我想知道是否已经有一种简便的方法(内置的?)。

1
I / O在数据库上冻结,并且I / O每天在数据库中恢复为完整备份并在日志中恢复
我想说的是,每天我都会在日志文件中收到该消息。 首先,I / O被冻结在数据库(DatabaseName)上,消息出现在日志中。消息就像 I / O被冻结在数据库(DatabaseName)上。不需要用户操作。但是,如果没有立即恢复I / O,则可以取消备份。 然后在Database(DatabaseName)上恢复I / O消息,如下所示 在数据库(DatabaseName)上恢复了I / O。无需用户操作。 最后,像这样的消息,备份成功完成了数据库 无需用户操作 它是我的生产审核数据库,并且具有软件环境,例如: Windows Server 2012 R2 SQL Server 2012 VMware Tools 我的生产数据库“ 恢复模型 ”是“ 完整 ”恢复模型。并且从SQL Server中的登录ID设置了维护计划备份。它对所有数据库都具有“ sysadmin ”特权。 备份已通过“维护计划”备份在特定的时间表进行设置,例如每天下午4.00。而且Always Backup会按计划的时间间隔成功完成。 为什么会在计划备份时间生成此类日志消息。这类消息是否会影响我的生产数据库性能。我的生产数据库中的(备份/还原)数据一致性中是否有问题。 任何建议将不胜感激。

1
为什么我们不能有多个级联路径?
您会看到有关多个级联路径的许多问题被问到。例如: /programming/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths /programming/6065501/multiple-cascade-delete-path-in-many-many-relationship-ef-4-1 /programming/27613117/introducing-foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths-s 然而,从我所看到和理解,这是完全确定要删除子记录很多,而不仅仅是一个的相关主记录的删除的状态。 虽然有一个问题是说SQL Server试图通过防止这种情况发生来确保安全,但我真的不明白,如果我们有多个级联路径,可能会出什么问题?它有什么问题可以使其变得安全? 我希望有人可以用简单明了的方式向我解释,最好使用示例说明在多个级联路径的情况下可能出问题的地方。

2
在分区少量数据时获得切合实际的查询计划
我们正在使用分区来减少由于锁定而导致的OLTP系统体验受阻的程度,该分区方案可根据客户ID将工作表分为100个分区。但是,在测试过程中,我们发现执行计划没有按照我们期望的方式选择。 该测试方案是一个具有300,000个联系记录的单个客户(每个联系人的数据被拆分为两个表),所有记录都位于一个分区中,并通过查询在该客户分区中查找500条特定的行。您可能希望像哈希匹配之类的东西会在计划的早期消除不必要的299,500,但是SQL Server似乎选择选择整个表的记录计数并将其平均分配给所有分区,然后再考虑如何它要处理的记录很多,这导致它选择了一个嵌套循环,并在此过程的后半段消除了不需要的记录。通常,此时间是针对非分区表的相同查询的9倍。 奇怪的是,在选择中添加一个选项(重新编译)给出了一个明智的计划,但是我不知为何会有所作为。这不是存储过程,在测试过程中,我们会在每次测试运行之前清除过程缓存。 当所涉及的表未分区时,即,由于估计的行数与实际的行数匹配,因此每次都选择一个适当的计划时,不会出现此行为 任何对此行为的见解将不胜感激。 模式设置: USE [Scratch] GO CREATE SCHEMA part GO CREATE PARTITION FUNCTION [ContactPartition](smallint) AS RANGE LEFT FOR VALUES (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, …

4
我需要为什么我们不应该在域控制器上安装SQL Server的原因
我是一家小型公司的系统管理员。现在,我们考虑为该公司推出Windows Server 2008 R2。我们计划实施Active Directory。我们还想将RDMS从SQL Server 2000升级到SQL Server 2014。 由于组织规模的原因,我们只能买一台服务器,因此我们计划在同一台计算机上同时实现AD和SQL Server 2014。但是,Microsoft建议不要在域控制器上安装SQL Server 2014。 我已经检查了原因,但是我不明白问题出在哪里,因此如果有人在下面回答我的问题,那真的很有帮助。 您不能在本地服务帐户下的域控制器上运行SQL Server服务。→如果我们在使用域用户帐户的域控制器上运行SQL Server,会发生什么情况? 在计算机上安装SQL Server之后,不能将计算机从域成员更改为域控制器。在将主机更改为域控制器之前,必须先卸载SQL Server。→我们计划在安装SQL Server 2014之前将服务器提升为域控制器,并且不打算将其降级为成员服务器,因为这是我们唯一的服务器。我们的计划错了吗? 在计算机上安装SQL Server之后,不能将计算机从域控制器更改为域成员。在将主机更改为域成员之前,必须先卸载SQL Server。→我们不打算取消升级为成员服务器,因为这是我们唯一的服务器。我们的计划错了吗? 如果群集节点是域控制器,则不支持SQL Server故障转移群集实例。→我们不打算安装故障转移群集,因此我们认为这不是问题。我们错了吗? SQL Server安装程序无法在只读域控制器上创建安全组或设置SQL Server服务帐户。在这种情况下,安装程序将失败。→因为我们只有一台服务器,所以它永远不会成为只读域控制器,因此我们认为这不是问题。我们错了吗? 实际上,我想如果清除(1),就可以在域控制器上安装SQL Server 2014。 感谢您阅读所有句子。我希望有人给我们答案。

4
监视SQL Server数据文件中的可用空间
我已手动将mdf / ndf文件调整为较大的大小,以避免在SQL Server数据库上进行自动增长操作。由于文件较大,因此磁盘分区上的可用空间非常小,系统管理员不断提醒我空间不足。 由于我调整了它们的大小,因此数据文件中有很多可用空间,但是从文件大小/磁盘可用空间来看,人们不会注意到它。 如何监视数据文件的实际使用百分比?我更喜欢使用perfmon计数器。我很担心,当文件真正用完空间时,SQL Server将无法分配足够的空间,并且将崩溃。

2
数据库何时脱机
我试图找到一种方法来弄清何时将几个sql数据库脱机。 我检查了日志,但找不到任何此类信息,而且没有启用默认跟踪。 我刚刚得到的信息是,以前有一个DBA使该任务脱机,但是没有电子邮件或书面通讯。 我们可以找到有关此信息吗? 请提出建议,谢谢!

3
SQL Server Management Studio 2014备份-设置属性设备错误
我最近将本地SQL Server升级到了版本2014,该版本还安装了SSMS2014。 使用SQL Server Management Studio 2014创建备份(本地和远程,服务器版本2008-2014)时,出现以下错误: 要完成此操作,请设置属性设备。 在下拉菜单中,我选择了“磁盘”,还选择了备份路径。该路径存在于服务器上,并且我对此路径具有完全权限。 如果我使用具有相同设置的旧SQL Server Management Studio 2012,则备份可以正常工作。 它也可以使用T-SQLBACKUP DATABASE SOMEDATABASE TO DISK = 'D:\SomeDir\SomeDataBase.bak' WITH COMPRESSION 因此,该问题必须与2014版管理工具有关。我在互联网上找到的唯一解决方案是由于缺少路径,对我而言并非如此。 有没有人遇到过和/或解决了这个问题? 编辑:添加了屏幕截图(德语界面) 翻译: -Vollständig: 完整-Datenträger:磁盘 媒体和安全选项不变。仅以Master数据库为例,其他每个数据库都发生过这种情况。 更新21.07.2015 该问题似乎与我在德语Windows上使用英语包和德语SQL Server 2014安装有关。如果Windows显示语言设置为德语,该问题将消失。如果Windows显示语言设置为英语,则该问题再次出现。 感谢您的所有贡献。

2
域管理员无法连接到SQL Server
我有Windows Server 2012 R2域控制器和数据库服务器(W2K12R2 / SQL Server 2012)。 作为允许的用户组,我已授予组“ domain-admins” sysadmin权限。 但是以某种方式,任何域管理员都无法连接到该SQL Server,但是当我直接将域管理员用户添加为允许用户时,它确实可以工作。活动目录确实起作用。RDP登录有效。我想念什么吗? 有人知道如何授予对整个“域管理员”组的访问权限吗? 错误消息是: 伺服器名称:SRV-DB 错误号:18456 施韦格勒:14 状态:1 代码行:65536 在事件日志中说(翻译): 检查具有基础结构故障的基于令牌的服务器访问时出错。 状态为“ 1”。我使用RDP作为域管理员登录到该数据库服务器。我必须以“以管理员身份运行”显式启动SSMS。然后,我可以访问“本地主机”。如果我不以管理员身份启动SSMS,则无法这样做。我认为在“域管理员”组中就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.