Questions tagged «sql-server-2012»

SQL Server 2012(主要版本11.00.xxxx)。还请标记sql-server。

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
计划缓存大小和保留内存
当运行包括实际执行计划在内的查询时,根运算符(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)

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 = …

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] …

3
为什么这个连接基数估计值这么大?
我遇到以下查询的基数估计过高: SELECT dm.PRIMARY_ID FROM ( SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID FROM X_DRIVING_TABLE dt LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID ) …

2
IDENTITY列中出现意外间隔
我正在尝试生成从1开始并以1递增的唯一采购订单号。我有一个使用以下脚本创建的PONumber表: CREATE TABLE [dbo].[PONumbers] ( [PONumberPK] [int] IDENTITY(1,1) NOT NULL, [NewPONo] [bit] NOT NULL, [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(), CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC) ); 使用此脚本创建的存储过程: CREATE PROCEDURE [dbo].[GetPONumber] AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1); SELECT SCOPE_IDENTITY() AS PONumber; END 在创建时,这可以正常工作。当存储过程运行时,它将以所需的编号开始,并以1递增。 奇怪的是,如果我关闭计算机或使其进入休眠状态,那么下一次该过程运行时,序列将增加近1000。 查看以下结果: 您会看到数字从8跃升至1002! …



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 …

2
限制SQL Server上的连接权限
我有一个使用“荣誉系统”安全性的应用程序要部署到生产中。也就是说,所有用户都使用SQL用户/密码凭据连接到数据库,并且该应用程序自行管理权限。对于连接对象包含嵌入式凭据并且可以自由复制的事实,后半部分并没有给我带来多少麻烦。我试图找到一种方法来将连接限制到一组更有限的客户端。我可以创建防火墙规则来限制IP。是否可以通过计算机帐户或域成员资格“预限定” SQL登录名的任何方法?

1
查询计划“基数估计”中的警告
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 上面的查询在查询计划中有一个警告。 <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> 为什么会有警告? 字段列表中的类型转换如何影响基数估计?

5
将表导出到文本文件的最快方法是什么
我将拥有一个SQL Server 2012数据库和一个包含300万行和50列的表。无人值守的后台.net进程(可能发出一些SQL或Powershell命令)将其导出到文本文件(每一行数据一行)的最快方法是什么?.net进程应知道何时完成导出或是否有任何错误。数据类型将为all int或nvarchar。 我假设使用ado.net来执行select *命令并遍历数据读取器并为每条记录写入文件的纯C#代码将很慢,而且我无法并行处理。 理想情况下,导出将导出到远程共享网络文件夹,而不是SQL Server计算机上的本地文件夹。SQL Server将是一个HA群集。SSIS是否更适合于此,不需要数据转换? .Net进程将在计算机A上运行,在计算机B上运行SQL Server,最终文件目标是网络共享。一种选择是SQL Server将文件直接写入网络共享。另一个选项是SQL Server写入计算机A,然后在写入文件时,.net进程将其复制到网络共享。我没有正式的SLA,但是希望30分钟-1小时的文件写入时间。

3
限制对某些列的更新。只允许存储过程更新这些列
我有一些敏感的价格列,希望仅通过存储过程进行更新。如果不使用用于更新价格的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都会失败。 我正在考虑使用触发器和令牌表来实现。我正在考虑的想法是有一个令牌表。存储过程将必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查令牌表中是否存在已更新行的令牌。如果找到,它将继续。如果找不到令牌,它将引发异常并使更新事务失败。 有没有一种更好/更好的方法来实施此限制?

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.