Questions tagged «sql-server»

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

3
使用XPath / XQuery连接同一XML元素的所有值
我有这样的XML值: <R> <I>A</I> <I>B</I> <I>C</I> ... </R> 我想连接所有I值并将它们作为单个字符串返回:ABC...。 现在我知道我可以切碎XML,将结果聚合为无节点XML,然后应用于.values('text()[1]', ...)结果: SELECT ( SELECT n.n.value('text()[1]', 'varchar(50)') AS [text()] FROM @MyXml.nodes('/R/I') AS n (n) FOR XML PATH (''), TYPE ).value('text()[1]', 'varchar(50)') ; 但是,我只想使用XPath / XQuery方法来做所有事情,就像这样: SELECT @MyXml. ? ( ? ); 有这种方法吗? 我正在朝这个方向寻找解决方案的原因是因为我的实际XML也包含其他元素,例如: <R> <I>A</I> <I>B</I> <I>C</I> ... <J>X</J> <J>Y</J> <J>Z</J> ... …

2
恒定扫描假脱机
我有一张几十行的桌子。简化的设置如下 CREATE TABLE #data ([Id] int, [Status] int); INSERT INTO #data VALUES (100, 1), (101, 2), (102, 3), (103, 2); 我有一个查询,可以将该表连接到一组表值构造的行(由变量和常量组成)上,例如 DECLARE @id1 int = 101, @id2 int = 105; SELECT COALESCE(p.[Code], 'X') AS [Code], COALESCE(d.[Status], 0) AS [Status] FROM (VALUES (@id1, 'A'), (@id2, 'B') ) p([Id], [Code]) FULL JOIN …

1
将溢出排序到tempdb,但估计的行等于实际的行
在最大内存设置为25GB的SQL Server 2016 SP2上,我们有一个查询,在一分钟内执行大约80次。该查询将大约4000页溢出到tempdb。这会在tempdb磁盘上导致大量IO。 当您查看查询计划(简化查询)时,您会看到估计的行数等于实际的行数,但仍然会发生溢出。因此,过时的统计信息不能成为问题的原因。 我做了一些测试,然后查询溢出到Tempdb: select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 但是,如果我选择其他列,则不会发生溢出: select startdate --datetime from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 因此,我尝试“扩大” id列的大小: select CONVERT(nvarchar(512),id) from SortProblem where [status] ='A' order by SequenceNumber asc …

2
为什么临时表比急切的线轴更有效地解决万圣节问题?
考虑以下查询,该查询仅在源表中的行尚未插入目标表中时才插入它们: INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK) SELECT maybe_new_rows.ID FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows WHERE NOT EXISTS ( SELECT 1 FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween WHERE maybe_new_rows.ID = halloween.ID ) OPTION (MAXDOP 1, QUERYTRACEON 7470); 一种可能的计划形状包括合并联接和渴望的线轴。热心的线轴操作员出席以解决万圣节问题: 在我的计算机上,以上代码在大约6900毫秒内执行。问题的底部包括创建表的Repro代码。如果我对性能不满意,则可以尝试加载要插入到临时表中的行,而不是依赖急切的假脱机。这是一种可能的实现: DROP TABLE IF EXISTS #CONSULTANT_RECOMMENDED_TEMP_TABLE; CREATE TABLE #CONSULTANT_RECOMMENDED_TEMP_TABLE ( ID BIGINT, PRIMARY KEY (ID) ); INSERT INTO #CONSULTANT_RECOMMENDED_TEMP_TABLE …

4
索引唯一性开销
我一直在与我的办公室中的各种开发人员就索引的成本以及唯一性是有利还是昂贵(可能两者都有)进行辩论。问题的症结在于我们的竞争资源。 背景 之前,我曾读过一篇讨论,其中指出Unique索引并不需要额外维护,因为Insert操作会隐式地检查索引是否适合B树,并且如果在非唯一索引中找到重复项,则会在其后附加一个唯一化符。键的结尾,否则直接插入。在此事件序列中,Unique索引没有附加成本。 我的同事通过说这Unique是在寻求B树中的新职位之后强制执行的第二项操作来抗衡此声明,因此,与非唯一索引相比,维护成本更高。 最糟糕的是,我看到了带有标识列(本质上是唯一的)的表,该列是表的集群键,但明确地表示为非唯一。最糟糕的是我对唯一性的痴迷,并且所有索引都被创建为唯一,并且当不可能定义与索引的显式唯一关系时,我将表的PK附加到索引的末尾以确保唯一性得到保证。 我经常参与开发团队的代码审查,并且我需要能够提供一些一般性的指导方针,以使他们可以遵循。是的,应该评估每个索引,但是当您有五台服务器,每台服务器都有数千个表,并且一个表上有多达二十个索引时,您需要能够应用一些简单的规则来确保一定水平的质量。 题 Insert与维护非唯一索引的成本相比,唯一性是否会在后端增加成本?其次,将表的主键附加到索引的末尾以确保唯一性有什么问题? 表定义示例 create table #test_index ( id int not null identity(1, 1), dt datetime not null default(current_timestamp), val varchar(100) not null, is_deleted bit not null default(0), primary key nonclustered(id desc), unique clustered(dt desc, id desc) ); create index [nonunique_nonclustered_example] on #test_index (is_deleted) include …

