Questions tagged «sql-server»

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

1
多语句TVF与串联TVF性能
比较回文问题上的一些答案(仅限10k以上的用户,因为我删除了答案),结果令人困惑。 我提出了一个多语句,受模式约束的TVF,我认为它比运行标准功能要快。我也有一种印象,即多语句TVF将被“内联”,尽管在这一点上我是错的,如下所示。这个问题是关于这两种样式的TVF的性能差异。首先,您需要查看代码。 这是多语句TVF: IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL DROP FUNCTION dbo.IsPalindrome; GO CREATE FUNCTION dbo.IsPalindrome ( @Word NVARCHAR(500) ) RETURNS @t TABLE ( IsPalindrome BIT NOT NULL ) WITH SCHEMABINDING AS BEGIN DECLARE @IsPalindrome BIT; DECLARE @LeftChunk NVARCHAR(250); DECLARE @RightChunk NVARCHAR(250); DECLARE @StrLen INT; DECLARE @Pos INT; SET @RightChunk = …

2
列大小增加后,为什么创建索引需要花费更长的时间?
我们的供应商更改了整个数据库中几乎所有列的列宽。该数据库约为7TB,可容纳9000多个表。我们正在尝试在具有55亿行的表上创建索引。在供应商升级之前,我们可以在2小时内创建索引。现在需要几天。他们所做的是将任何varchar(xx)的大小增加到varchar(256)。因此,大多数列以前是varchar(18)或varchar(75)等。 无论如何,主键由6列组成,其总宽度为126个字符。现在,升级后,主键为1283个字符,这违反了SQL Server 900个字符的限制。整个表格的列宽从合并的varchar总数为1049到合并的varchar总数为4009。 数据没有增加,表没有比所有列宽增加之前占用更多的“空间”,但是创建像索引这样简单的内容的性能现在花费了不合理的时间。 谁能解释为什么当唯一要做的就是增加列的大小时,创建和索引需要花费那么多的时间吗? 我们尝试创建的索引是非聚集的,因为pk是聚集索引。经过几次尝试创建索引后,我们放弃了。我认为它运行了4到5天没有完成。 我在非生产环境中尝试了此操作,方法是拍摄文件系统快照,并将数据库安装在安静的服务器上。

2
当临时表使用查找和书签查找时,为什么表变量强制索引扫描?
我试图理解为什么使用表变量会阻止优化器使用索引查找,然后使用书签查找和索引扫描。 填充表格: CREATE TABLE dbo.Test ( RowKey INT NOT NULL PRIMARY KEY, SecondColumn CHAR(1) NOT NULL DEFAULT 'x', ForeignKey INT NOT NULL ) INSERT dbo.Test ( RowKey, ForeignKey ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)), ABS(CHECKSUM(NEWID()) % 10) FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 CREATE INDEX …

