SQL 查询卡在统计状态

问题描述 投票:0回答:5

我今天一直在解决这个复杂的查询,认为这是一个性能问题。查询似乎陷入了“统计”状态。目前该状态已持续 1300 秒。

我已经检查了所涉及表的索引——我已经优化了该表——什么可能导致此挂起?

SELECT
    Import_Values.id,
    Import_Values.part_id,
    Import_Values.qty,
    Import_Values.note,
    Parts.partterminologyname,
    GROUP_CONCAT(BaseVehicle.YearID, ' ', Make.MakeName, ' ', Model.modelname, ' ', SubModel.SubModelName SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineDesignation.EngineDesignationName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineVIN.EngineVINName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.Liter) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.CC) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.CID) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.Cylinders) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.BlockType) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngBoreIn) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngBoreMetric) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngStrokeIn) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineBase.EngStrokeMetric) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelDeliveryType.FuelDeliveryTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelDeliverySubType.FuelDeliverySubTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelSystemControlType.FuelSystemControlTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelSystemDesign.FuelSystemDesignName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Aspiration.AspirationName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(CylinderHeadType.CylinderHeadTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(FuelType.FuelTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(IgnitionSystemType.IgnitionSystemTypeName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Mfr.MfrName) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(EngineVersion.EngineVersion) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(Valves.ValvesPerEngine) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(BedLength.BedLength) SEPARATOR ', '),
    GROUP_CONCAT(DISTINCT(BedLength.BedLengthMetric) SEPARATOR ', ')
    FROM 
    Import_Values
    INNER JOIN BaseVehicle 
        ON Import_Values.base_vehicle_id=BaseVehicle.BaseVehicleID
    INNER JOIN Parts 
        ON Import_Values.part_type_id=Parts.PartTerminologyID
    INNER JOIN Make
        ON BaseVehicle.MakeID=Make.MakeID
    INNER JOIN Model
        ON BaseVehicle.ModelID=Model.ModelID
    INNER JOIN Vehicle
        ON Import_Values.base_vehicle_id=Vehicle.BaseVehicleID
    INNER JOIN SubModel
        ON Vehicle.SubModelID=SubModel.SubModelID
    INNER JOIN VehicleToEngineConfig
        ON Vehicle.VehicleID=VehicleToEngineConfig.VehicleID
    INNER JOIN EngineConfig
        ON VehicleToEngineConfig.EngineConfigID=EngineConfig.EngineConfigID
    INNER JOIN EngineDesignation
        ON EngineConfig.EngineDesignationID=EngineDesignation.EngineDesignationID
    INNER JOIN EngineVIN
        ON EngineConfig.EngineVINID=EngineVIN.EngineVINID
    INNER JOIN EngineBase
        ON EngineConfig.EngineBaseID=EngineBase.EngineBaseID
    INNER JOIN FuelDeliveryConfig
        ON EngineConfig.FuelDeliveryConfigID=FuelDeliveryConfig.FuelDeliveryConfigID
    INNER JOIN FuelDeliveryType
        ON FuelDeliveryConfig.FuelDeliveryTypeID=FuelDeliveryType.FuelDeliveryTypeID
    INNER JOIN FuelDeliverySubType
        ON FuelDeliveryConfig.FuelDeliverySubTypeID=FuelDeliverySubType.FuelDeliverySubTypeID
    INNER JOIN FuelSystemControlType
        ON FuelDeliveryConfig.FuelSystemControlTypeID=FuelSystemControlType.FuelSystemControlTypeID
    INNER JOIN FuelSystemDesign
        ON FuelDeliveryConfig.FuelSystemDesignID=FuelSystemDesign.FuelSystemDesignID
    INNER JOIN Aspiration
        ON EngineConfig.AspirationID=Aspiration.AspirationID
    INNER JOIN CylinderHeadType
        ON EngineConfig.CylinderHeadTypeID=CylinderHeadType.CylinderHeadTypeID
    INNER JOIN FuelType
        ON EngineConfig.FuelTypeID=FuelType.FuelTypeID
    INNER JOIN IgnitionSystemType
        ON EngineConfig.IgnitionSystemTypeID=IgnitionSystemType.IgnitionSystemTypeID
    INNER JOIN Mfr
        ON EngineConfig.EngineMfrID=Mfr.MfrID
    INNER JOIN EngineVersion
        ON EngineConfig.EngineVersionID=EngineVersion.EngineVersionID
    INNER JOIN Valves
        ON EngineConfig.ValvesID=Valves.Valvesid
    INNER JOIN VehicleToBedConfig
        ON Vehicle.VehicleID=VehicleToBedConfig.VehicleID
    INNER JOIN BedConfig
        ON VehicleToBedConfig.BedConfigID=BedConfig.BedConfigID
    INNER JOIN BedLength
        ON BedConfig.BedLengthID=BedLength.BedLengthID
    GROUP BY part_id
mysql sql database optimization
5个回答
49
投票

我最近遇到了同样的问题:MySQL 在有很多表连接在一起的查询上开始阻塞(卡在“统计”状态)。我发现了一篇很好的博客文章解释了为什么会发生这种情况以及如何解决它。

基本上至少在MySQL 5.5中,配置参数optimizer_search_depth的默认值为62,这将导致查询优化器随着查询中表数量的增加而花费指数级更多的时间。在某一点之后,将开始需要几天甚至更长的时间才能完成查询。

但是,如果您在 my.cnf 中将 optimizer_search_depth 设置为 0,MySQL 会自动选择合适的深度,但将其限制为 7,这还不算太复杂。

显然这个问题在 MySQL 5.6 中已被修复,但我还没有亲自测试过。


1
投票

我在 Centos 服务器 4 核和 180GB 内存上遇到了同样的问题。就像您所解释的那样,一个简单的查询需要永远运行并停留在统计状态上。我在它正在查询的表上运行了

OPTIMIZE TABLE
,大约 5 分钟后问题就解决了。但我从来不知道它是否真的解决了问题。

只是一个建议。


0
投票

我昨天花了一天时间处理一个同样麻烦的查询......

快速消除查询优化器挂起的另一个选项是在

STRAIGHT_JOIN
之后添加
SELECT

例如:

SELECT STRAIGHT_JOIN
table1.column_a,
table1.column_b,
table2.column_a,
table2.column_b
FROM table1
JOIN table2 USING(column_a)

这不是一个理想的解决方案,因为它完全绕过了连接的查询优化,但如果您像我昨天一样在遗留应用程序中解决关键任务问题,它可能会有所帮助。我不建议在每个查询上都使用这个,但在某些情况下这是一个有效的解决方案。


0
投票

就我而言,这是一个巨大的数据库 - 许多数据库,许多表。启动后,Mariadb 运行缓慢,所有查询执行速度不够快,而是停留在“统计”上。 我做了三件事:

  • 将文件限制增加到 4000000
    etc/systemd/system/multi-user.target.wants/mariadb.service
  • 增加
    open_files_limit
    table_definition_cache
    至约2500000
  • table_open_cache
    table_definition_cache
    更改为约 3000
  • 为 Mariadb 安装了“
    libjemalloc
    ”,因为内存使用量仍在增长。

问题就解决了。当然,您不必将这些数字设置得太高,这取决于您的数据库、表和文件的数量。


0
投票

遇到这个,并显示

/tmp
只是满了,因为有人缩小了它的大小......

[Warning] Disk is full writing '/tmp/#sql_e31_0.MYI' (Errcode: 28 - No space left on device). Waiting for someone to free space...

调整大小

/tmp
并重新启动,已修复。

© www.soinside.com 2019 - 2024. All rights reserved.