标签: sql-server

有没有人推荐一本教分片的书?

有没有人推荐一本教数据库分片的书(最好是从头开始)

我已经阅读了 40 个不同的网站,讨论了分片。

我并不是说在线网站/博客很糟糕,它们是很好的花絮。然而,我需要主餐,而不仅仅是这里和那里的有用信息。基本上,我有一个关于如何实现分片的想法(我猜),但由于它是一个非常复杂的概念,我相信有很多很多东西可以研究。

mysql sql-server

16
推荐指数
1
解决办法
808
查看次数

在不返回任何行的查询中包含 ORDER BY 会严重影响性能

给定一个简单的三表连接,当包含 ORDER BY 时,即使没有返回行,查询性能也会发生巨大变化。实际问题场景需要 30 秒才能返回零行,但在不包括 ORDER BY 时是即时的。为什么?

SELECT * 
FROM tinytable t                          /* one narrow row */
JOIN smalltable s on t.id=s.tinyId        /* one narrow row */
JOIN bigtable b on b.smallGuidId=s.GuidId /* a million narrow rows */
WHERE t.foreignId=3                       /* doesn't match */
ORDER BY b.CreatedUtc          /* try with and without this ORDER BY */
Run Code Online (Sandbox Code Playgroud)

我知道我可以在 bigtable.smallGuidId 上建立索引,但是,我相信在这种情况下这实际上会使情况变得更糟。

这是创建/填充表以进行测试的脚本。奇怪的是,smalltable 有一个 nvarchar(max) 字段似乎很重要。我使用 guid 加入 bigtable 似乎也很重要(我猜这使它想要使用哈希匹配)。

CREATE TABLE tinytable
  (
     id        INT PRIMARY KEY IDENTITY(1, 1),
     foreignId …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

16
推荐指数
2
解决办法
3582
查看次数

SQL Server 链接服务器性能:为什么远程查询如此昂贵?

我有两个数据库服务器,通过链接服务器连接。两者都是 SQL Server 2008R2 数据库,链接服务器连接是通过常规“SQL Server”链接使用当前登录的安全上下文建立的。链接的服务器都在同一个数据中心,所以连接应该不是问题。

我使用以下查询来检查列的哪些值identifier可远程使用,但不能在本地使用。

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT DISTINCT
    identifier 
FROM LocalDb.schema.[TableName] 
Run Code Online (Sandbox Code Playgroud)

在两个表上的列上都有非聚集索引identifier。本地大约有 260 万行,远程只有 54 行。然而,在查看查询计划时,70% 的执行时间用于“执行远程查询”。此外,在研究完整的查询计划时,估计的本地行数是1而不是2695380(这是仅选择后面的查询时的估计行数EXCEPT)。 执行计划 执行此查询时,确实需要很长时间。

不禁让人疑惑:这是为什么呢?估计是“刚刚”结束,还是链接服务器上的远程查询真的那么昂贵?

sql-server sql-server-2008-r2 linked-server except

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

分页时 SQL Server 查询速度变慢

我在 SQL Server 2012 中看到以下 T-SQL 查询的一些奇怪行为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)

单独执行这个查询在不到两秒的时间内给了我大约 1,300 个结果(有一个全文索引Name

但是,当我将查询更改为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
OFFSET 0 rows
FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

给我10个结果需要20多秒。

下面的查询更糟糕:

SELECT Id 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Id 
    FROM dbo.Person
    WHERE CONTAINS(Name, '"John" AND "Smith"') ) AS RowConstrainedResult 
WHERE RowNum >= 0 AND RowNum < 11 
ORDER BY …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

16
推荐指数
2
解决办法
5646
查看次数

SQL Server NTFS 分配单元大小

在运行 SQL Server 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能有多重要。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)默认为 4 KB 而不是 64 KB。SQL 服务器已安装。

