标签: optimization

使用小 LIMIT 优化查询,对一列进行谓词并按另一列排序

我使用的是 Postgres 9.3.4,我有 4 个查询,它们的输入非常相似,但响应时间却大不相同:

查询#1

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)

查询#2

EXPLAIN …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index optimization postgresql-9.3 postgresql-performance

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

列基数和总行数相等

我有一个包含 128'914'635 行的表。某些列的基数(即地址、姓氏、名字)等于表中的总行数 (128'914'635)。这个表上的查询真的很慢,当我在连接中使用这个表时,它们不使用任何索引。

你有什么想法为什么基数等于表中的总数或行数?

  • 运行分析表
  • 同表整理也没有在解释扩展中进行转换
  • 力指数不起作用

我们在下面的问题中描述了一个类似的问题。唯一的区别是我们有相同的整理表,而 Explain Extended 没有显示显式转换。

MySQL忽略索引,索引基数与表中的记录数相同(?!)

但是为什么仍然没有使用索引并且字段(地址字段)的基数与表行数相同?



表定义

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)

mysql performance optimization query-performance

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

在查询中重复相同的功能

在下面的查询中,有重复的计算,例如对 的三个调用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示例数据库上运行。

mysql optimization

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

当索引扫描会更好时,为什么 PostgreSQL 选择慢速 Seq 扫描?

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

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

SQL Server OR 运算符导致大量循环连接

下面的查询非常慢(运行超过一分钟),我已将问题缩小到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

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

添加 where 条件后,Mysql 查询需要永远

我有一个 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 …

mysql performance optimization query-performance

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

当前行日期过去 12 个月的总销售额

我需要根据给定月份的每一行计算给定 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

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

SQL Server 性能问题(CXPACKET 等待类型)

我的生产 SQL Server 2012 有一个性能问题,它有 24 个内核和 32 GB 的 RAM。从等待类型我可以看到 CXPACKET 基于以下 SQL Server 指标位于顶部,我应该减少 MAXDOP 还是“并行的成本阈值”以避免更多的并行并减少 CXPACKET 等待类型?

任何帮助,将不胜感激。

在此处输入图片说明

performance sql-server optimization sql-server-2012 wait-types

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

使用哈希匹配运算符实现的联合

我正在查看 TechNet 上列出的 SQL Server 物理运算符(不要判断,你知道你已经完成了)并读到哈希匹配物理运算符有时用于实现UNION逻辑运算符

我从未见过这样做过,并想了解更多。一个示例查询会很棒。什么时候使用它,什么时候它比替代品更好?(这些通常是相同的,但并非总是如此。)

sql-server optimization execution-plan database-internals union

5
推荐指数
3
解决办法
1532
查看次数

查询显示排序成本,即使需要的索引可用

这个问题来自 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)

performance sql-server optimization query-performance

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