5
将许多可空整数1:1转换为二进制字符串的最快方法是什么?
我的部分工作量使用CLR函数,该函数实现了怪异的哈希算法来比较行以查看是否有任何列值已更改。CLR函数将二进制字符串作为输入,因此我需要一种快速的方法将行转换为二进制字符串。我希望在整个工作负载中散列大约100亿行,因此我希望这段代码尽可能快。 我有大约300个具有不同架构的表。出于这个问题的目的,请假设一个简单的表结构包含32个可为空的INT列。在此问题的底部,我提供了示例数据以及一种基准测试结果的方法。 如果所有列值都相同,则行必须转换为相同的二进制字符串。如果任何列值不同,则行必须转换为不同的二进制字符串。例如,以下简单的代码将不起作用: CAST(COL1 AS BINARY(4)) + CAST(COL2 AS BINARY(4)) + .. 它不能正确处理NULL。如果COL1第1行为COL2NULL,第2行为NULL,则两行都将转换为NULL字符串。我相信正确处理NULL是正确转换整个行的最难的部分。INT列的所有允许值都是可能的。 要优先考虑一些问题: 如果这很重要,那么在大多数情况下(90%+),列将不会为NULL。 我必须使用CLR。 我必须对这么多行进行哈希处理。我无法保留这些哈希值。 我相信由于CLR功能的存在,我无法使用批处理模式进行转换。 将32个可INT为空的列转换为BINARY(X)或VARBINARY(X)字符串的最快方法是什么? 样本数据和代码如下: -- create sample data DROP TABLE IF EXISTS dbo.TABLE_OF_32_INTS; CREATE TABLE dbo.TABLE_OF_32_INTS ( COL1 INT NULL, COL2 INT NULL, COL3 INT NULL, COL4 INT NULL, COL5 INT NULL, COL6 INT …

1
我的同事是如何得到自己的图式的?
我有一个存储过程: 检查表是否存在,如果存在,则将其删除。 再次创建该表 然后用大约30个查询填充该表。 当我(数据库所有者)运行此proc时,一切都按预期工作。当我的同事这样做时,他通过Active Directory中的角色对该数据库拥有DROP / CREATE权限,那么会出错。这让我感到困惑: 表的创建没有dbo在名称之前显式指定的架构。这样domain\cowork_id.table_name_here就创建了一个名为table的表。除了在他的个人模式中创建该表之外,他现在还在数据库上拥有该模式(在运行proc之前不存在)。 发生了什么?为什么SQL Server在dbo未指定用户架构的情况下而不是在用户架构中创建表?

1
作为SQL Server DBA,我需要了解有关崩溃/频谱漏洞的信息吗?
这个问题的答案是社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 如果您听不到,最近发现了一系列相关漏洞,这些漏洞实际上影响了过去十年中售出的所有处理器。您可以在InfoSec.SE上找到有关崩溃/幽灵漏洞的更多技术细节。 作为SQL Server DBA,我需要了解什么? 如果我们不与其他公司共享我们的SQL Server(或VM场),这仍然有风险吗? 这将仅仅是一个操作系统补丁吗?或者是否存在解决此漏洞所需的SQL Server修补程序/修补程序?将修补哪些SQL Server版本? 一些文章预计会对性能产生5-30%的影响,尤其是在高度虚拟化的环境中。是否有任何方法可以预测对SQL Server的性能影响?


2
SQL Server 2016 vs 2012插入性能
我在同一台服务器上有两个SQL Server实例: Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)标准版(64位) Microsoft SQL Server 2016(SP1-CU5)(KB4040714)-13.0.4451.0(X64)企业版(64位) 两个实例上的sp_configure结果相同(新的2016选项除外)。 我已经在同一磁盘文件夹上的两个实例上创建了新数据库。自动增长参数是相同的。 自动创建和自动更新统计信息选项已关闭。 然后,我对堆中的10000个插入进行了测试: set nocount on go create table dbo.TestInsert ( i int not null, s varchar(50) not null ) declare @d1 datetime, @d2 datetime, @i int set @d1 = getdate() set @i = 1 while @i <= 10000 …