是否值得一试——卸载 SQL——将驱动器格式化为 64 KB 集群大小并重新安装 SQL 服务器?

sql-server-2008 sql-server

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

varchar 大小在临时表中是否重要?

在我妻子的工作中,关于仅使用存储过程中临时表中的varchar(255)所有varchar字段存在争议。基本上,一个阵营希望使用 255,因为即使定义发生变化它也始终有效,而另一个阵营则希望坚持使用源表中的大小以提高潜在的性能。

表演营对吗?是否有其他影响?他们正在使用 SQL Server。

performance sql-server datatypes temporary-tables

16
推荐指数
1
解决办法
4976
查看次数

将主键移动到文件组 (SQL Server 2012)

如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:

  1. 删除非聚集索引(需要重新使用和重建它们)
  2. 删除聚集索引(需要对整个表进行重新排序)
  3. 创建新的主键约束(巨大的排序操作)
  4. 创建所有非聚集索引(需要排序和写入)

有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。

有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。

index sql-server filegroups sql-server-2012

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

等待数据库引擎恢复句柄失败。检查 SQL Server 错误日志以了解潜在原因

我尝试安装 SQL2008R2 - SQL2012 - sql2014

2014-07-17 16:31:16.00 spid14s     Error: 17190, Severity: 16, State: 1.
2014-07-17 16:31:16.00 spid14s     Initializing the FallBack certificate failed with error code: 1, state: 20, error number: 0.
2014-07-17 16:31:16.00 spid14s     Unable to initialize SSL encryption because a valid certificate could not be found, and it is not possible to create a self-signed certificate.
2014-07-17 16:31:16.00 spid7s      Starting up database 'msdb'.
2014-07-17 16:31:16.01 spid12s     Starting up database 'mssqlsystemresource'.
2014-07-17 16:31:16.01 spid14s     Error: 17182, Severity: 16, State: …
Run Code Online (Sandbox Code Playgroud)

sql-server installation errors

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

增加的网络延迟会导致 MS SQL Server 中的表锁定吗?

如果我通过高延迟网络对 SQL Server 数据库进行一次调用,是否会由于该延迟而发生表锁定?假设我查询表 A 中的某些记录,并且 SQL Server 必须通过慢速网络返回该数据 - 当服务器通过网络发送响应时,表 A 上是否存在读取锁定,或者 SQL Server 在发送之前是否释放锁定响应?

此外,答案是否会根据响应的大小而有所不同?如果它只需要返回几 KB 与几百 MB,那会有什么不同吗?

创建显式事务、运行查询和关闭事务显然会导致表锁定,因为事务的持续时间与我的延迟相关。

sql-server network locking

16
推荐指数
2
解决办法
4004
查看次数

删除未使用的索引 - 评估意外危险

根据 DMV 统计数据,我们有一个非常大的数据库,其中包含数百个未使用的索引,这些索引自 7 月份服务器上次重新启动以来一直在累积。我们的一位 DBA 发表了以下警示性声明,这对我来说没有意义:

  1. 在删除索引之前,我们需要确定它是否没有强制执行唯一性约束,因为查询优化器可能需要该索引存在。
  2. 无论何时创建索引,都会在 SQL Server 中创建与该索引相关的统计信息。查询可能没有使用索引,但可能正在使用其统计信息。所以我们可能会遇到这样的情况,在删除索引后,特定的查询性能变得非常糟糕。SQL Server 不保留统计信息的使用情况。尽管我们在数据库上启用了“自动创建统计”功能,但我不知道在查询优化器创建丢失的统计之前必须在内部满足哪些所有参数。

关于#1,在我看来,SQL Server 实际上会在插入/更新完成之前对索引进行查找以确定唯一性,因此,索引不会显示为未使用。

关于#2,这真的可能吗?

顺便说一句,当我说不使用索引时,我的意思是没有搜索和扫描。

index sql-server

16
推荐指数
1
解决办法
819
查看次数