标签: sql-server

如何确定索引是必需的还是必要的

我一直在我们的 MS SQL 数据库上运行一个自动索引工具(我修改了一个源自 Microsoft 的脚本,该脚本查看索引统计表 -自动自动索引)。从统计数据中,我现在有一个需要创建的索引的建议列表。

编辑: 上述索引从 DMV 获取信息,这些信息告诉您数据库引擎将用于索引的内容(如果它们可用),并且脚本采用 Top x 推荐(通过搜索、用户影响等)并将它们放在表中。

(上面的编辑部分摘自 Larry Coleman 的回答,以阐明脚本在做什么)

由于我是数据库管理员的新手,并且在网上进行了快速搜索,因此我不愿意冒险并盲目添加推荐的索引。但是,由于没有在该领域的经验,我正在寻找一些关于如何确定这些建议是否必要的建议。

我是否需要运行 SQL Profiler,还是检查查询表的代码更好?你还有什么建议吗?

performance index sql-server optimization

119
推荐指数
6
解决办法
13万
查看次数

为什么数字表“无价”?

我们的常驻数据库专家告诉我们,数字表非常宝贵。我不太明白为什么。这是一个数字表:

USE Model
GO

CREATE TABLE Numbers
(
    Number INT NOT NULL,
    CONSTRAINT PK_Numbers 
        PRIMARY KEY CLUSTERED (Number)
        WITH FILLFACTOR = 100
)

INSERT INTO Numbers
SELECT
    (a.Number * 256) + b.Number AS Number
FROM 
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) a (Number),
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) b (Number)
GO
Run Code Online (Sandbox Code Playgroud)

根据博客文章,给出的理由是

数字表真的是无价之宝。我一直使用它们来进行字符串操作、模拟窗口函数、用大量数据填充测试表、消除游标逻辑以及许多其他没有它们将非常困难的任务。

但我不明白这些用途到底是什么——你能提供一些引人注目的具体例子,说明“数字表”在 SQL Server 中为你节省了大量工作——以及为什么我们应该拥有它们?

sql-server

116
推荐指数
4
解决办法
2万
查看次数

总是创建交易是一种不好的做法吗?

总是创建交易是一种不好的做法吗?

例如,为一个简单的SELECT?

在没有必要的情况下创建交易的成本是多少?

即使您使用的是像 那样的隔离级别READ UNCOMMITTED,这是否是一种不好的做法?

sql-server best-practices transaction

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

SQL Server Management Studio 18 无法打开(仅弹出启动画面)

我刚刚在仅安装了 VS2019 的计算机上安装了 SSMS 18 GA,当我尝试打开 SSMS 时,会出现启动画面,但随后进程退出。

使用-log参数运行 ssms 会显示一条错误消息:

包 [Task Scheduler Package] 的 CreateInstance 失败:源:“mscorlib”描述:无法加载文件或程序集“Microsoft.VisualStudio.Shell.Interop.8.0,版本=15.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其中之一它的依赖。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040) System.IO.FileLoadException:无法加载文件或程序集“Microsoft.VisualStudio.Shell.Interop.8.0,版本=15.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)文件名:'Microsoft.VisualStudio.Shell.Interop.8.0,版本=15.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' ---> System.IO.FileLoadException:无法加载文件或程序集“Microsoft.VisualStudio.Shell.Interop.8.0,版本=8.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一. 定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)文件名:'Microsoft.VisualStudio.Shell.Interop.8.0,版本=8.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'

警告:程序集绑定日志已关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。注意:有一些与程序集绑定失败日志记录相关的性能损失。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

在 System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type) at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase) at System.Activator.CreateInstance(String assemblyString, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfoculture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark) at System.Activator.CreateInstance(String assemblyName, String typeName) at …

sql-server ssms

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

为什么要同时使用 TRUNCATE 和 DROP?

在我工作的系统中有很多使用临时表的存储过程和 SQL 脚本。使用这些表后,最好删除它们。

我的许多同事(几乎所有人都比我更有经验)通常会这样做:

TRUNCATE TABLE #mytemp
DROP TABLE #mytemp
Run Code Online (Sandbox Code Playgroud)

我通常DROP TABLE在我的脚本中使用单个。

在 aTRUNCATE之前立即执行 a 有什么好的理由DROP吗?

sql-server sybase truncate

105
推荐指数
2
解决办法
4万
查看次数

即使第一个参数不为 NULL,SQL Server 是否会读取所有 COALESCE 函数?

我正在使用 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间不会为空。如果第一个参数是NULL,第二个参数是一个相当漫长的过程:

SELECT COALESCE(c.FirstName
                ,(SELECT TOP 1 b.FirstName
                  FROM TableA a 
                  JOIN TableB b ON .....)
                )
Run Code Online (Sandbox Code Playgroud)

例如,如果 ,c.FirstName = 'John'SQL Server 仍会运行子查询吗?

我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使不会使用它)。

null sql-server coalesce

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

将“tbl”前缀添加到表名真的是个问题吗?

我正在观看一些 Brent Ozar 视频(例如这个视频),他建议不要在表格前加上‘tbl’‘TBL’

在网上我发现一些博客说它没有增加文档,而且“阅读它需要更长的时间”。

问题和考虑

  • 这真的有问题吗?因为自从我的第一份 dba 工作(高级 DBA 告诉我为组织这样做)以来,我就在表前加上了 'tbl' 前缀。
  • 这是我需要摆脱的东西吗?我做了一些测试,复制了一个非常大的表并给它加上了 'tbl' 前缀,同时保持另一个没有它,我没有注意到任何性能问题。

sql-server best-practices naming-convention

101
推荐指数
13
解决办法
3万
查看次数

每组检索 n 行

我经常需要从结果集中的每个组中选择一些行。

例如,我可能想列出每个客户最近的“n”个最高或最低订单值。

在更复杂的情况下,要列出的行数可能因组而异(由分组/父记录的属性定义)。这部分绝对是可选的/为了额外的学分,而不是为了劝阻人们回答。

在 SQL Server 2005 及更高版本中解决这些类型问题的主要选项是什么?每种方法的主要优点和缺点是什么?

AdventureWorks 示例(为清晰起见,可选)

  1. 列出表中五个最近的交易日期和 ID TransactionHistory,每个产品以从 M 到 R 的字母开头。
  2. 再次相同,但n每个产品都有历史记录行,其中nDaysToManufactureProduct 属性的五倍。
  3. 同样,对于每个产品恰好需要一条历史记录行的特殊情况(最近的单个条目由TransactionDate, .tie-break on TransactionID.

sql-server t-sql greatest-n-per-group

97
推荐指数
6
解决办法
7万
查看次数

SQL Server 数据库卡在恢复状态

我有一个 Sharepoint 服务器。我们的备份工具出现问题,现在我的一些数据库卡在恢复状态!

显示还原数据库的图像

是否可以停止恢复过程?还有,我怎样才能确保数据库的完整性没有受到损害?

sql-server sql-server-2008-r2 sql-server-2012

96
推荐指数
2
解决办法
38万
查看次数

使用不同域中的 Windows 身份验证连接到 SQL Server

我正在尝试连接到不同域中 VPN 上的远程 SQL Server。当我在 SQL Server 上输入服务器名称并选择其他连接参数以添加我学校需要的一些额外内容时:

Integrated Security=SSPI; User ID=DOMAIN\username; Password=Password
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

登录失败。登录名来自不受信任的域,不能与 Windows 身份验证一起使用。

authentication sql-server logins

96
推荐指数
2
解决办法
23万
查看次数