4
FOR XML无法序列化数据,因为它包含字符(0x0000)
我有一个大查询(如有必要,我将在此处发布),并且出现此错误: 消息6841,级别16,状态1,第1行 FOR XML无法序列化节点'NoName'的数据,因为它包含XML不允许的字符(0x0000)。要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,然后使用BINARY BASE64指令。 我使用的唯一部分FOR XML是在这里: WHERE (CodFuncionario = Results.CodFuncionario) FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia] 但是,什么是node noname?以及如何寻找该值:(0x0000) 这是子查询之一(我只有FOR XML): SELECT [CodFuncionario], STUFF ( ( SELECT ' / ' + CAST ( [DescFuncao] + '-' + [DescTempoExperiencia] AS VARCHAR(MAX) )... FROM [Linked_Server].db.dbo.tblFuncionarioExperiencia T0 INNER …

7
将每日时间表分组为[开始日期;结束日期]与星期几的间隔
我需要在两个系统之间转换数据。 First系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能会有各种差异(周末,公共假期和较长的停顿时间,日程表中可能不包括一周中的某些天)。根本没有差距,甚至可以包括周末。日程安排可能长达2年。通常是几个星期。 这是一个跨越两周(不包括周末)的时间表的简单示例(以下脚本中有更复杂的示例): +----+------------+------------+---------+--------+ | ID | ContractID | dt | dowChar | dowInt | +----+------------+------------+---------+--------+ | 10 | 1 | 2016-05-02 | Mon | 2 | | 11 | 1 | 2016-05-03 | Tue | 3 | | 12 | 1 | 2016-05-04 | Wed | 4 | | …

2
如何衡量或找到创建查询计划的成本?
我有一个典型的情况,参数嗅探会导致“不良”执行计划进入计划缓存,从而导致存储过程的后续执行非常缓慢。我可以使用局部变量OPTIMIZE FOR ... UNKNOWN和来“解决”此问题OPTION(RECOMPILE)。但是,我也可以深入查询并尝试对其进行优化。 我正在尝试确定是否应该:在有限的时间内解决问题,我想知道不这样做的代价。如我所见,如果我坚持使用OPTION(RECOMPILE),最终结果是每次运行查询时都会重新创建查询计划。所以,我想我需要知道: 如何找出创建查询计划的成本是多少? 为了回答我自己的问题,我已经使用Googled进行了查询(例如,使用该查询),并浏览了dm_exec_query_statsDMV列的文档 。我还检查了SSMS中的“实际查询计划”的输出窗口以查找此信息。最后,我已经搜查DBA.SE。这些都没有一个答案。 谁能告诉我?是否可以找到或衡量计划创建所需的时间?

2
分页性能,可自定义排序数百万行
在我们的应用程序中,我们有一个网格,用户可以在该网格上翻阅大量记录(10-20百万)。网格支持在多列(20+)中以升序和降序排序。许多值也不是唯一的,因此该应用程序还按ID进行平局,以确保行始终出现在同一页面上。例如,如果用户要按小部件大小排序(从最大的开始),则应用程序将生成一个查询,看起来像这样: SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC 该查询需要大约15秒的时间来运行(使用缓存的数据),主要的花费似乎是根据widgetSize对130万行进行排序。为了调优该查询,我发现如果我添加一个WHERE仅限于最大的widgetSizes(在上面的查询中注释)的子句,查询仅需约800ms(所有前50,000个结果中的widget大小均大于100) 。 为什么没有WHERE子句的查询这么慢?我检查了widgetSize列上的统计信息,它们显示前739行的WidgetSize>506。由于仅需要30行,因此SQL Server不能使用此信息来推断它仅需要对具有窗口小部件大小的行进行排序哪个大? 我知道我可以通过在上添加索引来使此特定查询的执行更快widgetSize和id,但是该索引仅在此特定情况下有用,并且在(例如)用户反转排序方向时变得毫无用处。该表包含许多其他列,每个索引都很大(〜200mb),因此我真的负担不起为每种可能的排序顺序添加索引。 有什么方法可以使这些查询查询执行而无需为每个可能的排序顺序添加索引?(用户可以按20列以上的任意列进行排序) 以下脚本创建上表,并用一些代表性数据填充该表。该表比实际表要窄得多,但是仍然显示了我所看到的性能。在我的PC上,使用where子句的查询大约需要200毫秒,而没有where停顿的查询大约需要800毫秒。 警告:运行此脚本后生成的数据库大小约为2Gb。 CREATE TABLE Test ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, widgetSize INT NOT …

3
集群列存储索引和外键
我正在使用索引对数据仓库进行性能优化。我对SQL Server 2014相当陌生,Microsoft描述了以下内容: “我们将群集列存储索引视为存储大型数据仓库事实表的标准,并期望在大多数数据仓库场景中使用该索引。由于群集列存储索引是可更新的,因此您的工作负载可以执行大量的插入,更新,和删除操作。” http://msdn.microsoft.com/en-us/library/gg492088.aspx 但是,如果您进一步阅读文档,则会发现存在以下限制和限制: “不能具有唯一性约束,主键约束或外键约束。” 这让我很困惑!出于各种原因(数据完整性,语义层可见的关系...),在数据仓库中具有外键是一种很好的做法(不是强制性的) 因此,Microsoft提倡针对数据仓库方案使用集群列存储索引。但是,它不能处理外键关系?! 我对此是否正确?您还建议其他哪些方法?过去,我在数据仓库场景中使用了非集群列存储索引,并为数据负载进行了删除和重建。但是,SQL Server 2014然后没有为数据仓库添加任何真正的新价值?

4
内存优化表-它们真的很难维护吗?
我正在研究从MS SQL 2012升级到2014的好处。SQL2014的最大卖点之一是内存优化表,该表显然使查询超快。 我发现在内存优化表上有一些限制,例如: 没有(max)大小字段 每行最大〜1KB 没有timestamp领域 没有计算列 无UNIQUE约束 这些都是令人讨厌的东西,但是如果我真的想解决这些问题以获得性能上的好处,我可以制定一个计划。 真正的缺点是您不能运行一条ALTER TABLE语句,并且每次将一个字段添加到索引列表中时,都必须经过这个严格INCLUDE的规定。此外,似乎必须将用户拒之于系统之外,以便对实时DB上的MO表进行任何模式更改。 我发现这完全是令人发指的,以至于我实际上无法相信Microsoft可以在此功能上投入这么多的开发资金,而使它的维护非常不切实际。这使我得出一个结论,就是我一定弄错了方向。我一定对内存优化表有误解,这使我相信维护它们的难度要比实际困难得多。 那么,我误会了什么?您是否使用过MO表?是否有某种秘密的开关或过程使它们易于使用和维护?

1
更改表格时,“无法创建大小为8074的行,该行大于允许的最大行大小为8060”
我正在尝试更改表中的列。现有表如下: CREATE TABLE [dbo].[table]( [id1] [int] NOT NULL, [id2] [int] NOT NULL, [id3] [int] NOT NULL, [name] [nvarchar](255) NOT NULL, [id4] [int] NOT NULL, [xmlData] [xml](CONTENT [dbo].[xml_schema]) NULL, [booleanData1] [bit] NOT NULL, [notes] [varchar](4096) NULL, [id5] [int] NULL, [booleanData2] [bit] NULL, [id6] [int] NULL, CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED ([id1] …


6
不要将事务用于存储过程
我有一个运行一些命令的存储过程。我不希望这些命令被包装在存储过程的事务中。如果第4条命令失败,我希望保留第1条,第2条和第3条而不回滚。 是否可以编写存储过程,使其不能全部作为一个大事务来执行?

3
将具有多个联接的SQL查询拆分为较小的联接有帮助吗?
我们需要每晚在SQL Server 2008 R2上进行一些报告。计算报告需要几个小时。为了缩短时间,我们预先计算了一张桌子。该表是基于JOINining 12个很大的表(数十亿行)创建的。 直到几天前cca才花费了4个小时来计算此聚合表。我们的DBA将此大联接分成3个较小的联接(每个联接4个表)。每次都将临时结果保存到一个临时表中,该表将在下一个联接中使用。 DBA增强的结果是,聚合表是在15分钟内计算出来的。我想知道这怎么可能。DBA告诉我,这是因为服务器必须处理的数据数量较少。换句话说,在大型原始联接中,与汇总较小的联接相比,服务器必须处理更多的数据。但是,我认为优化器将通过原始的大联接有效地完成此任务,自行拆分联接并仅发送下一个联接所需的列数。 他所做的另一件事是他在一个临时表上创建了一个索引。但是,我再一次认为优化器将在需要时创建适当的哈希表,从而更好地优化计算。 我曾与我们的DBA讨论过此事,但他本人不确定是什么原因导致了处理时间的缩短。他只是提到,他不会怪服务器,因为计算如此大的数据可能不堪重负,而且优化器可能很难预测最佳的执行计划...。我了解这一点,但是我想对原因进行更多定义。 因此,问题是: 有什么可能导致重大改进? 将大联接拆分为较小联接是标准程序吗? 如果有多个较小的联接,则服务器必须处理的数据量真的减少了吗? 这是原始查询: Insert Into FinalResult_Base SELECT TC.TestCampaignContainerId, TC.CategoryId As TestCampaignCategoryId, TC.Grade, TC.TestCampaignId, T.TestSetId ,TL.TestId ,TSK.CategoryId ,TT.[TestletId] ,TL.SectionNo ,TL.Difficulty ,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) ,TQ.[QuestionId] ,TS.StudentId ,TS.ClassId ,RA.SubjectId ,TQ.[QuestionPoints] ,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then …

1
依靠mdf和ldf文件的卷影卷备份是否安全?
我们正在寻找将mdf和ldf文件的基于VSS的备份替换为传统的SQL Server备份。作为数据库管理员,我对此有些抽搐,但是我找不到任何证据证明这行不通? 谁能建议我可以设置一个试验,以证明使用此策略在哪里我们会失去交易?[在长期运行中拔出电源线很好]。 我们正在寻找的系统创建mdf和ldf文件的初始快照,然后在更改之间进行复制。我无法想象会失败的情况。 希望您能帮助我说服老板,我们需要保留传统备份!
18 sql-server 

3
从客户端检查与SQL Server的连接的简便方法
为了进行故障排除,我希望能够检查客户端是否可以连接到SQL Server实例,而与可能无法连接到SQL Server的应用程序无关。 是否有一种简单的方法(即不必安装第三方软件)使用默认的Windows系统工具来执行此操作?也许使用脚本或网络应用程序?

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.