Questions tagged «sql-server»

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

1
为什么SQL Server不做复合列统计直方图?
SQL Server有一个叫做“多列统计”的东西,但这不是人们想的那样。 让我们看下面的示例表: CREATE TABLE BadStatistics ( IsArchived BIT NOT NULL, Id INT NOT NULL IDENTITY PRIMARY KEY, Mystery VARCHAR(200) NOT NULL ); CREATE NONCLUSTERED INDEX BadIndex ON BadStatistics (IsArchived, Mystery); 这样,将在我们拥有的两个索引上创建两个统计信息: BadIndex的统计信息: +--------------+----------------+-------------------------+ | All density | Average Length | Columns | +--------------+----------------+-------------------------+ | 0.5 | 1 | IsArchived …

3
寻找有关如何将100多个客户数据库中的数据集成到集中式报告数据库中的建议
我是一家小型SaaS公司(约50名员工)的SQL开发人员(不是DBA或架构师)。我的任务是弄清楚如何: 从我们100多个OLTP数据库中卸载运营报告 允许这些报告针对来自多个客户端数据库的数据运行 定位我们的公司以在将来提供更多基于分析的解决方案 我已经阅读了许多有关各种技术的文章,例如事务复制(特别是多对一/中央订户模型),SQL服务代理,日志传送,变更跟踪(CT)和变更数据捕获(CDC),我的理解是这仅适用于企业),我不确定最好采用哪种方法。 我希望一些具有集成专业知识的人可能会遇到与我们类似的设置,并且能够指出成功的道路或将我引向一些有帮助的资源。 由于成本限制,我们的解决方案必须在SQL Server Standard Edition中运行。另外,解决方案必须合理,才能在我们的小型组织内提供支持/维护。 基本配置: 目前,我们有100多个单独的客户端数据库,大多数部署在我们数据中心的SQL服务器上,但是有些部署在我们数据中心内的客户端服务器上,我们可以远程访问这些数据库。这些都是SQL Server 2008 R2数据库,但是我们计划很快升级到SQL 2016。 我们使用数据库项目和dacpacs来确保所有要集成的客户端数据库中的架构都是相同的。但是,由于我们不强制所有客户端同时升级到新版本,因此升级之间可能会存在一些架构差异。如果客户端A在软件版本1.0上并且客户端B在软件版本1.1上,则解决方案必须足够灵活,以免损坏。 当前,操作报告直接从每个客户端的OLTP数据库运行。如果我们不卸载应用程序,则会担心它会对应用程序性能产生影响。 高级要求: 我们的客户是医院无菌处理部门(SPD),他们需要有关其到目前为止所处理的内容,库存在何处等的最新报告。SPD每天(包括周末和节假日)的过程库存。由于这项工作的主要目的之一是更好地支持运营报告,因此我们希望数据尽可能接近实时,以继续满足客户的需求。 目前,我们在单独的数据库中有一些SPD,这些数据库实际上是同一医院系统的一部分。这些客户希望能够针对其系统中的所有SPD进行报告。 从战略上讲,我们希望能够轻松汇总所有客户的数据以支持我们的内部分析计划。我们的期望是,我们将能够使用收集到的运营数据作为数据集市/仓库的来源。 思念至今: 事务复制似乎将提供最“实时”的解决方案。我发现此响应特别有用,但我担心由于存在架构差异的可能性,因此对我们不起作用:SQL Server多对一复制 鉴于查询活动时日志无法还原,日志传送听起来并不理想。我要么将所有人踢出去,以便可以恢复日志,否则数据将变得过时。我不清楚该方法是否可用于集中多个数据库中的数据,因为每个出厂的日志仅适用于它来自的单个数据库。 使用SQL Service Broker,如果队列无法跟上要处理的消息数量,则延迟可能是不可预测的。 CT仅为每个表行标识一个版本。延迟时间取决于我们对每个数据库处理诸如SSIS包之类的东西以检索数据并将其插入中央存储库的速度。 我们是否需要考虑分别复制每个数据库,然后使用某种数据虚拟化技术来组合来自各种复制源的数据? 您愿意提供的任何建议或指示将不胜感激。

2
在SQL Server 2014上具有完全扫描的更新统计信息使用100%cpu,在2008 R2上为15%
为什么对于具有相同硬件功能的相同表,全扫描更新统计信息在SQL Server 2014上可能使用20%的CPU,而在SQL Server 2014上却使用100%的CPU? 我一直在寻找MAXDOP,其他选项,但实际上看不到任何脱颖而出的东西。我意识到可能存在可能导致这种情况的设置,但是两个数据库的设置都非常相似(例如,两个数据库的设置均为MAXDOP4,并且两个数据库都有多个内核)。两者都是企业版。 SQL Server 2014与SQL Server 2008 R2中是否有某些“不同之处”可以解释这一点?两台服务器的内存选项均为90%。对寻找什么有任何想法吗? 我每周在使用SQL Server 2008 R2 / SP3和SQL Server 2014 / SP2的两台服务器上以完整(100%)扫描运行更新统计信息,并且数据库具有相同的结构。在2008 R2服务器上,两个非常大的表的更新状态需要花费几个小时,这是我期望的,但是CPU始终保持在20%左右的利用率以下。但是,在2014年服务器上,CPU会在100%的时间内运行40分钟。这些表格在2014服务器上要小一些。我通过使用SQL Monitor分析菜单看到了这一点。 这是2014 SQL Server上Ola日志文件的输出,CPU从大约2:10到2:45达到100%: Date and time: 2017-06-24 02:10:20 Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN Outcome: Succeeded Duration: 00:07:48 Date and time: 2017-06-24 02:18:08 Date and …

