Questions tagged «sql-server»

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


4
SSMS工具包替代品[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 有没有可以与SSMS Tools Pack 2012媲美的工具?许可(每台机器30美元,任何数量的机器100美元……为期3个月的许可)还有很多需要改进的地方,我不确定还有哪些其他选择可用。 例如,我真正想念的一件事是“保存您运行的每个查询”。进行修补和研究时,在运行查询时对不同版本的查询进行运行备份是非常宝贵的。或者,当我意识到我没有2个月前正在处理的查询的备份时。 澄清:SQL Server Management Studio没有官方的附加组件支持,但是那里有一些工具。SSMS Tools Pack是我非常喜欢的工具包(2005、2008版本),但是2012年的许可费用太高了。(我会支付合理的许可证费用,但这不是这里的问题。) 例如,我发现了SSMS Boost,它在SSMS中添加了一些很酷的功能,似乎值得。 SQL Server 2012还可以使用哪些其他加载项?我很想有一些东西可以像SSMS Tools Pack一样在按F5时保存查询,或者除了列出的两个工具之外还有其他东西?

1
为什么此派生表可以提高性能?
我有一个查询,需要一个json字符串作为参数。json是纬度,经度对的数组。输入示例如下。 declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; 它调用一个TVF,该TVF可以计算在1、3、5、10英里距离处某个地理位置周围的POI数量。 create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e)) ,count_10 = count(*) from dbo.point_of_interest where LatLong.STDistance(@geo) <= 1609.344e …

1
单行INSERT…SELECT比单独的SELECT慢得多
给定以下堆表,该堆表具有从1到400编号的400行: DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; 以及以下设置: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 以下SELECT语句将在6秒钟左右完成(demo,plan): DECLARE @n integer = 400; …

1
SQL Server何时会发出有关过多的内存授予的警告?
产生“过度拨款”执行计划警告的条件是什么? 查询内存授权检测到“ ExcessiveGrant”,这可能会影响可靠性。授予大小:初始5128 KB,最终5128 KB,已用16 KB。 短信服务 计划浏览器 Showplan XML <Warnings> <MemoryGrantWarning GrantWarningKind="Excessive Grant" RequestedMemory="5128" GrantedMemory="5128" MaxUsedMemory="16" /> </Warnings>

1
清除数据的最快方法是什么?
场景: 我们在订阅服务器上有两个表Tbl1&Tbl2。在Tbl1正在从出版商复制的Server A,它有两个触发器-插入和更新。触发器正在将数据插入并更新到中Tbl2。 现在,我们必须清除(大约9亿条记录)Tbl2中的总数超过1000+百万条记录。以下是一个月到一分钟的数据分布。 一个月-14986826行 一天-483446行 一小时-20143行 一分钟-335行 我在寻找什么 清除该数据的最快方法,不会产生任何生产问题,数据一致性,也可能不会造成停机。因此,我正在考虑按照以下步骤操作,但遇到了:( 脚步: BCP从现有表Tbl2中输出所需的数据(大约1亿条记录,大约需要30分钟)。 假设我从1Fab2018 10:00 PM开始进行活动,并在1Fab2018 10:30 PM结束了活动。到活动完成时,表Tbl2将获得变为增量的新记录。 在名称为Tbl3的数据库中创建一个新表 BCP将导出的数据导入到新创建的表Tbl3中(大约1亿条记录,可能需要大约30分钟) 停止复制作业 完成BCP输入后,请使用tsql脚本插入新的增量数据。 挑战是-如何处理增量“更新”语句? 开始复制 附加问题: 处理场景的最佳方法是什么?

2
“ SELECT TOP”效果问题
我有一个查询,使用select可以运行得更快,top 100而没有则要慢得多top 100。返回的记录数为0。能否解释查询计划中的差异或在解释差异的地方共享链接? 没有top文本的查询: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 以上查询计划(不含top): https://pastebin.com/cbtJpxFf IO和TIME统计信息(无top): SQL Server parse and compile time: CPU time = 0 …

7
在SQL Server中优化数值范围(间隔)搜索
此问题类似于优化IP范围搜索?但是那只限于SQL Server 2000。 假设我将1000万个范围临时存储在一个表中,该表的结构和填充如下。 CREATE TABLE MyTable ( Id INT IDENTITY PRIMARY KEY, RangeFrom INT NOT NULL, RangeTo INT NOT NULL, CHECK (RangeTo > RangeFrom), INDEX IX1 (RangeFrom,RangeTo), INDEX IX2 (RangeTo,RangeFrom) ); WITH RandomNumbers AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num FROM sys.all_objects o1, sys.all_objects o2, sys.all_objects o3, sys.all_objects o4) …

