Questions tagged «sql-server»

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

2
SQL Server UniqueIdentifier / GUID内部表示
我的一个同事给我发了一个有趣的问题,我无法完全解释。 他运行了一些代码(包括在下面),并从中获得了一些意外的结果。 本质上,将UniqueIdentifier(从现在开始,我将其称为)类型Guid转换为binary(或varbinary)类型时,结果的前半部分的顺序是向后的,但后半部分的顺序不是。 我的第一个想法是,系统的字节序是原因,并且Guid保留了显示,但是binary不能保证形式。 显然,这是一个实现细节,但是我想知道是否对此有一个很好的解释。 码: declare @guid uniqueidentifier = '8A737954-CBEC-40CE-A534-2AFFB5A0E207'; declare @binary binary(16) = (select convert(binary(16), @guid)); select @guid as [GUID], @binary as [Binary]; 结果: GUID Binary 8A737954-CBEC-40CE-A534-2AFFB5A0E207 0x5479738AECCBCE40A5342AFFB5A0E207 如您所见,Guid(一直到40CE)的前半部分对于每个部分都向后存储。也就是说,的第一部分Guid向后,然后是第二部分,然后是第三部分,但是保留了这些部分的顺序。之后,最后两节将按照它们在中显示的确切顺序进行存储Guid。 谁能解释一下?(下面包括一个更大的测试集。) 码: declare @guid_to_binary table ( [id] int identity(1,1), [guid] uniqueidentifier, [binary_conversion] binary(16) ); declare @i int = 1; …


1
使用SQL Server 2016系统版本的时态表进行慢速变化维度的查询策略
当使用系统版本的时态表(SQL Server 2016中的新增功能)时,当此功能用于处理大型关系数据仓库中的维缓慢变化时,查询创作和性能含义是什么? 例如,假设我有一个Customer带有Postal Code列的100,000行维,一个Sales带有CustomerID外键列的数十亿行事实表。并假设我要查询“按客户的邮政编码进行的2014年销售总额”。简化的DDL就是这样(为了清楚起见,省略了许多列): CREATE TABLE Customer ( CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, PostalCode varchar(50) NOT NULL, SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON); …

1
为什么不重建页数小于1000的索引?
我使用Ola Hallengrens脚本进行索引维护。在此之前,我使用以下查询来查看哪些索引最分散: SELECT dbschemas.[name] as 'Schema', dbtables.[name] as 'Table', dbindexes.[name] as 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id …

2
INSERT语句中的行值表达式数量超过了允许的最大1000行值数量
一个INSERT INTO脚本编写如下。 INSERT INTO tableName (Column1, Column2,....) VALUES (value1, Value2,...), (value1, Value2,...),.... 以下是我们在插入语句上面进行解析时遇到的错误 消息10738,级别15,状态1,行1007 INSERT语句中行值表达式的数量超过了允许的最大1000行值。 我的简单问题是,我们可以更改1000个值的限制吗?



8
避免使用较大ID值的原因
我们正在开发一个尚不为用户所用的Web应用程序。我的老板注意到,即使表中只有不到100条记录,新创建的记录的ID也超过10000。她认为Web界面出于某种原因会创建比实际记录多100倍的临时记录(并删除它们),并且这可能导致我们在发布后的几个月内超出范围。 我不认为她对身份证通货膨胀的原因是正确的(可以回答这个问题的同事正在休假,所以我们不确定),但是我们假设她是。她说,她不想使用bigint列,并且希望我们停止自动递增ID列,并编写选择第一个“未使用”整数并将其用作ID的服务器端代码。 我是计算机科学专业的研究生,几乎没有实践经验,担任初级开发人员。她在管理我们组织的所有数据库以及设计大多数数据库方面具有多年的经验。我认为她在这种情况下是不正确的,bigint ID不用担心,而且模仿DBMS功能的味道像是反模式。但是我不相信我的判断。 支持和反对每个立场的理由是什么?如果我们使用bigint会发生什么不好的事情,以及重新发明轮子自动递增功能的危险是什么?有没有比任何一个都更好的第三种解决方案?她为什么要避免身份证面值膨胀的原因是什么?我也有兴趣了解实用的原因-也许bigint ID在理论上起作用,但在实践中引起头痛? 该应用程序不应处理大量数据。我怀疑在未来几年内是否会达到10,000条实际记录。 如果有什么不同,我们正在使用Microsoft SQL Server。该应用程序用C#编写,并使用Linq进行SQL。 更新资料 谢谢,我发现现有的答案和评论很有趣。但恐怕您误解了我的问题,因此它们包含了我想知道的内容。 我并不真正担心ID高的真正原因。如果我们自己找不到它,我可以问一个不同的问题。我感兴趣的是了解这种情况下的决策过程。为此,请假定应用程序每天将写入1000条记录,然后删除其中的9999条。我几乎可以肯定不是这种情况,但这就是我老板在提出要求时所坚信的。因此,在这些假设的情况下,使用bigint或编写自己的将分配ID的代码(以重新使用已删除记录的ID以确保没有间隙的方式)的利弊是什么? 出于实际原因,我强烈怀疑这是因为我们曾经编写了从另一个数据库导入数据的代码,作为可以在以后进行一定程度迁移的概念证明。我认为我的同事实际上在导入过程中创建了数千条记录,后来又删除了它们。我必须确认是否确实如此,但如果确实如此,则甚至无需采取任何措施。