4
为什么TSQL为POWER(2.,64。)返回错误的值?
select POWER(2.,64.)返回18446744073709552000而不是18446744073709551616。似乎只有16位精度(四舍五入为17位)。 即使将精度明确化,select power(cast(2 as numeric(38,0)),cast(64 as numeric(38,0)))它仍然会返回四舍五入的结果。 这样看来,以任意精度将其任意掉落是一个非常基本的操作。它只能正确计算出的最高值POWER(2.,56.),失败了POWER(2.,57.)。这里发生了什么? 真正可怕的是select 2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.;实际上返回了正确的值。非常简洁。

2
搜索FILESTREAM内部信息
在Microsoft SQL Server 2012上激活FILESTREAM功能后,SQL Server将在系统上创建“隐藏”共享。份额定义如下: Sharename FILESTREAM_SHARE Path \\?\GLOBALROOT\Device\RsFx0320\<localmachine>\FILESTREAM_SHARE Remark SQL Server FILESTREAM share Maximum users unlimited Users Caching Manual caching of documents Permissions NT-AUTHORITY\Authenticated Users, FULL 该名称是您最初在SQL Server配置管理器中配置FILESTREAM时提供的共享的名称。但是,这是为了什么呢? 至今 我从以下位置开始阅读了所有可用的FILESTREAM文档: 文件流(SQL Server) 启用和配置FILESTREAM 创建一个启用了FILESTREAM的数据库 创建用于存储FILESTREAM数据的表 ...以及所有相关的 FILESTREAM与其他SQL Server功能的兼容性 FILESTREAM DDL,函数,存储过程和视图 使用OpenSqlFilestream访问FILESTREAM数据 论文SQL Server 2008-SQL Server 2008中的文件流存储 以及FILESTREAM(OLTP)---设计关键任务OLTP解决方案的技术参考指南,其中引用了许多其他材料 ...但是没有提及份额,份额或用途。您输入名称,SQL Server将在后台创建共享。 …

3
SQL Server基数提示
有没有一种方法可以将基数估计“注入”到SQL Server优化器(任何版本)? 即类似于Oracle的基数提示。 我的动机是由文章“查询优化器到底有多好?”驱动的。[1],他们测试基数估计量对不良计划选择的影响。因此,如果我可以强制SQL Server为复杂的查询精确地“估计”基数就足够了。 [1] Leis,Viktor等。“查询优化器到底有多好?” VLDB基金会论文集9.3(2015):204-215。

4
检测NVARCHAR列中的任何值是否实际上是unicode
我继承了一些SQL Server数据库。SQL Server 2014 Standard的源数据库(我称为“ Q”)中有一张表(我称为“ G”),约有8670万行,宽41列,可将ETL转换为在SQL Server 2008 R2 Standard上具有相同表名的目标数据库(我称其为“ P”)。 即[Q]。[G] ---> [P]。[G] 编辑:3/20/2017:有人问源表是否是目标表的唯一源。是的,这是唯一的来源。就ETL而言,没有任何真正的变化发生。它实际上是源数据的1:1副本。因此,没有计划向此目标表添加其他源。 [Q]。[G]中的一半以上的列是VARCHAR(源表): 列中的13个是VARCHAR(80) 9列是VARCHAR(30) 列中的2个是VARCHAR(8)。 同样,[P]。[G]中的相同列是NVARCHAR(目标表),具有相同宽度的相同列数。(换句话说,长度相同,但为NVARCHAR)。 列中的13个是NVARCHAR(80) 9列是NVARCHAR(30) 列中的2个是NVARCHAR(8)。 这不是我的设计。 我想更改[P]。[G](目标)列数据类型,从NVARCHAR到VARCHAR。我想安全地做到这一点(不会因转换而丢失数据)。 如何查看目标表中每个NVARCHAR列中的数据值,以确认该列是否实际包含任何Unicode数据? 可以检查每个NVARCHAR列的每个值(循环吗?)并告诉我其中的任何值是否为Unicode的查询(DMVs?)是理想的解决方案,但欢迎使用其他方法。

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.