我有大约 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
在 SQL Server 2012 上,进程 SPID 可以在操作中更改吗?我们有一个非常独特的查询,我们一直在监视(生产,但受控测试),并且在不同的时间间隔使用不同的 SPID 看到它。这是一个独特的查询,其他人不应该运行,至少使用这些参数,因此我们不应该使用不同的 SPID 来查看它,除非......查询可以在过程中更改 SPID 吗?
我的理解是这是不可能的,所以更有可能是由于某些未知原因,尽管没有用户交互,但应用程序正在重新提交这个独特且破坏性能的查询,从而生成一个新的 SPID。
SELECT * FROM RegisteredThumbnail WHERE UserId = 512315
Run Code Online (Sandbox Code Playgroud)
此查询需要大约 6:45 分钟才能获取预期的行。
为了克服这个问题,索引是我唯一的选择吗?
通过将二进制数据替换为图像 url 作为字符串数据来更改图像数据的存储方式会有很大帮助吗?
由于这是当前的操作系统,因此更改列并不是一个好主意。
任何想法将不胜感激。
尚未配置索引。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 位于“BEGIN”的不同部分。以下两个查询的行为是否相同?
视图 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
我正在尝试对一些外部空间表执行查询,这比在普通空间表上运行的时间长几个数量级,因为没有使用索引。
索引似乎正在处理非空间查询。
这是应该工作的东西还是不受支持?
postgresql performance index spatial postgis query-performance
我在 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) 我有两个表:
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.aid和daily_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) 有什么办法可以优化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
我有迟钝。
任何人都可以查看此计划(PasteThePlan) 并告诉我需要优化的内容吗?这是实际的计划。
这是从应用程序获取客户信息的过程的一部分。在跟踪中我发现查询需要很长时间。大约需要 14 秒,而在另一个 POS 中则不到 1 秒。
我使用的是 SQL Server 2016 - Express Edition
performance sql-server sql-server-2016 microsoft-dynamics query-performance
我有 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
performance ×10
sql-server ×7
index ×2
postgresql ×2
concat ×1
mysql ×1
optimization ×1
percona ×1
postgis ×1
spatial ×1
transaction ×1