2
我如何知道SQL Server实际使用了多少个Cores?
我有两台运行SQL Server的服务器。 服务器1:SQL Server 2008 R2 Express(4核) 服务器2:SQL Server 2012 Developer Edition(8核) 据我所知,SQL Server 2008 R2 Express应该仅使用一个内核。 SQL Server 2012 Developer版本应使用所有8个核心。 但是,如果我在SQL Server 2008 R2 Express上的SQL查询中运行以下命令,它将显示4个核心。 select scheduler_id, cpu_id, status, is_online from sys.dm_os_schedulers where status = 'VISIBLE ONLINE' 我是否使用正确的命令来衡量使用情况?

2
使用AlwaysOn可用性组时缩小事务日志
我们正在使用AlwaysOn Availability GroupSQL Server 2012的功能。每天在辅助数据库上进行常规的完整数据库备份和事务日志备份。 我在这里已经阅读了在主副本或辅助副本上执行事务日志备份的操作,会将这两个副本的事务日志标记为可重用。无论如何,事务日志备份的大小很大,可以使用收缩文件来减小它: 我已在本地还原数据库并执行收缩操作。日志文件大小减少到160 MB。 我的问题是我应该在哪个数据库上对事务日志文件(主,次或两者)执行收缩操作? 我猜过去几年没有备份日志文件,因此它是如此之大。执行中,DBCC SQLPERF (LOGSPACE)我可以看到仅使用0.06%了该文件-对于我而言,保留如此大的日志文件毫无意义。在[sys].[database_files]我检查其max_size设置为-1与growth对65536,所以我想,当它需要更多的空间,它会得到。无论如何,为了防止将来的增长,我可以将其缩小到例如5%。我试图找到一些确认,我认为这样做不是一个坏主意。 实际上,备份(在数据库和日志文件上)仅在辅助数据库上执行,因此对它们执行收缩文件会更容易,但是主日志文件的大小也会减少吗?

2
将VARCHAR转换为VARBINARY
我一直将昂贵的运行查询及其查询计划记录在一个表中,以使我们能够监视性能趋势并确定需要优化的领域。 但是,到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。 因此,我试图通过将QueryPlanHash和QueryPlan提取到另一个表来规范化现有数据。 CREATE TABLE QueryPlans ( QueryPlanHash VARBINARY(25), QueryPlan XML, CONSTRAINT PK_QueryPlans PRIMARY KEY ( QueryPlanHash ) ); 因为query_plan_hashin 的定义sys.dm_exec_query_stats是一个二进制字段(并且我将定期插入新数据),所以我VARBINARY在新表中使用了该数据类型。 但是,下面的插入失败... INSERT INTO QueryPlans ( QueryPlanHash, QueryPlan ) SELECT queryplanhash, queryplan FROM ( SELECT p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash, QueryPlan, ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum FROM …


5
如何在行之间递归查找90天过去的间隔
在我的C#家庭世界中,这是一项微不足道的任务,但是我还没有在SQL中实现它,而是希望解决基于集合的问题(没有游标)。结果集应来自这样的查询。 SELECT SomeId, MyDate, dbo.udfLastHitRecursive(param1, param2, MyDate) as 'Qualifying' FROM T 应该如何运作 我将这三个参数发送到UDF中。 UDF在内部使用参数从视图中获取相关的<= 90天的旧行。 UDF遍历“ MyDate”并返回1(如果应将其包括在总计计算中)。 如果不应该,则返回0。此处命名为“ qualifying”。 udf会做什么 按日期顺序列出行。计算行之间的天数。结果集中的第一行默认为Hit =1。如果差异最大为90,则-传递到下一行,直到间隔总和为90天(必须经过90天)。达到时,将Hit设置为1并将间隙重置为0代替从结果中删除行也将起作用。 |(column by udf, which not work yet) Date Calc_date MaxDiff | Qualifying 2014-01-01 11:00 2014-01-01 0 | 1 2014-01-03 10:00 2014-01-01 2 | 0 2014-01-04 09:30 2014-01-03 1 …

5
一次将多个数据库从C:移动到D:
我有带有323个数据库的SQL Server 2008 R2,在我的C:驱动器(快速SSD)上消耗了大约14 GB。 因为我想在C:驱动器上回收一些空间,所以我想将它们移动到D:驱动器上。 我已经找到此MSDN文章,但这似乎是仅移动一个数据库的过程。 是否有自动方式或脚本一次移动所有数据库?

5
完全备份和仅复制完全备份之间的区别
我在SQL Server中央线程中看到了完整备份会截断日志吗?完全备份不会截断日志: 否。完全备份或差异备份都不会截断事务日志。- 林恩佩蒂斯 否-一个完整的备份不会截断日志。- 乍得·克劳福德 那么完全备份和仅复制完全备份有什么区别? 对于日志备份,有仅复制备份,可以防止在不截断日志的情况下破坏日志链。那么什么是仅复制完整备份?

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.