Questions tagged «sql-server»

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


1
XML索引的性能非常奇怪
我的问题基于此:https : //stackoverflow.com/q/35575990/5089204 为了给出答案,我做了以下测试场景。 测试场景 首先,我创建一个测试表并用100.000行填充它。一个随机数(0到1000)应导致每个随机数约100行。此数字放入varchar列中,并作为XML中的值。 然后,我像OP那样进行呼叫,需要使用.exist()和.nodes()进行第二次调用,但是第二步的优势不大,但是两者都需要5到6秒钟。实际上,我进行了两次调用:第二次以交换顺序进行,搜索参数略有变化,并使用“ // item”而不是完整路径,以避免通过缓存的结果或计划产生误报。 然后创建一个XML索引并执行相同的调用 现在-真正让我惊讶的是!- .nodes具有完整路径的速度比以前(9秒)要慢得多,但是.exist()降低到半秒,而具有完整路径的时间甚至可以降低到约0.10秒。(同时.nodes()具有短的路径比较好,但仍远远落后于.exist()) 问题: 我自己的测试简而言之:XML索引会极大地破坏数据库。它们可以极大地加快处理速度(例如,编辑2),但也会降低查询速度。我想了解它们的工作原理...什么时候应该创建XML索引?为什么.nodes()有了索引会比没有索引更糟糕?如何避免负面影响? CREATE TABLE #testTbl(ID INT IDENTITY PRIMARY KEY, SomeData VARCHAR(100),XmlColumn XML); GO DECLARE @RndNumber VARCHAR(100)=(SELECT CAST(CAST(RAND()*1000 AS INT) AS VARCHAR(100))); INSERT INTO #testTbl VALUES('Data_' + @RndNumber, '<error application="application" host="host" type="exception" message="message" > <serverVariables> <item name="name1"> <value string="text" …

1
DBA从事新工作的第一天-检查备份和安全性-如何?还有什么要检查的?
通常,当我在新环境中启动时,我倾向于检查备份在哪里,何时进行了最后一次完全备份,何时应用了最后一次还原,还检查了安全性。 我这样做的方法是通过T-SQL。 检查备份 ;with Radhe as ( SELECT @@Servername as [Server_Name], B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(), MAX(Backup_finish_date)))), 'NEVER') as DaysSinceLastBackup, ISNULL(Convert(char(11), MAX(backup_finish_date), 113)+ ' ' + CONVERT(VARCHAR(8),MAX(backup_finish_date),108), 'NEVER') as LastBackupDate ,BackupSize_GB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00/1024.00 AS NUMERIC(18,2)) ,BackupSize_MB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00 AS NUMERIC(18,2)) ,media_set_id = MAX(A.media_set_id) ,[AVG Backup Duration]= AVG(CAST(DATEDIFF(s, A.backup_start_date, A.backup_finish_date) AS int)) ,[Longest Backup Duration]= …

2
哪一种效率更高:从链接服务器中选择还是插入到链接服务器中?
假设我必须将数据从一台服务器导出到另一台(通过链接的服务器)。哪种说法会更有效? 在源服务器中执行: INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData() 或在目标服务器中执行: INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()') 哪一个会更快并且总共消耗更少的资源管理器(源服务器和目标服务器)?两台服务器都是SQL Server 2005。

2
在哪里可以找到学习数据库的调优练习?
作为开发人员,DBA通常负责在数据库级别解决性能问题,因此我们在诊断,调整,重构查询等方面经验不足。 我正在寻找一个包含一堆表,数据,查询,触发器,SP等的数据库,其中存在故意的性能问题,希望有一系列练习可以尝试识别和解决这些问题。理想情况下,它将在MS SQL服务器上。 有人知道这种事吗?

1
如何在SQL Server中附加数据库?
有关在SQL Server中附加数据库的一些常见问题: 附加或分离数据库是什么意思? 如何分离数据库? 如何附加数据库? 附加并重建日志是什么意思? 如何在SQL Server Express中做到这一点? 我什么时候可以考虑拆装? 有任何风险或警告吗? 在SQL Server的版本之间附加附件该怎么办?(企业标准?2000到2008?2012到2008?)
32 sql-server 



