我继承了几个使用 GUID 作为 PK 的数据库。并非所有数据类型都是唯一标识符,大多数是 varchar(50) 和一些 varchar(100)。字段是真正的 GUID,有些是由
myID = 'xxx'+convert(varchar(40),newID())
总的来说有点乱
此设计对性能有何影响?是否值得重新处理表以转换数据类型。表通常约为 1/2 M 记录,其中有几个表在 2-4M 记录范围内。
这个问题的推动力是我正在尝试(不成功)优化一个连接 24 个表和视图的过程,而服务器处理得不好。
感谢您的任何见解
我有一个奇怪的情况,mysql OPTIMIZE 查询永远不会结束。Killinh 后,它仍处于“killed”状态。
重现场景:
我有一个包含 40MB 数据和 1500 条记录的表。当 myisam_repair_threads 设置为 1 时,OPTIMIZE 将在一秒钟内完成。将 myisam_repair_threads 设置为 2 需要很长时间才能完成。终止查询后,它仍处于“已终止”状态(在撰写本文时已经 3 小时了)。看来这是mysql的一个bug。
然而,最大的问题是:我怎样才能强制终止这个查询?它当前持有表元数据的锁,因此某些进程无法执行,因为它们正在等待该锁。
任何建议表示赞赏!
可能的最高吞吐量是多少?有人见过超过 25MB/秒的东西吗?
我一直在试图找出什么是可能的。
我知道有一些调整参数,例如数据包大小、每批行数等,此外,如果通过 TCP,还会涉及开销。我可以以持续 250MB/秒的速度复制文件。我还没有找到任何方法可以通过查询拉取 > 16MB/秒左右的速度。
通过保存到平面文件,我使 bcp 的速度约为 25MB/秒。但是,对于仅从大表(53GB)中进行选择的查询来说,运气不佳。我一直在使用各种版本的 SQL Server、使用最大机器和 SSD 等(32 核、200GB 内存等)在 Google Compute 实例上进行实验
SQL Server 是否有理论上可以在一个连接上处理的最大数量?25MB/秒看起来慢得离谱。
performance sql-server optimization network query-performance
如何在 PostgreSQL 中对表进行索引,以便最小/最大查询尽快返回?
我有一个包含几亿行的大表。每行都有一个 source_id 和最后更新记录的日期。我想收集每个 source_id 的一些统计信息,特别是每个 source_id 的最小和最大日期范围。
所以我在我的表上创建了这个索引:
CREATE INDEX CONCURRENTLY mydata_source_last_updated_date ON mydata (source_id, last_updated_date ASC);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用以下命令查询每个源的最短日期时:
SELECT source_id, MIN(last_updated_date) FROM mydata GROUP BY source_id;
Run Code Online (Sandbox Code Playgroud)
查询大约需要一个小时才能完成。
对于这么大的表,即使有索引,这是否是正常的性能?我怎样才能减少这个查询时间?
目前正在学习有关查询优化的一些东西,我一直在尝试不同的查询并偶然发现了这个“问题”。
我正在使用 AdventureWorks2014 数据库,我运行了这个简单的查询:
表结构(取自https://www.sqldatadictionary.com/AdventureWorks2014.pdf):
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 100
Run Code Online (Sandbox Code Playgroud)
返回 19,720 行
Sales.Customer 中的总行数 = 19,820
在检查以确保 CustomerID 实际上不仅是表的 PK 还具有聚集索引(但它使用非聚集索引)之后,情况确实如此:
EXEC SP_HELPINDEX 'Sales.Customer'
Run Code Online (Sandbox Code Playgroud)
这是执行计划?
https://www.brentozar.com/pastetheplan/?id=B1g1SihGr
我读过当面对大量数据和/或当它返回超过 50% 的数据集时,查询优化器将支持索引扫描。但是该表作为一个整体几乎没有 20,000 行(准确地说是 19,820 行),无论如何它都不是一张大表。
当我运行此查询时:
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 30000
Run Code Online (Sandbox Code Playgroud)
返回 118 行
https://www.brentozar.com/pastetheplan/?id=Byyux32MS
我得到了一个索引查找,所以我认为这是由于“超过 50% 的情况”但是,我也运行了这个查询:
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 20000
Run Code Online (Sandbox Code Playgroud)
返回 10,118 行
https://www.brentozar.com/pastetheplan/?id=HJ9oV33zr
它还使用了索引查找,即使它返回了超过 50% 的数据集。
那么这里发生了什么?
编辑:
打开 IO …
我正在测试 SQL Server 索引并发现非常奇怪的行为。这是我的代码:
DROP TABLE IF EXISTS dbo._Test
DROP TABLE IF EXISTS dbo._Newtest
GO
CREATE TABLE _Test(
ID INT NOT NULL,
UserSystemID INT NOT NULL,
Age INT
)
GO
INSERT INTO dbo._Test
( ID, UserSystemID, Age )
SELECT TOP 10000000 ABS(CHECKSUM(NEWID())) % 5000000, ABS(CHECKSUM(NEWID())) % 2, ABS(CHECKSUM(NEWID())) % 100
FROM sys.all_columns
CROSS JOIN sys.all_objects a
CROSS JOIN sys.all_objects b
CROSS JOIN sys.all_objects c
; WITH cte AS (
SELECT ID, UserSystemID, age, ROW_NUMBER() OVER(PARTITION BY ID, UserSystemID ORDER BY …Run Code Online (Sandbox Code Playgroud) 我在 StackOverflow 数据库中有以下 [相当无意义,仅用于演示] 查询:
SELECT *
FROM Users u
LEFT JOIN Comments c
ON u.Id = c.UserId OR
u.Id = c.PostId
WHERE u.DisplayName = 'alex'
Run Code Online (Sandbox Code Playgroud)
Users表上唯一的索引是 ID 上的聚集索引。
该Comments表具有以下非聚集索引以及 ID 上的聚集索引:
CREATE INDEX IX_UserID ON Comments
(
UserID,
PostID
)
CREATE INDEX IX_PostID ON Comments
(
PostID,
UserID
)
Run Code Online (Sandbox Code Playgroud)
查询的估计计划在这里:
我可以看到优化器将做的第一件事是对用户表执行 CI 扫描以仅过滤那些用户 where DisplayName = Alex,有效地执行此操作:
SELECT *
FROM Users u
WHERE u.DisplayName = 'alex'
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)
并检索结果如下:
然后它会扫描评论 CI 并针对每一行,查看该行是否满足谓词 …
sql-server optimization execution-plan sql-server-2019 query-performance
我有一个存储过程,第一次运行大约需要 15 秒,后续运行需要 1 到 2 秒。如果我等待一个小时并再次运行它,则再次需要 15 秒。
我猜测它在后续运行中使用缓冲池中的缓存数据,而第一次它必须将数据从磁盘加载到缓冲池。我正在尝试调整此存储过程,但第一次运行后我无法测试我的更改,因为它只需要 1 到 2 秒。
我知道我可以使用该DBCC DROPCLEANBUFFERS命令释放缓存并运行我的存储过程,但我不允许在工作中清除缓存。我WITH RECOMPILE也尝试过,但这只会创建一个新计划,但仍然使用缓存的数据。是否有另一种方法强制存储过程不使用缓存数据?
我有 user、items 和 user_items 表,并且像往常一样用户有很多项目。表包含: 用户:~50K 项目:~3.5M 用户项目:~5M
我正在使用 MySQL,我的大部分查询都在选择用户的项目。所以我想知道将数据保存在 UserItems 表上是否有帮助,如下所示,
user_id item_ids 1 1,22,23,45,66...
然后在获得ids后,简单地解析得到item ids。任何建议/经验?
我已经开发了一段时间,但以前从未真正处理过数据库/缩放问题。这突然发生了变化,我发现自己陷入了深渊。
我有 2 个 SQL 表,例如:
VOTES
vote_id (PK)
question_id (FK)
user_id (FK)
option_id (FK) <The option the user voted for>
Run Code Online (Sandbox Code Playgroud)
“问题”表如下所示:
QUESTIONS
question_id (PK)
option_1 (FK --> Options)
option_2 (FK --> Options)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,我经常必须检索某个问题的所有 option_1 票(或 option_2 票)的总和。这是目前通过选择 count where question_id = [@question.id] 和 option_id = [@question.option_1.id]"
我猜将 option_1_votes 和 option_2_votes 列添加到“问题”表并在每次添加投票时增加它们会更快。但归根结底,这是冗余数据。
所以,作为一个对数据库设计原则一无所知的人,这里的经验法则是什么?顶级 DBA 会只是添加列,还是尝试其他解决方案?
干杯...
optimization ×10
sql-server ×6
index ×2
mysql ×2
performance ×2
hang ×1
myisam ×1
network ×1
postgresql ×1