3
format()是一个不确定的内置字符串函数…对吗?
在发布有关缺少此内容的文档的连接项目之前,有人会确认我在这里不是简单地缺少什么吗? 在文档页面上format列出为字符串函数的位置: “所有内置的字符串函数都是确定性的。” - 字符串函数(Transact-SQL) format在相关页面上也没有提及不确定性: 确定性和非确定性函数 格式(Transact-SQL) 但是,在尝试创建持久化的计算列时: create table t (date_col date); insert into t values (getdate()); alter table t add date_formatted_01 as format(date_col,'YYYY') persisted; 返回以下错误: 表't'中的计算列'date_formatted_01'无法保留,因为该列是不确定的。 该文件指出 如果未提供文化参数,则使用当前会话的语言。 但是添加文化观点并不会改变一切 这也失败了 alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted extrester演示:http://rextester.com/ZMS22966 dbfiddle.uk演示:http ://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
10 sql-server 

2
Tablock提示触发死锁
我使用最少的日志记录,通过两个并行运行的Execute SQL Tasks和以下形式的SQL将两个数据集插入到空堆表中。 INSERT INTO Table (TABLOCK) SELECT FROM ... 作业暂停后,其中一个SQL任务成为死锁受害者。下面是死锁图的XML输出。 有人可以解释幕后发生的事情吗? <resource-list> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process9609dc8" mode="Sch-S"/> <owner id="process9609dc8" mode="IX"/> </owner-list> <waiter-list> <waiter id="process5e13048" mode="X" requestType="convert"/> </waiter-list> </objectlock> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process5e13048" mode="Sch-S"/> …

1
SQL Server 2016中的表命名约定和策略管理问题
在SQL Server 2012中,我有一个策略设置为不允许表名中包含空格。但是,当我在SQL Server 2016中使用相同的策略时,出现错误。 这是条件的代码: DECLARE @condition_id INT EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'No Spaces', @description=N'No spaces in table names.', @facet=N'IMultipartNameFacet', @expression=N'<Operator> <TypeClass>Bool</TypeClass> <OpType>NOT_LIKE</OpType> <Count>2</Count> <Attribute> <TypeClass>String</TypeClass> <Name>Name</Name> </Attribute> <Constant> <TypeClass>String</TypeClass> <ObjType>System.String</ObjType> <Value>% %</Value> </Constant> </Operator>', @is_name_condition=4, @obj_name=N'% %', @condition_id=@condition_id OUTPUT SELECT @condition_id 这是该策略的代码: DECLARE @object_set_id INT EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'Table Names_ObjectSet', @facet=N'IMultipartNameFacet', …

2
大型删除查询似乎已冻结
我们在具有18亿行的数据库上运行了删除查询。此删除操作将删除12亿行。 事后看来,我们会一次将这个查询分解为100m,但是我们处于一个已运行24小时且日志文件位于2Tb的位置,这似乎是日志文件允许的最大大小。 数据库处于SIMPLE恢复模式。 是否有保存此查询的内容?还是只需要重启SQL Server看看会发生什么?数据库将无法使用吗?我们有什么办法可以尽可能彻底地消除这种情况?

1
仅选择超集
我有两个表(以及一个非聚集索引),可以使用以下命令创建: CREATE TABLE GroupTable ( GroupKey int NOT NULL PRIMARY KEY, RecordCount int NOT NULL, GroupScore float NOT NULL ); CREATE TABLE RecordTable ( RecordKey varchar(10) NOT NULL, GroupKey int NOT NULL, PRIMARY KEY(RecordKey, GroupKey) ); CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey); 从技术上讲,我的表略有不同,并且我要加入其他一些表,但这是适合我的情况的代理。 我想选择所有GroupKeys不是另一个子集的子集GroupKey。 对于给定的超集,我想获取其GroupScore所有子集(包括自身)的最大值。 在a GroupKey包含与RecordKeys另一个完全相同的情况下GroupKey(s),则仅GroupKeys会抓取其中一个(与哪个无关)。 任何GroupKey具有完全相同的RecordKeys另一个GroupKey(s)也会有相同的GroupScore。 不相关的GroupKeys也可以具有相同的分数。 …

