有没有人推荐一本教数据库分片的书(最好是从头开始)
我已经阅读了 40 个不同的网站,讨论了分片。
我并不是说在线网站/博客很糟糕,它们是很好的花絮。然而,我需要主餐,而不仅仅是这里和那里的有用信息。基本上,我有一个关于如何实现分片的想法(我猜),但由于它是一个非常复杂的概念,我相信有很多很多东西可以研究。
给定一个简单的三表连接,当包含 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) 我有两个数据库服务器,通过链接服务器连接。两者都是 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 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 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能有多重要。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)默认为 4 KB 而不是 64 KB。SQL 服务器已安装。
是否值得一试——卸载 SQL——将驱动器格式化为 64 KB 集群大小并重新安装 SQL 服务器?
在我妻子的工作中,关于仅使用存储过程中临时表中的varchar(255)所有varchar字段存在争议。基本上,一个阵营希望使用 255,因为即使定义发生变化它也始终有效,而另一个阵营则希望坚持使用源表中的大小以提高潜在的性能。
表演营对吗?是否有其他影响?他们正在使用 SQL Server。
如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:
有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。
有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。
我尝试安装 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 数据库进行一次调用,是否会由于该延迟而发生表锁定?假设我查询表 A 中的某些记录,并且 SQL Server 必须通过慢速网络返回该数据 - 当服务器通过网络发送响应时,表 A 上是否存在读取锁定,或者 SQL Server 在发送之前是否释放锁定响应?
此外,答案是否会根据响应的大小而有所不同?如果它只需要返回几 KB 与几百 MB,那会有什么不同吗?
创建显式事务、运行查询和关闭事务显然会导致表锁定,因为事务的持续时间与我的延迟相关。
根据 DMV 统计数据,我们有一个非常大的数据库,其中包含数百个未使用的索引,这些索引自 7 月份服务器上次重新启动以来一直在累积。我们的一位 DBA 发表了以下警示性声明,这对我来说没有意义:
关于#1,在我看来,SQL Server 实际上会在插入/更新完成之前对索引进行查找以确定唯一性,因此,索引不会显示为未使用。
关于#2,这真的可能吗?
顺便说一句,当我说不使用索引时,我的意思是没有搜索和扫描。
sql-server ×10
index ×2
performance ×2
datatypes ×1
errors ×1
except ×1
filegroups ×1
installation ×1
locking ×1
mysql ×1
network ×1