标签: performance

大表连接的 OrderBy int 慢

我有大约 150 万条记录。此查询适用于较小的数据,但每几十万条记录就会慢一秒。对于 150 万,查询明显困难。

我模拟了一个全新的 Code First 项目来验证问题与我的实现无关,并提供以下示例查询:

    SELECT TOP 1 Widgets.*
    FROM [WidgetSandbox].[dbo].[Widgets] Widgets
    INNER JOIN [WidgetSandbox].[dbo].[Status] Statuses ON Widgets.StatusId = Statuses.Id
    INNER JOIN [WidgetSandbox].[dbo].[Colors] Colors ON Widgets.ColorCode = Colors.ColorCode
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] Sizes ON Widgets.SizeId = Sizes.Id
    WHERE Statuses.Name = 'Available'
    AND Colors.Name = 'Red'
    ORDER BY Sizes.DiameterInches
Run Code Online (Sandbox Code Playgroud)

DiameterInches 是一个int, 作为我实际代码中“PriorityLevel”的隐喻。

如果我注释掉ORDER BY Sizes.DiameterInches,它会立即返回,但如果我想找到“最小的可用红色小部件”,它就会爬行。

有没有更好的办法?

在此处输入图片说明

执行计划 XML:https : //gist.github.com/RobertBaldini/57c8b61d135cc5c84c38b2da243611ad

DDL:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购(数据加载器需要几分钟):https : //github.com/RobertBaldini/WidgetSandbox

performance sql-server execution-plan query-performance

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

进程的 SPID 更改?

在 SQL Server 2012 上,进程 SPID 可以在操作中更改吗?我们有一个非常独特的查询,我们一直在监视(生产,但受控测试),并且在不同的时间间隔使用不同的 SPID 看到它。这是一个独特的查询,其他人不应该运行,至少使用这些参数,因此我们不应该使用不同的 SPID 来查看它,除非......查询可以在过程中更改 SPID 吗?

我的理解是这是不可能的,所以更有可能是由于某些未知原因,尽管没有用户交互,但应用程序正在重新提交这个独特且破坏性能的查询,从而生成一个新的 SPID。

performance sql-server stored-procedures

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

考虑有点重的数据库

环境信息

  • 操作系统:Windows Server 2012 R2(64 位)
  • 内存:16.00GB
  • CPU : Intel(R) Xeon(R) CPU E5-2609 @ 2.40GHz
  • SQL:Windows SQL Server 2012 标准版

简要数据库数据信息

  • 10多张表中,其中一张有varbinary(max)类型的列
  • 该表有超过1m的记录,每列都有缩略图数据,大约占20k

简表规格

  • 表名:注册缩略图
  • 列名:UserId、ThumbData、已创建、已更新
  • 列类型:int、varbinarymax、datetime、datetime
  • 已用空间信息:行:1,034,300 | 保留:34,092,160 KB | 数据:34,054,872 KB | 索引大小:31040 KB | 未使用:6248 KB

询问

SELECT * FROM RegisteredThumbnail WHERE UserId = 512315
Run Code Online (Sandbox Code Playgroud)

此查询需要大约 6:45 分钟才能获取预期的行。

为了克服这个问题,索引是我唯一的选择吗?

通过将二进制数据替换为图像 url 作为字符串数据来更改图像数据的存储方式会有很大帮助吗?

由于这是当前的操作系统,因此更改列并不是一个好主意。

任何想法将不胜感激。

尚未配置索引。

performance sql-server sql-server-2012 query-performance

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

SQL Server 上的脏读

  1. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 位于“BEGIN”的不同部分。以下两个查询的行为是否相同?

  2. 视图 viewOne 和 viewTwo 会继承脏读吗?或者视图需要有一个明确的“NOLOCK”

查询 1

set transaction isolation level read uncommitted
begin    
    select col1 from viewOne
    select * from viewTwo
    select * from table1
end
Run Code Online (Sandbox Code Playgroud)

查询 2

begin    
    set transaction isolation level read uncommitted
    select col1 from viewOne
    select * from viewTwo
    select * from table1     
end
Run Code Online (Sandbox Code Playgroud)

performance sql-server transaction isolation-level query-performance

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

PostGIS 可以在外部表上使用空间索引吗?

我正在尝试对一些外部空间表执行查询,这比在普通空间表上运行的时间长几个数量级,因为没有使用索引。

索引似乎正在处理非空间查询。

这是应该工作的东西还是不受支持?

postgresql performance index spatial postgis query-performance

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

MySQL 默认不使用 PRIMARY KEY 进行排序

我在 5.6.35-81.0 Percona Server 上有一个大型 MySQL 表,主键中有间隙。该表有大约 5300 万条记录,自动增量键现在约为 3.7 亿条。该表是电话号码列表,用户添加/删除号码非常频繁,因此 BIGINT 的 PRIMARY 键内部有间隙。

