小编Yar*_*lav的帖子

在 SSMS 结果网格、对象资源管理器和其他窗口上使用深色主题

有几种方法可以在 SSMS 主编码窗口上使用深色主题,可以导入 vsettings 文件、应用在配置文件中禁用的深色主题或手动执行。但所有这些选项都不会影响网格结果、对象资源管理器和其他窗口。除了编码之外,这两个是我使用的主要方法。

我尝试了通常的Tools>Options>Environment>Fonts and Colors然后在组合框中选择Show settings for: the option Grid Results and using White for Item Foreground and Black for Item Background。保存,重新启动 SSMS 但只有文本是白色的,背景仍然是白色的。

关于正在发生的事情或如何做的任何想法?我找不到如何为对象资源管理器执行此操作。

SSMS 字体和颜色配置

ssms configuration

13
推荐指数
1
解决办法
2万
查看次数

N'?c' 使用 Latin1_General_CI_AS 排序规则认为 N'C' 的重复键

我有一个带有唯一键的表,其中包含一NVARCHAR(50)列(正确与否,但在那里)。因此,当尝试插入?cC(与插入顺序无关)时,由于整理问题,它会在第二次插入时中断。这是错误:

(受影响的 1 行)消息 2601,级别 14,状态 1,第 16 行无法在具有唯一索引“IX_TestT”的对象“dbo.testT”中插入重复的关键行。重复的键值为 (C)。

选择退货:

在此处输入图片说明

数据库默认排序规则是Latin1_General_CI_AS. 花了一些时间寻找如何解决它,而不会对现有结构进行太多更改,但找不到开始工作的方法。尝试了不同的排序规则和组合,一切都失败了。阅读(这里这里)关于字符扩展等,仍然卡住了。这是我用来复制问题的示例代码,请随时修改并推荐任何有助于解决此问题的内容。

CREATE TABLE testT (
    [Default_Collation]     [NVARCHAR] (50) COLLATE DATABASE_DEFAULT,
    [Latin1_General_CI_AS]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AS,
    [Latin1_General_CI_AI]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AI,
    [SQL_Collation]         [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS);
CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation])
ON [PRIMARY]
GO

INSERT INTO testT
SELECT  N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c'   --COLLATE Latin1_General_CI_AS

INSERT INTO testT
SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server collation t-sql sql-server-2014 unique-constraint

11
推荐指数
1
解决办法
297
查看次数

禁止为链接服务器推广分布式事务的安全隐患

我有一个链接服务器,我需要运行以下语句:

INSERT INTO...EXEC linkedserver.sp @parameter
Run Code Online (Sandbox Code Playgroud)

两台服务器都是 SQL Server 2008R2 SP1。一旦我运行它,我就会收到此错误:

消息 7391,级别 16,状态 2,第 6 行 由于链接服务器“MY.LINKED.SERVER”的 OLE DB 提供程序“SQLNCLI10”无法开始分布式事务,因此无法执行该操作。

搜索错误后,我看到很多建议运行:

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'
Run Code Online (Sandbox Code Playgroud)

我应该注意此操作是否有任何安全隐患?

其他选项是在主服务器上使用链接服务器对象的高级属性:

在此处输入图片说明

sql-server-2008-r2 linked-server distributed-transactions

8
推荐指数
1
解决办法
1万
查看次数

最新服务器上的性能较低

我们在生产中有几个数据库服务器,其中 4 个具有非常相似的硬件配置。Dell PowerEdge R620,唯一的区别是2个最新的(3个月前购买和配置的)有RAID控制器v710,256GB RAM和CPU是2个物理Xeon E5-2680 2.80GHz。旧的(大约 1 年前购买和配置)具有 RAID 控制器 v700、128GB RAM 并在 witl 2 物理 Xeon E5-2690 2.90GHz 上运行。BIOS 已更新,所有驱动程序均已更新至最新版本等。所有运行 SQL Server 2008R2 Enterprise (SP1) 的系统均已更新至最新 CU 和 Windows 2012R2 Standard。两者都在 200 GB SSD x5 RAID10 上运行。每个数据库只运行一个数据库,使用调用 SSIS 包的作业进行同步。我们的系统管理员运行了大量性能和压力测试,以确保我们没有任何硬件或网络配置错误或故障。正如预期的那样,最新的表现出更好的性能结果。到现在为止还挺好。

