我使用的是 Postgres 9.3.4,我有 4 个查询,它们的输入非常相似,但响应时间却大不相同:
EXPLAIN ANALYZE SELECT posts.* FROM posts
WHERE posts.source_id IN (19082, 19075, 20705, 18328, 19110, 24965, 18329, 27600, 17804, 20717, 27598, 27599)
AND posts.deleted_at IS NULL
ORDER BY external_created_at desc
LIMIT 100 OFFSET 0;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.43..585.44 rows=100 width=1041) (actual time=326092.852..507360.199 rows=100 loops=1)
-> Index Scan using index_posts_on_external_created_at on posts (cost=0.43..14871916.35 rows=2542166 width=1041) (actual time=326092.301..507359.524 rows=100 loops=1)
Filter: (source_id = ANY ('{19082,19075,20705,18328,19110,24965,18329,27600,17804,20717,27598,27599}'::integer[]))
Rows Removed by Filter: 6913925
Total runtime: 507361.944 ms
Run Code Online (Sandbox Code Playgroud)
EXPLAIN …Run Code Online (Sandbox Code Playgroud) postgresql performance index optimization postgresql-9.3 postgresql-performance
我有一个包含 128'914'635 行的表。某些列的基数(即地址、姓氏、名字)等于表中的总行数 (128'914'635)。这个表上的查询真的很慢,当我在连接中使用这个表时,它们不使用任何索引。
你有什么想法为什么基数等于表中的总数或行数?
我们在下面的问题中描述了一个类似的问题。唯一的区别是我们有相同的整理表,而 Explain Extended 没有显示显式转换。
但是为什么仍然没有使用索引并且字段(地址字段)的基数与表行数相同?
CREATE TABLE `Datasupplied_Consumer_Final` (
`AddressID` varchar(100) DEFAULT NULL,
`IndividualId` varchar(100) DEFAULT NULL,
`personfirstname` char(30) DEFAULT NULL,
`personmiddleinitial` char(1) DEFAULT NULL,
`personlastname` char(30) DEFAULT NULL,
`PersonSurnameSuffix` varchar(100) DEFAULT NULL,
`persontitleofrespect` varchar(100) DEFAULT NULL,
`housenumber` varchar(100) DEFAULT NULL,
`predirection` varchar(100) DEFAULT NULL,
`streetname` varchar(100) DEFAULT NULL,
`streetsuffix` varchar(100) DEFAULT NULL,
`postdirection` varchar(100) DEFAULT NULL,
`unitdesignator` varchar(100) DEFAULT NULL,
`unitdesignatornumber` varchar(100) DEFAULT NULL,
`primaryaddress` char(47) DEFAULT NULL,
`secondaryaddress` …Run Code Online (Sandbox Code Playgroud) 在下面的查询中,有重复的计算,例如对 的三个调用SUM(p.amount)。MySQL 是否为每个函数调用重新计算,或者是否有某种内存优化?如果没有,如何优化这种查询以获得最大性能?
似乎在第一次计算后通过别名获得下一个计算会更快total_payemnts,但这只会引发错误。
SELECT LEFT(c.last_name, 1) AS 'last_names',
SUM(p.amount) AS 'total_payments',
COUNT(p.rental_id) AS 'num_rentals',
SUM(p.amount) / COUNT(p.rental_id) AS 'avg_pay'
FROM customer c
JOIN payment p ON p.customer_id = c.customer_id
GROUP BY LEFT(c.last_name, 1)
ORDER BY SUM(p.amount) DESC;
Run Code Online (Sandbox Code Playgroud)
此查询在MySQL Sakila示例数据库上运行。
我在 Postgres 9.6 DB 中有以下表格:
create table baseDimensions(
id serial not null primary key,
dimension1 date not null,
dimension2 int not null,
dimension3 text not null,
-- ...
dimension10 boolean not null,
unique(dimension1, dimension2, ..., dimension10)
);
create table interestingData(
baseDimensionId int not null references baseDimensions(id),
subdimension1 int not null,
subdimension2 boolean not null,
-- ...
value1 int not null,
value2 bigint not null,
-- ...
primary key(baseDimensionId, subdimension1, subdimension2)
)
Run Code Online (Sandbox Code Playgroud)
所以在文本中:我有很多维度(例如,如果表格用于零售店的销售,则维度可以是销售日期、customerId、客户是否是重复客户、客户的夹克颜色穿着等)以及这些尺寸的一些值(例如,保持零售示例:值可以是客户支付的金额)。然而,有多个“interestingData”表共享十个基本维度,因此为了节省一些磁盘空间,我将这些基本维度提取到一个单独的表中。
我特意选择了唯一索引中列的顺序,以便典型的过滤条件在最左边。所以大部分时间我会按维度1过滤数据。
现在我想知道value1特定日期的平均值(dimension1每个dimension3)。这可以通过以下查询来回答: …
postgresql performance optimization postgresql-9.6 query-performance
下面的查询非常慢(运行超过一分钟),我已将问题缩小到OR操作员 ( ...OR (EXISTS (SELECT...)。
我使用实时执行来验证 OR 语句的表之间是否存在嵌套循环连接,然后将记录连接回EmailTable执行计划中的 。
基本上,EmailTable正在被探查两次。
如果我添加提示OPTION (MERGE JOIN),查询将在一秒钟内完成。
请告诉我如何重写此查询,以便优化器默认选择更好的计划。
EmailTable并且TeamMembers在 上有聚集索引INS_ID。表上的统计数据经常更新。
DECLARE @a INT
,@b BIT
,@c INT
,@d INT
,@e INT;
SELECT [XYZ].[CNT] AS [C]
FROM (
SELECT COUNT(1) AS [CNT]
FROM [dbo].[EmailTable] AS [table1]
WHERE ([table1].[INS_ID] = @a)
AND ([table1].[ACTIVE] = 1)
AND ([table1].[QUEUED_TO_SEND] = @b)
AND ([table1].[OWNER_USER_ID] <> @c)
AND (
([table1].[OWNER_USER_ID] IN (- 1))
OR (N'Allusers' = …Run Code Online (Sandbox Code Playgroud) performance join sql-server optimization exists query-performance
我有一个 mysql 查询,它在 4 秒内返回结果。
SELECT
*
FROM
xercasehistory
WHERE
xerId = 192
ORDER BY id DESC limit 10;
Run Code Online (Sandbox Code Playgroud)
但是当我向现有参数添加额外的 where 参数时,大约需要 30 秒才能完成。
SELECT
*
FROM
xercasehistory
WHERE
xerId = 192 AND type = 'case'
AND fieldName = 'statusCode'
AND typesKey=5
ORDER BY id DESC limit 10;
Run Code Online (Sandbox Code Playgroud)
因此,我通过运行检查同一张表中的索引 show indexes from xercasehistory
xercasehistory 0 PRIMARY 1 ID A 24545933 BTREE xercasehistory 1 xecasehistory_caseId_IDX 1 caseId A 2045494 BTREE xercasehistory 1 xecasehistory_typeskey 1 typesKey A 20169 是 BTREE xercasehistory 1 …
我需要根据给定月份的每一行计算给定 client_id 的过去 12 个月的销售额总和。
这是按客户按月汇总的销售额的初始表(此处针对特定客户进行过滤511656A75):
CREATE TEMP TABLE foo AS
SELECT idclient, month_transac, sales
FROM ( VALUES
( '511656A75', '2010-06-01', 68.57 ),
( '511656A75', '2010-07-01', 88.63 ),
( '511656A75', '2010-08-01', 94.91 ),
( '511656A75', '2010-09-01', 70.66 ),
( '511656A75', '2010-10-01', 28.84 ),
( '511656A75', '2015-10-01', 85.00 ),
( '511656A75', '2015-12-01', 114.42 ),
( '511656A75', '2016-01-01', 137.08 ),
( '511656A75', '2016-03-01', 172.92 ),
( '511656A75', '2016-04-01', 125.00 ),
( '511656A75', '2016-05-01', 127.08 ),
( '511656A75', '2016-06-01', 104.17 ), …Run Code Online (Sandbox Code Playgroud) postgresql performance join optimization postgresql-9.6 query-performance
我的生产 SQL Server 2012 有一个性能问题,它有 24 个内核和 32 GB 的 RAM。从等待类型我可以看到 CXPACKET 基于以下 SQL Server 指标位于顶部,我应该减少 MAXDOP 还是“并行的成本阈值”以避免更多的并行并减少 CXPACKET 等待类型?
任何帮助,将不胜感激。
performance sql-server optimization sql-server-2012 wait-types
我正在查看 TechNet 上列出的 SQL Server 物理运算符(不要判断,你知道你已经完成了)并读到哈希匹配物理运算符有时用于实现UNION逻辑运算符。
我从未见过这样做过,并想了解更多。一个示例查询会很棒。什么时候使用它,什么时候它比替代品更好?(这些通常是相同的,但并非总是如此。)
sql-server optimization execution-plan database-internals union
这个问题来自 SO,如果它移动到 DBA.SE ..
下面是测试数据:
--Main Table
CREATE TABLE [dbo].[LogTable]
(
[LogID] [int] NOT NULL
IDENTITY(1, 1) ,
[DateSent] [datetime] NULL,
)
ON [PRIMARY]
GO
ALTER TABLE [dbo].[LogTable] ADD CONSTRAINT [PK_LogTable] PRIMARY KEY CLUSTERED ([LogID]) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_LogTable_DateSent] ON [dbo].[LogTable] ([DateSent] DESC) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_LogTable_DateSent_LogID] ON [dbo].[LogTable] ([DateSent] DESC) INCLUDE ([LogID]) ON [PRIMARY]
GO
--Cross table
CREATE TABLE [dbo].[LogTable_Cross]
(
[LogID] [int] NOT NULL ,
[UserID] [int] NOT NULL
) …Run Code Online (Sandbox Code Playgroud) optimization ×10
performance ×8
sql-server ×4
mysql ×3
postgresql ×3
join ×2
exists ×1
index ×1
union ×1
wait-types ×1