标签: optimization

GUID 存储在 varchar 字段中

我继承了几个使用 GUID 作为 PK 的数据库。并非所有数据类型都是唯一标识符,大多数是 varchar(50) 和一些 varchar(100)。字段是真正的 GUID,有些是由

myID = 'xxx'+convert(varchar(40),newID())

总的来说有点乱

此设计对性能有何影响?是否值得重新处理表以转换数据类型。表通常约为 1/2 M 记录,其中有几个表在 2-4M 记录范围内。

这个问题的推动力是我正在尝试(不成功)优化一个连接 24 个表和视图的过程,而服务器处理得不好。

感谢您的任何见解

sql-server-2005 database-design sql-server optimization

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

MySQL 挂起处于终止状态

我有一个奇怪的情况,mysql OPTIMIZE 查询永远不会结束。Killinh 后,它仍处于“killed”状态。

重现场景:

  • 操作系统:CentOS 6.5
  • MySQL:5.6
  • 引擎:MyISAM(至少有一个 BLOB/LONGTEXT 列)
  • mysql 配置'myisam_repair_threads' = 2

我有一个包含 40MB 数据和 1500 条记录的表。当 myisam_repair_threads 设置为 1 时,OPTIMIZE 将在一秒钟内完成。将 myisam_repair_threads 设置为 2 需要很长时间才能完成。终止查询后,它仍处于“已终止”状态(在撰写本文时已经 3 小时了)。看来这是mysql的一个bug。

然而,最大的问题是:我怎样才能强制终止这个查询?它当前持有表元数据的锁,因此某些进程无法执行,因为它们正在等待该锁。

任何建议表示赞赏!

mysql myisam optimization hang

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

通过 SQL Server 客户端连接提取数据的速度有多快?

可能的最高吞吐量是多少?有人见过超过 25MB/秒的东西吗?

我一直在试图找出什么是可能的。

我知道有一些调整参数,例如数据包大小、每批行数等,此外,如果通过 TCP,还会涉及开销。我可以以持续 250MB/秒的速度复制文件。我还没有找到任何方法可以通过查询拉取 > 16MB/秒左右的速度。

通过保存到平面文件,我使 bcp 的速度约为 25MB/秒。但是,对于仅从大表(53GB)中进行选择的查询来说,运气不佳。我一直在使用各种版本的 SQL Server、使用最大机器和 SSD 等(32 核、200GB 内存等)在 Google Compute 实例上进行实验

SQL Server 是否有理论上可以在一个连接上处理的最大数量?25MB/秒看起来慢得离谱。

performance sql-server optimization network query-performance

4
推荐指数
1
解决办法
549
查看次数

如何优化 PostgreSQL 上大型表的最小/最大查询

如何在 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)

查询大约需要一个小时才能完成。

对于这么大的表,即使有索引,这是否是正常的性能?我怎样才能减少这个查询时间?

postgresql performance optimization postgresql-performance

4
推荐指数
1
解决办法
4003
查看次数

获取索引扫描而不是可能的索引搜索?

目前正在学习有关查询优化的一些东西,我一直在尝试不同的查询并偶然发现了这个“问题”。

我正在使用 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 …

index sql-server optimization

4
推荐指数
1
解决办法
2775
查看次数

SQL Server 选择非选择性索引

我正在测试 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)

index sql-server optimization database-internals

4
推荐指数
1
解决办法
251
查看次数

为什么 [看似] 合适的索引不用于带有 OR 的 LEFT JOIN

我在 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

4
推荐指数
1
解决办法
289
查看次数

测试时使用缓存数据的存储过程性能不佳

我有一个存储过程,第一次运行大约需要 15 秒,后续运行需要 1 到 2 秒。如果我等待一个小时并再次运行它,则再次需要 15 秒。

我猜测它在后续运行中使用缓冲池中的缓存数据,而第一次它必须将数据从磁盘加载到缓冲池。我正在尝试调整此存储过程,但第一次运行后我无法测试我的更改,因为它只需要 1 到 2 秒。

我知道我可以使用该DBCC DROPCLEANBUFFERS命令释放缓存并运行我的存储过程,但我不允许在工作中清除缓存。我WITH RECOMPILE也尝试过,但这只会创建一个新计划,但仍然使用缓存的数据。是否有另一种方法强制存储过程不使用缓存数据?

sql-server optimization performance-tuning

4
推荐指数
1
解决办法
691
查看次数

将列合并为 1 列是否有助于优化大表?

我有 user、items 和 user_items 表,并且像往常一样用户有很多项目。表包含: 用户:~50K 项目:~3.5M 用户项目:~5M

我正在使用 MySQL,我的大部分查询都在选择用户的项目。所以我想知道将数据保存在 UserItems 表上是否有帮助,如下所示,

user_id item_ids 1 1,22,23,45,66...

然后在获得ids后,简单地解析得到item ids。任何建议/经验?

mysql optimization

3
推荐指数
1
解决办法
125
查看次数

优化新手:有多少“罪”是冗余?

我已经开发了一段时间,但以前从未真正处理过数据库/缩放问题。这突然发生了变化,我发现自己陷入了深渊。

我有 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 会只是添加列,还是尝试其他解决方案?

干杯...

normalization database-design optimization

3
推荐指数
1
解决办法
172
查看次数