5
在SQL Server中处理并发访问键表而没有死锁
我有一个表,该表被旧版应用程序用来替代IDENTITY其他各种表中的字段。 表格中的每一行都存储了中LastID名为的字段的最后使用ID IDName。 有时,存储的proc会陷入死锁-我相信我已经构建了适当的错误处理程序;但是我很想知道这种方法是否像我认为的那样起作用,或者我是否在这里树错了树。 我相当确定应该有一种访问该表的方法,而没有任何死锁。 数据库本身配置为READ_COMMITTED_SNAPSHOT = 1。 首先,这是表格: CREATE TABLE [dbo].[tblIDs]( [IDListID] [int] NOT NULL CONSTRAINT PK_tblIDs PRIMARY KEY CLUSTERED IDENTITY(1,1) , [IDName] [nvarchar](255) NULL, [LastID] [int] NULL, ); 以及该IDName字段上的非聚集索引: CREATE NONCLUSTERED INDEX [IX_tblIDs_IDName] ON [dbo].[tblIDs] ( [IDName] ASC ) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF …

3
内联变量时,为什么SQL Server使用更好的执行计划?
我有一个要优化的SQL查询: DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962' SELECT Id, MIN(SomeTimestamp), MAX(SomeInt) FROM dbo.MyTable WHERE Id = @Id AND SomeBit = 1 GROUP BY Id MyTable 有两个索引: CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes ON dbo.MyTable (SomeTimestamp ASC) INCLUDE(Id, SomeInt) CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes ON dbo.MyTable (Id, SomeBit) INCLUDE (TotallyUnrelatedTimestamp) 当我完全按照上面的描述执行查询时,SQL Server将扫描第一个索引,从而导致189,703逻辑读取和2-3秒的持续时间。 当我内联@Id变量并再次执行查询时,SQL Server将查找第二个索引,从而导致仅104次逻辑读取和0.001秒的持续时间(基本上是即时的)。 我需要变量,但是我希望SQL使用好的计划。作为一个临时解决方案,我在查询上添加了索引提示,查询基本上是即时的。但是,我尽量避免使用索引提示。我通常假设如果查询优化器无法完成其工作,那么我可以做一些事情(或停止做些事情)来帮助它,而无需明确告诉它该做什么。 …

6
将SqlClient默认设置为ARITHABORT ON
首先,第一件事:我将MS SQL Server 2008与兼容级别为80的数据库一起使用,并使用.Net的数据库进行连接System.Data.SqlClient.SqlConnection。 出于性能原因,我创建了索引视图。结果,需要使用对视图中引用的表进行更新ARITHABORT ON。但是,探查器显示SqlClient正在与进行连接ARITHABORT OFF,因此对这些表的更新失败。 是否有使SqlClient使用的中央配置设置ARITHABORT ON?我能找到的最好的方法是在每次打开连接时手动执行该操作,但是更新现有代码库来执行此操作将是一项相当大的任务,因此我渴望找到一种更好的方法。


1
为什么执行语句的速度取决于网络连接?
看起来执行T-SQL的速度取决于网络连接到服务器的等待时间。我假设如果SQL Server没有什么要报告给客户端的信息,它将一直执行到完成为止,而测试则显示了另一个故事。 create procedure UselessLoop @I int as declare @D datetime = getdate() while @I > 0 set @I -= 1 print datediff(millisecond, @D, getdate()) exec UselessLoop 100000 Server Milliseconds local 53 nearby 63 faraway 660 exec UselessLoop 1000000 Server Milliseconds local 546 nearby 640 faraway 6183 使用SSMS在不同计算机上针对同一服务器执行测试。本地是从服务器执行的,附近是在同一个本地网络上,而遥远是从500公里外的另一个办公室(使用1千兆位光纤连接)执行的。 显然,SQL Server与客户端之间正在进行某种通信,直接取决于所执行语句的数量。 …
31 sql-server  t-sql 

8
从未知来源恢复备份的安全隐患?
场景:您已经获得了数据库备份,并被告知将其还原到服务器上(该服务器已经托管了其他数据库),但是没有提供有关备份内容或是否应该信任源的有用信息。 问题1:还原很可能是恶意的备份有哪些潜在影响? 问题2:如何保护服务器/其他数据库中的数据免受还原潜在恶意备份的影响?RESTORE VERIFYONLY似乎是一个很好的第一步。最终的答案可能是“将数据库还原到无法访问外部环境的沙箱VM中”,但让我们假设该选项不在桌面上。在这种情况下还应该做什么?

4
如何确定负责“字符串或二进制数据将被截断”的列。
我使用从远程Pg数据库写入SELECT的代码自动生成一些查询,并将其插入本地SQL Server数据库中。但是,其中之一正在生成此错误: [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]字符串或二进制数据将被截断。(SQL-22001)[状态为22001现在01000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]该语句已终止。(SQL-01000)在。\ insert.pl第106行。 我如何找出哪个列正在生成该错误并且缺少输入的长度?有没有办法不用蛮力猜测所有内容varchar?

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.