1
SQL Server是否在查询中缓存计算的值?
每当我遇到这种类型的查询时,我总是想知道SQL Server如何解决它。如果我运行需要计算,然后使用该值在多个地方,例如在任何类型的查询select和order by,将SQL服务器计算了两遍,每行还是会被缓存?此外,这如何与用户定义函数一起使用? 例子: SELECT CompanyId, Count(*) FROM Sales ORDER BY Count(*) desc SELECT Geom.BufferWithTolerance(@radius, 0.01, 0).STEnvelope().STPointN(1).STX, Geom.BufferWithTolerance(@radius, 0.01, 0).STEnvelope().STPointN(1).STY FROM Table SELECT Id, udf.MyFunction(Id) FROM Table ORDER BY udf.MyFunction(Id) 有没有办法使它更高效,或者SQL Server足够聪明以为我处理它?
10 sql-server 

2
创建表时聚簇索引创建失败
运行以下脚本时出现错误; IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name') BEGIN CREATE TABLE Table_Name ( Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED , Field_Name_2 int NOT NULL , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED ) END 特别是聚集索引的创建会引发以下错误: 消息1018,级别15,状态1,第15行 'INDEX'附近的语法不正确。如果要将其用作表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参见SQL Server联机丛书。 这很奇怪,因为它适用于我们所有的服务器,但特定的质量检查服务器除外。我们已经解决的问题是在表创建语句之外创建聚簇索引,但是如果有人之前遇到过此问题,我将很感兴趣。

2
这些工具仍然有效吗?
我正在观看由Brent Ozar(https://youtu.be/U_Kle3gKaHc)进行的7年网络研讨会,当时听说有一些建议。 SQLDiag实用程序。 SQLNexus。 PAL工具。 数据库优化顾问/向导。 BPA(最佳做法分析器)。 SQL Server基于策略的管理。 是否仍然需要使用/考虑所有这些?还是有更新的替代它们?
10 sql-server  tools 

3
在缓冲区缓存中没有足够空间的情况下,SQL Server如何处理查询的数据?
我的问题是,SQL Server如何处理需要将比可用空间更多的数据拉入缓冲区缓存的查询?该查询将包含多个联接,因此结果集在磁盘上已经不存在该格式的结果,因此需要编译结果。但是即使在编译之后,它仍然需要比缓冲区高速缓存中可用空间更多的空间。 我举一个例子。假设您有一个SQL Server实例,总共有6GB的可用缓冲区高速缓存空间。我运行具有多个联接的查询,该联接读取7GB数据,SQL Server如何响应此请求?是否将数据临时存储在tempdb中?它会失败吗?它是否仅执行一次从磁盘读取数据并一次编译段的操作? 此外,如果我尝试返回7GB的总数据会发生什么,这是否会改变SQL Server的处理方式? 我已经知道解决此问题的几种方法,我很好奇SQL Server在按要求运行时如何在内部处理此请求。 另外,我确定此信息存在于某处,但我一直没有找到它。

3
在非持久计算列SQL Server上创建非聚集索引
我正在努力寻找有关SQL Server如何实际存储非持久计算列的任何文档。 请看以下示例: --SCHEMA CREATE TABLE dbo.Invoice ( InvoiceID INT IDENTITY(1, 1) PRIMARY KEY, CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID), InvoiceStatus NVARCHAR(50) NOT NULL, InvoiceStatusID AS CASE InvoiceStatus WHEN 'Sent' THEN 1 WHEN 'Complete' THEN 2 WHEN 'Received' THEN 3 END ) GO --INDEX CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice …

1
使用跨数据库证书时触发器中的权限
我使用跨数据库证书(如Erland Sommarskog所述)来控制对环境(SQL Server 2008 R2)中某个数据库的访问。 我已经在数据库A中存储了更新数据库B中表的存储过程。到目前为止,这一直适用于db A中的各种存储过程以及db B中的表。我正在尝试更新数据库B中的表,但是该表上有一个触发器。此触发器正在将附加数据插入db B中的另一个表中。 消息916,级别14,状态1,过程table_trigger,第11行在当前安全性上下文下,服务器主体“ sql \ login”无法访问数据库“ B”。 我尝试授予与证书绑定的数据库B用户的插入权限,以将其插入到该其他表中,但是它无法解决该错误。除了更改触发器以便使用之外,我还有其他选择WITH EXECUTE AS OWNER吗? 这是DDL复制问题: CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF CREATE DATABASE A; CREATE DATABASE B; USE A; CREATE TABLE dbo.SPtoUpdate ( ID INT , ILoveFishing VARCHAR(255) ); INSERT INTO dbo.SPtoUpdate ( ID …

3
使用MAXTRANSFERSIZE和CHECKSUM时,无法还原启用TDE的数据库
更新:@AmitBanerjee -Microsoft SQL Server产品组的高级程序经理,确认MS将调查此问题,因为它是缺陷。 有没有人遇到在启用TDE并使用MAXTRANSFERSIZE> 65536的情况下还原在SQL Server 2016上进行的备份的问题(对于我而言,我选择了65537,以便可以压缩TDE数据库)和CHECKSUM? 下面是一个副本: --- create database create database test_restore go -- create table create table test_kin (fname char(10)) go -- Enable TDE use master GO CREATE CERTIFICATE test_restore WITH SUBJECT = 'test_restore_cert' GO SELECT name, pvt_key_encryption_type_desc, * FROM sys.certificates WHERE name = 'test_restore' GO …

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.