我继承了一个非常不稳定的表,它是一个映射谁拥有系统中的资源。在任何给定的时刻,可能有十几个插入/删除/读取与该表相反。但是,系统中永远不会超过 30-40 行。
系统是SQL 2000时代写的,对表的访问是通过sp_getapplock/sp_releaseapplock系统sprocs序列化的,所以只有1个请求在修改表。此外,INSERT & DELETE 语句执行WITH (TABLOCK)。阅读十年前的笔记,它指出如果没有这些限制,系统将经历不间断的死锁。
我已将数据库移植到 SQL Server 2016 企业版。现在系统的吞吐量增加了 10 倍,这张表很容易成为最大的瓶颈。
对于像 SQL 2016 这样易变的表,我有哪些选择?
我正在寻找快速(希望是并发)访问并且没有死锁。
如果我尝试DROP & CREATE INDEX从上下文菜单创建脚本,则需要类似的时间。
我查看了 Profiler 跟踪,它有大约 4 页的大量重复查询。如果我查看任务管理器的“性能/以太网”选项卡,我会发现它以 800kb-1mb 的速率传输信息,并以大约 200kb 左右的速率发送信息。
这是一个错误吗?特征?我是否缺少一些简单的设置?
SELECT COUNT(*) FROM sys.indexes;返回 1979 年。SELECT COUNT(*) FROM sys.partitions;返回 1973 年。盒子是我自己的,所以没有争议。另外,这个盒子是我设计过的速度最快、规格最好的盒子。除了这个特定的操作之外,一切都很敏捷。
我有一个相当大的事务数据库 (100GB),有很多用户。数据库访问完全通过存储过程进行,这些过程大量使用临时表、表变量、游标和其他有趣的东西。
我正在一个新盒子上试用它以提高性能。新盒子有 5 个独立的物理硬盘。我正在努力想出一个最佳设置(主要是虽然无知,但我通常是 ac# dev)。到目前为止,我得到了以下信息:
Drive C: OS, SQL install, TempDB log
Drive D: Database data
Drive E: Database log
Drive F: TempDB data
Drive G: Databases indexes
Run Code Online (Sandbox Code Playgroud)
我走的是正确的道路吗?有什么明显的错误吗?
目前,我有一个 SQL 2005 标准框。我想就地将其升级到 SQL 2012 Enterprise。当我说到位时,我指的是类似于 Office 2010 的安装,例如,它删除旧的 (Office 2007) 版本,将自身绑定到其前身曾经拥有的扩展并保留所有设置。
这可能吗?
如果不是,应该走什么程序?到目前为止,我得到了这个。
我想找到两组坐标之间的距离。首先我使用内置函数:
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 …