我现在面临的问题是,当我做一个简单的 SELECT * FROM 表时,MySQL 默认不使用 PRIMARY 键对结果进行排序。它使用表中的电话号码字段对数据进行排序,因此数据被按顺序选择,而不是按顺序保存在数据库中。

带有 ORDER BY id 的 Offcourse SELECT 需要很长时间。另一种解决方案是将所有数据复制到另一个表,但这需要应用程序停机。我怎样才能解决这个问题或在未来避免这种情况?

CREATE TABLE `contacts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `phonebook_id` int(11) NOT NULL,
  `campaign_id` int(11) DEFAULT NULL,
  `contact` varchar(45) NOT NULL,
  `status` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `admin` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `call_status` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `active_call` tinyint(1) unsigned NOT NULL DEFAULT '0', …
Run Code Online (Sandbox Code Playgroud)

mysql performance percona

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

为什么在非常简单的散列连接案例中没有使用连接键上的索引?

我有两个表:

create table animal
(
    aid integer,
    cid integer,
    aname varchar(255) default NULL::character varying,
    species text
);

create table daily_feeds
(
    aid integer,
    zid integer,
    shift integer,
    menu integer
);
Run Code Online (Sandbox Code Playgroud)

和一个查询:

SELECT
aname,
shift
FROM animal
NATURAL JOIN daily_feeds
WHERE menu = 1;
Run Code Online (Sandbox Code Playgroud)

餐桌动物包含大约 40000 行,表 daily_feeds 包含大约 80000 行,每只动物 2 行。

我认为在用于连接animal.aiddaily_feeds.aid的列上添加索引可能会导致不同的执行计划并提高性能。

create index aaid on animal (aid);

create index daid on daily_feeds using btree (aid);
Run Code Online (Sandbox Code Playgroud)

这不会发生。这是为什么?

显然,这是一个非常简单且学术性的示例,我试图用它来了解有关数据库查询优化的更多信息。

编辑:

添加没有索引时的执行计划:

Hash Join  (cost=1439.24..2488.23 rows=499 width=10) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index execution-plan

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

优化查询。FOR XML PATH 或一些替代方案?

有什么办法可以优化FOR XML PATH语句吗?或者也许我应该使用另一种方法?

目前的方法根本不可接受。这需要几分钟。我知道视图是一个非常大的联盟,需要时间来消耗它,但也许是另一种方式......

这是查询:

SELECT t.serialNumber as TVM
  ,[issuanceDate] as transactionDate
  ,ioy.tvmTransactionId as TVM_TRANS_ID
  ,STUFF((SELECT ', ' + stv.carrierSN
    FROM HERMES.wts.v_SaleTransactionView as stv
    WHERE stv.tvmTransactionId = ioy.tvmTransactionId
    and stv.serialNumber = 'M040'
    FOR XML PATH ('')), 1, 2, '') as [serial_numbers]
  FROM [hermes].[wts].[IOYLog] ioy
  left join Hermes.hermes.Terminals t on ioy.tp_terminalId = t.tp_terminalId
  left join hermes.hermes.POS p on t.tp_POSId = p.tp_POSId
  left join [Hermes].[wts].[IOUPaymentStatus] [is] on [is].[tp_paymentStatusId] = ioy.status
  WHERE [is].includeInReports = 1 
  and (issuanceDate BETWEEN '2017/09/01' AND '2017/09/08') …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan concat query-performance

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

POS 性能问题 AX 2012 R3

我有迟钝。

任何人都可以查看此计划(PasteThePlan) 并告诉我需要优化的内容吗?这是实际的计划

这是从应用程序获取客户信息的过程的一部分。在跟踪中我发现查询需要很长时间。大约需要 14 秒,而在另一个 POS 中则不到 1 秒。

我使用的是 SQL Server 2016 - Express Edition

performance sql-server sql-server-2016 microsoft-dynamics query-performance

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

一个“更快”的服务器比另一个慢

我有 2 个虚拟机:

  • VM1 - 8 核 32GB 内存

  • VM2 - 8 核 64GB 内存

我使用 SSIS 目录在两个 VM 上同时运行相同的进程,所有进程都在它自己的 VM 上执行,因此没有信息通过网络传输..Aaa我发现这些进程的加载时间在 VM2 上相当慢。

加载:

  • VM1- 15m

  • VM2- 45m

我检查了一些性能指标并进行了一些基本测试...在加载期间我可以看到 Network I/O Waits

  • VM1- 600 毫秒/秒

  • VM2- 750 毫秒/秒

我假设这个网络 I/O 等待来自 SSIS,因为 SSIS 正在对 SQL Server 执行查询,然后批量插入信息,等待统计告诉我这两种情况的等待类型都是 ASYNC_NETWORK_IO。

我还使用 SP_SPACEUSED 进行了测试,以查看同时插入两个表中的行数,结果不是非常准确,但 VM1 几乎使插入的行数翻了一番......

我错过了任何进一步的测试吗?你想到的其他检查吗?

performance sql-server optimization sql-server-2016 query-performance

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