我的应用程序中有列的值始终为 4 位数字,例如“0100”或“1230”。示例之一可能是Merchant Category Code。
暂时,我已经将这个列的类型设置为char (4). 我有很多这种类型的专栏。这些类型的列之一也包含在非聚集UNIQUE索引中。我想为这种类型的专栏建立一种方法。
通过在应用程序中添加或 添加到开头来使用char (4)或可能更好吗?smallint' '0
包含这些列的表已分区,将包含大约 3 亿条记录。UPDATE可能不会在这种类型的列上执行。它们也不会出现在WHERE(有时可能出现在临时报告中)。
我应该选择哪种数据类型?
它就像一个邮政编码,它可以是数字,但你必须存储前导零
确切地。我在考虑在性能方面什么是更好的方法。还必须考虑到,如果我将其存储为smallint,应用程序代码必须将其解析为字符串并添加前导零。
我有一个带有 100Gb MDF 和 4Gb LDF 的 SQL2016 DB 的客户端。数据库设置为简单。我无法将 LDF 缩小到最低限度。如何将 LDF 缩小到正常水平?
此设置和文件大小是否会影响性能?
我有一个要求,我需要从 sa 登录中删除 sysadmin 服务器角色。
我又创建了 1 个用户,并将 sysadmin 角色授予该用户。
当我从 sa 登录中取消选中 sysadmin 时,它会引发错误。
无法使用特殊主体 sa 错误 15405。
任何人都可以知道如何做到这一点吗?
我目前正在使用分析器捕获死锁事件。(死锁,死锁图,死锁链)。
到目前为止一切顺利,但为此,客户端计算机需要不断运行和在线。
==> 有没有办法直接在 SQL Server 上捕获和收集死锁事件作为后台作业?
我们支持基于 SQL Server 的内部应用程序的多种部署。
我们现在遇到过几次问题,一些曾经快速而小的查询突然变得非常缓慢或不稳定,而不一定会产生更多的数据或在更大的数据集上运行。
每次发生这种情况时,都是突然开始缓慢运行的不同查询。每当这种情况发生时,我们必须花一些开发时间来调试问题,可能会再次编写查询并与以前的版本进行基准测试等等。 然而,原始查询通常可以正常工作多年,而且我们事先没有迹象表明它的执行时间可能会爆炸。
有哪些好的做法可以防止查询随机变慢?
我所追求的不是“如何修复我们已经观察到很慢的查询”,而是首先如何降低查询变慢的可能性——一种主动的方法,而不是被动的。我需要一种方法来强制 SQL Server 不要尝试过多地优化查询:我真的不需要快速,我需要一致。如果有一些选择让 SQL Server 在构建查询计划时更加保守,而不是试图利用数据分布等,我会追求它们。
一个巨大的表导致了一个非常重要的生产数据库(MS SQL Server 2016 SP1 标准版)上的严重性能问题。
您将如何提高这种有问题的表的性能?您会在建议的性能调整步骤中添加或删除哪些内容?
非常感谢并提前感谢。
好的,我不想一一回复所有评论。所以我正在编辑问题并添加更多信息。
第一:我不是专家 DBA。我会说一个高级初学者。这就是为什么我在这里尽可能多地向社区学习。
第二:我们两周前才得到这个客户,我自己还没有完全访问环境。这个关于问题的信息(事实),关于表直接来自客户的系统管理员。
第三:因此,我不知道为什么该表是堆的第一手,没有索引,他们让它在没有任何分区的情况下增长这么多,等等。
第四:建议的解决方案和建议的步骤不是我自己的,而是直接来自整个系统的制造商(这是一个众所周知的统一通信系统,制造商在这方面是最好的。我想你们都知道哪个)。
5th:我希望下周可以完全访问环境,在此之前我只是想分享我手头的东西,并在陷入困境之前尝试获得尽可能多的意见/建议。
第 6 名:因为不幸的是,我将把这个烂摊子从这里拿走,并试图让它更好、更顺畅地工作。
感谢所有已经抽出时间并回复的人。我已经有了一些见识。一旦我手头有更多信息,我肯定会分享更多信息。
我正在 SQL Server 上开发一个数据库项目,我在考虑使用列存储索引是否是一个好主意。
该项目由一个表 (A) 组成,该表将包含大量行,一列具有许多重复值。每天,一包新行将添加到表中,每个包都有一个“DateId”。
之后,我需要更新一个不同的表 (B) 加入 A 并过滤 A 以获取“DateId”和其他列。
SQL 中的示例:
CREATE TABLE A (
[Id] [BIGINT] IDENTITY(1,1) NOT NULL,
[DateId] [INT] NOT NULL,
[B_Id] [BIGINT] NOT NULL,
-- other columns...
INDEX cci_A CLUSTERED COLUMNSTORE
)
CREATE TABLE B (
[Id] [BIGINT] IDENTITY(1,1) NOT NULL,
-- other columns...
INDEX cci_B CLUSTERED COLUMNSTORE
)
UPDATE B
SET ...
FROM A
INNER JOIN B ON A.B_Id = B.Id
WHERE A.DateId = @myDateId
Run Code Online (Sandbox Code Playgroud)
在这种情况下,列存储是一个不错的选择吗?
我想找到两组坐标之间的距离。首先我使用内置函数:
declare @lat1 real = 33.1, @lon1 real =-117.1, @lat1 real = 39.6, @lon1 real =-98.7
declare @source geography = geography::Point(@lat1, @long1, 4326);
declare @target geography = geography::Point(@lat2, @long2, 4326);
select @source.STDistance(@target)
Run Code Online (Sandbox Code Playgroud)
现在我使用手动计算来做同样的事情:
-- Kilometers to Miles: 0.621371, Earth Radius: 6378.137
select 0.621371 * 6378.137 * ACOS(ROUND(
(SIN(PI() * @lat2 /180) * SIN(PI() * @lat1/180))
+ (COS(PI() * @lat2 /180) * COS(PI() * @lat1/180) * COS(PI() * @lon1/180 - PI() * @lon2 /180)), 12))
Run Code Online (Sandbox Code Playgroud)
在我对 SQL Server 2014 的测试中,手动功能比内置功能快 4 …
我需要一种方法来确定哪个连接导致了错误 17886。我已经研究过并且有修复错误的解决方案,但前提是您知道哪个连接导致了问题。
我想记录错误,这样我就不必坐下来等待它发生 - 如果它再次发生。有没有办法使用扩展事件来跟踪:错误 #17886、连接、发生时间等。
有任何想法吗?
我不是 DBA,如果这个问题听起来很愚蠢,请原谅。希望我能从有经验的 DBA 那里得到帮助,因为我对此质疑了很长时间。
假设有2张表,一张表有很多记录,一张表只是静态数据有2条记录(例如:是/否表)。
以这两个表为例:
Table_Yes_No(只有 2 条记录:Yes和No。当然,它们有一个递增的聚集 PK)Table_Form(非常大的表,有很多记录,一列有 FK 到 PK Table_Yes_No)。现在我的问题; 是否值得把一个指标的FK(参考从Table_Form该Table_Yes_No表)?该列将仅包含1或2(但未排序,因为没有索引)。是否值得索引这样的 FK?
SQLFiddle 中的一个例子:http ://sqlfiddle.com/#!18/51614/3/0
无论如何都会查询该列,问题是索引是否有助于性能。小表是静态数据,永远不会改变。大表会被大量查询,上面也会有很多CRUD。
index foreign-key sql-server clustered-index nonclustered-index
sql-server ×10
index ×2
performance ×2
columnstore ×1
datatypes ×1
deadlock ×1
foreign-key ×1
heap ×1
shrink ×1
table ×1