6
与简单地重建每个索引相比,ALTER INDEX ALL REBUILD是否使用具有简单恢复模型的事务日志空间更多?
由于事务日志空间不足,SQL Server 2012上的“ ALTER INDEX ALL REBUILD”操作失败。索引从未进行过重组或重建,因此几乎所有索引上的碎片都超过80%。 数据库使用简单的恢复模型。我假设在命令的“ ALL”形式执行的每个索引操作之后,在下一次重建索引之前将刷新事务日志数据。这是它的实际工作方式,还是索引重建记录为好像是单个事务的一部分? 换句话说,是否可以通过编写脚本来分别执行每个重建来减少事务日志的增长?还有其他要考虑的因素吗?
18 sql-server  index 

6
始终将单个整数列作为主键的不利之处是什么?
在我正在处理的一个Web应用程序中,所有的数据库操作都使用在Entity Framework ORM上定义的一些通用存储库来抽象。 但是,为了对通用存储库进行简单设计,所有涉及的表都必须定义一个唯一的整数(Int32在C#中,int在SQL中)。到目前为止,这始终是表格的PK以及IDENTITY。 外键被大量使用,它们引用这些整数列。它们是一致性和ORM生成导航属性所必需的。 应用程序层通常执行以下操作: 从表(*)加载初始数据 -SELECT * FROM table 更新 -UPDATE table SET Col1 = Val1 WHERE Id = IdVal 删除 -DELETE FROM table WHERE Id = IdVal 插入 -INSERT INTO table (cols) VALUES (...) 不太频繁的操作: 批量插入 - BULK INSERT ... into table所有数据加载后跟(*)(以检索生成的标识符) 批量删除 -这是正常的删除操作,但是从ORM的角度来看,这是“笨拙的”:DELETE FROM table where …

1
如何防止在列上创建统计信息?
我有一个表,该表的列不希望创建或更新统计信息。如果我强制查询优化器在主键上使用统计密度而不是在该列上使用统计直方图,则可以得到更好的联接基数估计。自动更新和自动创建统计信息处于数据库级别,我无法更改。 如果要建议防止统计信息创建的替代方法,请记住该表用于成千上万个不同查询所引用的视图中。我无法控制所运行的查询。 我最初的策略是使用NOCOMPUTE和SAMPLE 0 ROWS选项在该列上创建统计信息。我的印象是,SQL Server不会在已经具有统计对象的列上自动创建统计信息,但这在我们的dev和QA服务器上已经发生。 为创建了新的统计信息COL_GROUP。我的NORECOMPUTE统计信息没有更新。我不知道为什么创建统计信息,而且我无法通过运行查询来触发该统计信息。 有没有一种方法可以防止SQL Server在一个列上自动创建统计信息?我的表只有两列,因此防止在单个表上创建自动状态的解决方案也可以解决我的问题。 跟踪标记4139和2371会打开,以防产生影响。 如果您想使用表结构,请在下面添加它和示例数据: CREATE TABLE X_NO_COLUMN_STATS( [COL_USER] [varchar](256) NOT NULL, [COL_GROUP] [int] NOT NULL, CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED ( [COL_USER] ASC, [COL_GROUP] ASC )WITH (DATA_COMPRESSION = PAGE) ); -- prevent stats from being updated on COL_GROUP CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS …

2
为什么“时区”不确定?
SQL Server 2016 AT TIME ZONE似乎不确定。但是,我无法找到正式说明这一点的文档,也无法找到其背后的理由。 为什么AT TIME ZONE不确定? 显示非确定性的示例 执行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 返回以下错误: Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is …

4
为什么差异备份无法指定其基础?
这是我的第一篇DBA.SE帖子,如有任何错误,请通知我,谢谢! 我是一名新的DBA(不是IT专业人员,只是公司中没有其他人可以这样做),所以解释越基本,越好。我一直在阅读有关数据库备份策略的信息(或者,据我所知,它们称为“恢复策略”)。我了解完整,差异和事务日志备份的功能,但是我想知道为什么差异备份只能基于最新的完整备份。 如果差异备份是自上次完整备份以来发生的所有变化,那么为什么差异不能基于我选择的任何备份呢?更清楚地说,我要问的是在进行备份时(而不是在还原时)指定基准。我假设还原时,您将选择正确的基准和相应的差异来执行还原(不使用由基准B制成的差异从基准A还原)。 是什么原因阻止了此功能的实现?我认为一定有原因,我只是不知道那是什么。 注意:我知道不能指定基数,但是我的问题是为什么不指定?(我也对“为什么要这么做?”的讨论不感兴趣) 比喻 这是我了解差异备份的类比: 我有一个Excel文件,在单元格中有一些数据。 在第一天,我将复制此文件并将其存储在其他位置(“完整备份”)。 在第2天,我查看该文件并将其与在第1天创建的备份副本进行比较,并注意到所有已更改的单元以及它们的新值(“差异备份”)。我没有注意到对单元格所做的每一次更改,只是它的最终值是多少。如果单元格A1开始为“ Alfred”,更改为“ Betty”,“ Charlie”,然后更改为“ Dave”,那么我只会注意到“ A1现在是Dave”。 在第3天,我再次将当前文件与备份文件进行比较,并记下更改(另一个“差异备份”与第2天具有相同的基准)。同样,仅注意观察到的每个单元格的最终值,而不是整个一天中单元格的所有值。 在第4天,我再次比较并注意到更改。继续到单元格A1,现在它说“ Sarah”,即使一天中有其他10个名字,我只注意到“现在A1是Sarah”。 第5天,我的文件被弄乱了。因此,我看了第1天制作的备份副本,然后看了第4天记录的最终状态,然后将记录的更改应用于备份副本,现在我将文件“还原”到了第4天的状态。因此,我看一下在第1天进行的备份,看到在第4天单元格A1结束为“ Sarah”,并将备份单元格A1更改为“ Sarah”。 如果在第二天我又制作了文件的另一个备份副本(“完整”),那怎么办?为什么仍无法将第3或4天的文件与第1天制作的副本进行比较(读取,“进行差异备份”)?据我了解,SQL Server将要求我将(在进行另一次差异备份时)与第二天(如果已进行)进行的完整备份进行比较-没有其他选择。

1
计划缓存大小和保留内存
当运行包括实际执行计划在内的查询时,根运算符(SELECT)告诉我缓存计划大小为32KB。 该连接的查询sys.dm_exec_cached_plans和sys.dm_os_memory_objects,看问题的计划,称该值pages_in_bytes和max_pages_in_bytes为32768(32KB),它匹配缓存计划的大小。 我不明白的是sys.dm_exec_cached_plans.size_in_bytes49152(48KB)中的值代表什么。我已经在所有这些专栏中阅读了BOL,尤其是size_in_bytes这样说: “ 缓存对象消耗的字节数。 ” 我无法理解难题的最后一部分,以了解其真正含义。 我知道所有运算符(不是在谈论用于排序和散列的额外内存授予)都需要一定数量的固定内存来存储状态,进行计算等,这些内存与优化后的计划一起存储在缓存中,但是在哪里? 因此,我的问题是: 到底是size_in_bytes什么意思 为什么它的值比“缓存的计划大小”高? 为所有操作员/迭代器保留的固定内存量是哪里,是使用“缓存的计划大小”(在我的示例中为32Kb)还是其他任何地方? 我知道它们是具有不同功能的不同DMV,但它们是相关的。在编译(缓存)计划sys.dm_exec_cached_plans加入sys.dm_os_memory_objects在memory_object_address列。我在此处发布问题的原因是,我正在寻求帮助,了解如何解释DMV及其列。 如果size_in_bytes是缓存的计划大小,为什么SQL Server在实际执行计划中说另一个值? 新查询,新数字: 实际计划 缓存的计划大小16KB 编译内存96KB DMV: sys.dm_exec_cached_plans.size_in_bytes 24KB sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。 另外,请注意,此查询不需要任何其他内存授予即可进行排序和哈希操作。 Microsoft SQL Server 2012-11.0.5343.0(X64)

12
在SQL Server中仅将每个句子的每个单词的首字母大写
我只想将SQL列中每个句子的每个单词的首字母大写。 例如,如果句子是: 我喜欢电影 然后我需要输出: 我喜欢电影 查询: declare @a varchar(15) set @a = 'qWeRtY kEyBoArD' select @a as [Normal text], upper(@a) as [Uppercase text], lower(@a) as [Lowercase text], upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only] 在这里,我只在专栏中对上,下和大写第一个字母(这里我只输入了一个随机单词)。 这是我的结果: 有这样做的可能性吗? 不使用用户定义的功能就可以得到结果吗? 我需要输出 Qwerty Keyboard

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.