我们可以在 Kibana 的屏幕截图中看到我们遇到的问题。黄色和橙色是 2 台较新的服务器(桌子上有 6,7 台),低于所有其他服务器。很明显,这两个新服务器的响应时间较慢。不仅如此,这 2 台服务器的负载也比 2 台较旧的服务器少(浅蓝色和深蓝色线 - 桌子上的 4,5)。

在此处输入图片说明 有几个监视脚本收集有关性能计数器的信息。用DMV和第三方监控工具尽可能挖掘,我手头有很多信息。但是应该有(ofc)一些我在这里遗漏的东西,因为我找不到这个较慢的响应时间的答案。

2 台最新的服务器使用的 RAM 较少,但我想这是意料之中的,与其他较旧的服务器相比,因为它们的负载较低。

| Server Name| Mem_MB |    Mem_GB    | Server_RAM_GB | SQL_max_mem_GB| SQL_min_mem_GB |
|------------|--------|--------------|---------------|---------------|----------------|
|      4     |  41108 | 40.145263671 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008-r2 configuration performance-testing performance-tuning

8
推荐指数
1
解决办法
234
查看次数

重组聚集索引时从二级读取数据的问题

我们在 SQL Server 2014 SP2 CU5(3 个节点)中有一个 AOAG。有一个读取提交的快照隔离级别为ON的数据库。我们有一个压缩的大表。我们在这个表上的一些更大的查询是在辅助中执行的。

然后在主节点上有一个夜间作业来重新组织几个表上的索引。当它遇到上述表的聚集索引时,我们会收到以下错误:

访问数据库 'yyyy' 中的表 'xxxx' 中的版本化行时事务中止。未找到请求的版本化行,因为尝试创建版本的操作不允许可读的辅助访问。

在某些时候,大查询正在执行带有提示的读取READUNCOMMITTED。我认为这是这个错误的原因,所以我删除了它们。但是错误仍然存​​在。

有任何想法吗?

当前设置:

  • 02 次要处于同步模式
  • 03 次要异步模式

AOAG 电流设置

表详细信息

  • 行数:122.567.668
  • 总空间MB:18.460
  • 已用空间MB:18.238

定义:

CREATE TABLE [dbo].[big_table](
[ID] [int] NOT NULL IDENTITY(1, 1),
1 [int] NULL,
2 [datetime] NULL,
3 [int] NULL,
4 [int] NULL CONSTRAINT [DF_ccc_bUnits] DEFAULT ((0)),
5 [money] NULL,
6 [money] NULL,
7 [int] NULL,
8 [int] NULL CONSTRAINT [DF_ccc_MinDays] DEFAULT ((0)),
9 [int] NULL,
10 [int] NULL,
11 …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014 index-maintenance

7
推荐指数
1
解决办法
1691
查看次数

登陆成BI,但是数据库是个大WTF,怎么办?

也许重复,但我相信我的情况有点不同。从我在 SQL Server Central 上得到的这篇文章的答案之一,它也很方便,但不是完全相同的场景:继承数据库时要做的 9 件事

几周前开始了一份新工作。我应该担任 BI 分析师和 SQL 开发人员。但就在第一次任务中,大家注意到一般来说一切都需要很长时间才能执行。问第一天指导我的人,我的主管你可以说,他告诉我他们知道数据库是一团糟。问我是否可以看一看可以做些什么,得到了肯定的回答。

所以我开始深入研究,使用几个非常方便的脚本,例如:

正如他们告诉我的那样,我发现一团糟。例如,blitzindex 过程返回近 2000 行,其中包含大量重复索引、NC 索引,包括表中的所有列、大量堆表、非常宽的索引等等。至于备份,几个星期以来一直没有完成,询问它,IT 人员只是每晚将数据库复制到不同的服务器。几个数据库超过 100Gb,其他几个也接近这个大小。每张桌子的统计数据每天都会更新。在不太大的表(只有几百万行)上,有些报告需要一个多小时才能完成。等等。

作为测试,我花了几天时间调整几个大表以及使用它们的不同过程和查询。使用分析器准备基线。然后做了一些更改并再次运行测试查询。正如预期的那样,一个现在需要大约 8 分钟的报告在大约 1 分钟内运行,而其他几个查询现在也只用了不到一半的时间。所有这些更改都是在测试服务器上完成的,我们还有一个报告服务器和一个生产服务器。

考虑到我应该是一名 BI 和 sql 开发人员,在办公室拥有有限的新权限,而不是 DBA。为了应对这种情况,您还建议我采取哪些其他措施?有一个指定的 DBA,但似乎只是一个做一些 dba 任务的 sql 开发人员。有 DBA,但他们告诉我他大约在半年前离开了。我应该忘记这些问题吗?或者作为一个大量使用数据库的人,我必须指出问题并提出解决方案?有人遇到过同样的情况吗?

编辑

谢谢大家的评论和回答。我发这个问题已经一个月了。所以现在我可以指出更准确的问题。

我相信索引是主要问题之一,但完全禁止删除索引,至少目前是这样。即使存在具有多个相同索引的关键情况,例如在其中一个主表上,大约有 3000 万行并且还在增长,也有 3 个 NC 索引,其中包含 7 个索引列并包括所有列。我可以在非常严格的监督下创建索引,但仅此而已。

有几个禁用的索引,它们会影响 CRUD 操作的性能吗?

优步观点”综合症。在另一个视图中的另一个视图中有很多视图。关于这一点的一些建议?

许多 sp 在 SMSS …

performance index sql-server-2008 query-performance

6
推荐指数
1
解决办法
426
查看次数

在 DELETE 语句中使用 FROM 关键字

BOL 和许多其他来源指出:

FROM
是一个可选关键字,可以在 DELETE 关键字和目标 table_or_view_name 或 rowset_function_limited 之间使用。

我习惯写DELETE没有FROM. 我进行了一些搜索,但找不到FROM强制性的地方。任何人都可以指出应该强制执行的情况吗?还是总是可选的?

sql-server delete t-sql

6
推荐指数
1
解决办法
2890
查看次数

将 .Bak 文件还原到不同的服务器

我将一些数据库备份从一台服务器复制到另一台服务器(新实例不存在数据库)。我尝试使用以下命令进行恢复

Restore database dbname
from disk='g:\e2bak\dbname.bak'
with 
stats=10
Run Code Online (Sandbox Code Playgroud)

它因以下错误而失败

文件“G:\MSSQL$s73g\MDF\dbname.mdf”的目录查找失败,出现操作系统错误 3(系统找不到指定的路径。)消息 3156,级别 16,状态 3,第 1 行

服务器级别的默认数据库设置也是存储数据和登录

G:\MSSQL10_50.SG\MSSQL
Run Code Online (Sandbox Code Playgroud)

我可以通过指定移动选项来克服错误。但我的困惑是

1.Why database .bak file is looking for G:\MSSQL$s73g\MDF\dbname.mdf",this is the path
  of dbname database files in production from where we copied the .bak file

2.Also when I restored the database with move option and took a backup in same server,
  I was able to restore the Database with below command

Restore database dbname 
from disk='G:\e1ebk\dbname.bak'
with replace,stats=10
Run Code Online (Sandbox Code Playgroud)

你能帮我理解为什么 .Bak 文件位置指向某个其他目录(它甚至不存在于我们的服务器中,只存在于生产服务器上),以及在第二种情况下为什么这在没有移动选项的情况下有效。

sql-server backup

6
推荐指数
1
解决办法
2万
查看次数

使用日期优化 where 子句

我正在尝试优化几个在其中一个WHERE子句上都使用类似模式的查询:

AND (DATEADD(DAY
            , ISNULL(a.[due_days], 30) + 30
            , [dbo].[CalcDate]([type], date1, date2, date3, date4, NULL))
            ) < GETDATE()
Run Code Online (Sandbox Code Playgroud)

CalcDate基于type字段值的udf进行一些比较并返回一个日期。然后将天数添加到该日期并与当前日期进行比较。为了能够使用现有的索引,due_days我想转换操作以将所有转换应用到GETDATE(),假设我想sargable在可能的情况下实现它。另外,如果有一些关于可以做些什么来更好地改进 udf 的使用的建议。

optimization t-sql sql-server-2008-r2

5
推荐指数
1
解决办法
543
查看次数

触发数据库创建或附加操作

在我们的开发环境中,我们需要在创建或附加某些数据库时运行一系列操作。诸如清理一些表、重新播种其他表、更改电子邮件等操作。我试图使用 DDL 触发器,实际上在这里发现一个与我类似的问题。从该代码开始,我正在尝试稍微不同的操作,但甚至无法开始。

以下代码取自我提到的问题,我只是添加了一个条件来检查数据库名称,如果对应于我需要的名称,则执行一些操作。问题是没有在 IF BEGIN..END 中运行 SET 语句。最后一个 SELECT 使用fn_listextendedproperty不返回任何数据。

IF EXISTS (SELECT NULL FROM sys.server_triggers WHERE name = 'ddl_trig_database')
BEGIN
    DROP TRIGGER ddl_trig_database
    ON ALL SERVER;
END
GO

CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    DECLARE 
        @DatabaseName NVARCHAR(128)
        , @CreatedBy NVARCHAR(128)
        , @CreatedDate NVARCHAR(23)
        , @SQL NVARCHAR(4000);

    SELECT  @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(128)');

    IF @DatabaseName = N'asd'
    BEGIN
        SET @SQL = '
            USE ' + @DatabaseName + ';
            EXEC sys.sp_addextendedproperty @name = …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server ddl sql-server-2014

5
推荐指数
1
解决办法
3934
查看次数

SPID 和 session_id 之间的差异

我正在配置一个作业以获取违规进程的SPID并将其终止。我正在使用来自@AdamMachanic的伟大sp_Whoiscative和在登录名和 SPID 和session_id值上加入sysprocesses之间的混合,因为这些值应该是相同的(或者我错了,那是我的错误?)。

我得到了一些我不明白的东西:对于来自 sysprocesses的相同SPID,我从 whoisactive 结果中得到不同的 session_id值。这里有什么不正确?

这是我正在使用的代码。在当前日期时间之前 10 秒获取值的过滤器是因为 whoisactive 正在使用参数 @deltainterval 运行,每次运行需要大约 10 秒来执行。

USE master;

--  Log information about current running processes to table Log_WhoIsActive
    EXEC [master].[dbo].[sp_WhoIsActive]
        @get_full_inner_text = 1,
        @get_plans = 2,
        @get_outer_command = 1,
        @get_transaction_info = 1,
        @get_task_info = 2,
        @get_locks = 1,
        @get_avg_time = 1,
        @get_additional_info = 1,
        @delta_interval = 2,
        @sort_order = '[start_time] DESC',
        @destination_table = 'Log_WhoIsActive_tests';

--compare date from …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

3
推荐指数
1
解决办法
8473
查看次数

错误记录各种问题

我正在慢慢收集并尝试分析有关我们所有实例 (2008R2 SP1) 的大量信息。我现在正在查看错误日志,我有几个问题。有很多关于错误日志大小的内容,并发现了不同的建议,sp_cycle_errorlog例如每周循环使用日志,以避免出现非常大的错误日志并能够充分处理它们。所以...

  1. 当错误日志被认为是“大”的?我们的一些日志需要很长时间才能加载,接近一百万行。编辑:一个有 2 034 546 行
  2. 我试图找到一些 tsql 来获取错误日志大小,但找不到它,有可能做到吗?
  3. 我看到建议回收日志并配置不仅仅是默认数量 6。一些作者推荐 50,其他人 10。我想这取决于环境,但是有推荐的数量吗?

sql-server sql-server-2008-r2 error-log

2
推荐指数
1
解决办法
196
查看次数