2014-02-26 45 views
4

我在尝试排查我们需要为内部目的运行的查询。这个查询不是应用程序的一部分,所以它不一定非常有效,但我希望它尽可能快,以便我们可以获得我们需要向前移动的数据集。通过多个连接优化SQL查询

我遇到的第一个问题是查询被卡在统计状态。将通过添加以下到我们的MySQL配置补救......

optimizer_search_depth = 0 

现在查询顺利,到“将数据复制到tmp下表”,这已经发生了超过5分钟为止。我们的服务器功能非常强大,我们有128GB的内存,所以我不认为这是一个资源问题。我确实相信查询本身可能需要进行一些优化,如果可能的话,这就是我想要的指导。

“EXPLAIN SELECT”can be seen here的结果。在运行EXPLAIN SELECT之前,我对此数据库中的所有表执行“ANALYZE”(为此一次性查询而创建)。

查询本身是在这里:

SELECT DISTINCT 
     IAN.sku, 
     IAN.notes, 
     Parts.partterminologyname, 
     BaseVehicle.YearID, 
     Make.MakeName, 
     Model.modelname, 
     SubModel.SubModelName, 
     CONCAT(EngineBase.Cylinders, ' Cyl ', EngineBase.Liter, 'L') as engine, 
     Positions.position, 
     BedLength.BedLength, 
     BedLength.BedLengthMetric, 
     BedType.BedTypeName, 
     BodyNumDoors.BodyNumDoors, 
     BodyType.BodyTypeName, 
     FrontBrakeType.BrakeTypeName, 
     RearBrakeType.BrakeTypeName, 
     BrakeSystem.BrakeSystemName, 
     BrakeABS.BrakeABSName, 
     DriveType.DriveTypeName, 
     EngineDesignation.EngineDesignationName, 
     EngineVIN.EngineVINName, 
     Valves.ValvesPerEngine, 
     EngineBase.Liter, 
     EngineBase.CC, 
     EngineBase.CID, 
     EngineBase.Cylinders, 
     EngineBase.BlockType, 
     EngineBase.EngBoreIn, 
     EngineBase.EngBoreMetric, 
     EngineBase.EngStrokeIn, 
     EngineBase.EngStrokeMetric, 
     FuelDeliveryType.FuelDeliveryTypeName, 
     FuelDeliverySubType.FuelDeliverySubTypeName, 
     FuelSystemControlType.FuelSystemControlTypeName, 
     FuelSystemDesign.FuelSystemDesignName, 
     Aspiration.AspirationName, 
     CylinderHeadType.CylinderHeadTypeName, 
     FuelType.FuelTypeName, 
     IgnitionSystemType.IgnitionSystemTypeName, 
     EngineMfr.MfrName, 
     EngineVersion.EngineVersion, 
     PowerOutput.HorsePower, 
     PowerOutput.KilowattPower, 
     MfrBodyCode.MfrBodyCodeName, 
     SpringType.SpringTypeName, 
     SteeringType.SteeringTypeName, 
     SteeringSystem.SteeringSystemName, 
     TransmissionType.TransmissionTypeName, 
     TransmissionNumSpeeds.TransmissionNumSpeeds, 
     TransmissionMfrCode.TransmissionMfrCode, 
     TransElecControlled.ElecControlled, 
     TransmissionMfr.MfrName, 
     WheelBase.WheelBase, 
     WheelBase.WheelBaseMetric 
    FROM 
     Import_AcesApplication_New IAN 
     INNER JOIN BaseVehicle 
      ON IAN.base_vehicle_id = BaseVehicle.BaseVehicleID 
      INNER JOIN Make 
       ON BaseVehicle.MakeID = Make.MakeID 
      INNER JOIN Model 
       ON BaseVehicle.ModelID = Model.ModelID 
     INNER JOIN Positions 
      ON IAN.position_id = Positions.PositionID 
     INNER JOIN Parts 
      ON IAN.part_type_id = Parts.PartTerminologyID 
     INNER JOIN Vehicle 
      ON IAN.base_vehicle_id = Vehicle.BaseVehicleID 
      INNER JOIN SubModel 
       ON Vehicle.SubModelID = SubModel.SubModelID 
      INNER JOIN VehicleConfig 
       ON Vehicle.VehicleID = VehicleConfig.VehicleID 
       INNER JOIN EngineConfig 
        ON VehicleConfig.EngineConfigID = EngineConfig.EngineConfigID 
        INNER JOIN EngineBase 
        ON EngineConfig.EngineBaseID = EngineBase.EngineBaseID 
        INNER JOIN EngineDesignation 
        ON EngineConfig.EngineDesignationID = EngineDesignation.EngineDesignationID 
        INNER JOIN EngineVIN 
        ON EngineConfig.EngineVINID = EngineVIN.EngineVINID 
        INNER JOIN Valves 
        ON EngineConfig.ValvesID = Valves.Valvesid 
        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 EngineMfr 
        ON EngineConfig.EngineMfrID = EngineMfr.MfrID 
        INNER JOIN EngineVersion 
        ON EngineConfig.EngineVersionID = EngineVersion.EngineVersionID 
        INNER JOIN PowerOutput 
        ON EngineConfig.PowerOutputId = PowerOutput.PowerOutputId 
       INNER JOIN BedConfig 
        ON VehicleConfig.BedConfigID = BedConfig.BedConfigID 
        INNER JOIN BedLength 
        ON BedConfig.BedLengthID = BedLength.BedLengthID 
        INNER JOIN BedType 
        ON BedConfig.BedTypeID = BedType.BedTypeID 
       INNER JOIN BodyStyleConfig 
        ON VehicleConfig.BodyStyleConfigID = BodyStyleConfig.BodyStyleConfigID 
        INNER JOIN BodyNumDoors 
        ON BodyStyleConfig.BodyNumDoorsID = BodyNumDoors.BodyNumDoorsID 
        INNER JOIN BodyType 
        ON BodyStyleConfig.BodyTypeID = BodyType.BodyTypeID 
       INNER JOIN BrakeConfig 
        ON VehicleConfig.BrakeConfigID = BrakeConfig.BrakeConfigID 
        INNER JOIN BrakeType FrontBrakeType 
        ON BrakeConfig.FrontBrakeTypeID = FrontBrakeType.BrakeTypeID 
        INNER JOIN BrakeType RearBrakeType 
        ON BrakeConfig.RearBrakeTypeID = RearBrakeType.BrakeTypeID 
        INNER JOIN BrakeSystem 
        ON BrakeConfig.BrakeSystemID = BrakeSystem.BrakeSystemID 
        INNER JOIN BrakeABS 
        ON BrakeConfig.BrakeABSID = BrakeABS.BrakeABSID 
       INNER JOIN DriveType 
        ON VehicleConfig.DriveTypeID = DriveType.DriveTypeID 
       INNER JOIN MfrBodyCode 
        ON VehicleConfig.MfrBodyCodeID = MfrBodyCode.MfrBodyCodeID 
       INNER JOIN SpringType 
        ON VehicleConfig.SpringTypeConfigID = SpringType.SpringTypeID 
       INNER JOIN SteeringConfig 
        ON VehicleConfig.SteeringConfigID = SteeringConfig.SteeringConfigID 
        INNER JOIN SteeringType 
        ON SteeringConfig.SteeringConfigID = SteeringType.SteeringTypeID 
        INNER JOIN SteeringSystem 
        ON SteeringConfig.SteeringSystemID = SteeringSystem.SteeringSystemID 
       INNER JOIN Transmission 
        ON VehicleConfig.TransmissionID = Transmission.TransmissionID 
        INNER JOIN TransmissionBase 
        ON Transmission.TransmissionBaseID = TransmissionBase.TransmissionBaseID 
        INNER JOIN TransmissionType 
         ON TransmissionBase.TransmissionTypeID = TransmissionType.TransmissionTypeID 
        INNER JOIN TransmissionNumSpeeds 
         ON TransmissionBase.TransmissionNumSpeedsID = TransmissionNumSpeeds.TransmissionNumSpeedsID 
        INNER JOIN TransmissionControlType 
         ON TransmissionBase.TransmissionControlTypeID = TransmissionControlType.TransmissionControlTypeID 
        INNER JOIN TransmissionMfrCode 
        ON Transmission.TransmissionMfrCodeID = TransmissionMfrCode.TransmissionMfrCodeID 
        INNER JOIN ElecControlled TransElecControlled 
        ON Transmission.TransmissionElecControlledID = TransElecControlled.ElecControlledID 
        INNER JOIN Mfr TransmissionMfr 
        ON Transmission.TransmissionMfrID = TransmissionMfr.MfrID 
       INNER JOIN WheelBase 
        ON VehicleConfig.WheelbaseID = WheelBase.WheelBaseID 
    LIMIT 
     0,10 

有很多种,主要JOINS查询的,因为这样的数据库是建立。数据库是我们行业的标准,不是我想要改变的。应该指出,这个查询可能只会每几个月运行一次,所以优化它很重要,它不一定非常高效。对最终结果的唯一期望是,我们没有等待数据准备好的几天和几天。

我很欣赏这方面的任何指导,并且很抱歉,如果这是有点多问的建议。

+0

删除'sql-server'标记。 – Kermit

+0

谢谢先生 - 对不起! –

+1

出于病态的好奇,这头野兽有什么执行计划? – Zane

回答

2

您的查询似乎已完美布局。您的主表是“Import_AcesApplication_New”表,其余的都是派生自主表的查找表。我有一个类似的问题与政府补助/合同查询做查询到20+表和哽咽查询并且是同15+万条记录

通过简单地添加关键字

“STRAIGHT_JOIN”

选择STRAIGHT_JOIN [其余查询]

它强制引擎运行查询“以您呈现的顺序”。它可能试图通过一些奇怪的表格选择来自己分析哪个表具有最低的记录,最好的索引等,并且自己向后工作。

此外,通过层次编辑原始查询,以便更好地显示相关链接,可读性

我希望所有的查找表来对他们的主键索引,但你也可以通过具有覆盖索引这样的原始数据中获益每次查询的页面不一定是必需的。

Table      Index suggestion 
Import_AcesApplication_New (sku, notes, base_vehicle_id, position_id, part_type_id) 
BaseVehicle     (BaseVehicleID, MakeID, ModelID, YearID) 
Make      (MakeID, MakeName) 
Model      (ModelID, modelname) 
Positions     (PositionID, Position) 
Parts      (PartTerminologyID, partterminologyname) 
Vehicle      (BaseVehicleID, SubModelID, VehicleID) 
SubModel     (SubModelID, SubModelName) 
VehicleConfig    (VehicleID) -- too many other fields to be practical 
EngineConfig    (EngineConfigID) -- too many to be practical 
EngineBase     (EngineBaseID) -- too many to be practical 
EngineDesignation   (EngineDesignationID, EngineDesignationName) 
EngineVIN     (EngineVINID, EngineVINName) 
Valves      (Valvesid, ValvesPerEngine) 
FuelDeliveryConfig   (FuelDeliveryConfigID, FuelDeliveryTypeID, FuelDeliverySubTypeID, FuelSystemControlTypeID, FuelSystemDesignID) 
FuelDeliveryType   (FuelDeliveryTypeID, FuelDeliveryTypeName) 
FuelDeliverySubType   (FuelDeliverySubTypeID, FuelDeliverySubTypeName) 
FuelSystemControlType  (FuelSystemControlTypeID, FuelSystemControlTypeName) 
FuelSystemDesign   (FuelSystemDesignID, FuelSystemDesignName) 
Aspiration     (AspirationID, AspirationName) 
CylinderHeadType   (CylinderHeadTypeID, CylinderHeadTypeName) 
FuelType     (FuelTypeID, FuelTypeName) 
IgnitionSystemType   (IgnitionSystemTypeID, IgnitionSystemTypeName) 
EngineMfr     (MfrID, MfrName) 
EngineVersion    (EngineVersionID, EngineVersion) 
PowerOutput     (PowerOutputId, HorsePower, KilowattPower) 
BedConfig     (BedConfigID, BedLengthID, BedTypeID) 
BedLength     (BedLengthID, BedLength, BedLengthMetric 
BedType      (BedTypeID, BedTypeName) 
BodyStyleConfig    (BodyStyleConfigID, BodyNumDoorsID, BodyTypeID) 
BodyNumDoors    (BodyNumDoorsID, BodyNumDoors) 
BodyType     (BodyTypeID, BodyTypeName) 
BrakeConfig     (BrakeConfigID, FrontBrakeTypeID, RearBrakeTypeID, BrakeSystemID, BrakeABSID) 
BrakeType     (BrakeTypeID, BrakeTypeName) 
BrakeSystem     (BrakeSystemID, BrakeSystemName) 
BrakeABS     (BrakeABSID, BrakeABSName) 
DriveType     (DriveTypeID, DriveTypeName) 
MfrBodyCode     (MfrBodyCodeID, MfrBodyCodeName) 
SpringType     (SpringTypeID, SpringTypeName) 
SteeringConfig    (SteeringConfigID, SteeringTypeID, SteeringSystemID) -- see note below indexes via JOIN 
SteeringType    (SteeringTypeID, SteeringTypeName) 
SteeringSystem    (SteeringSystemID, SteeringSystemName) 
Transmission    (TransmissionID, TransmissionBaseID) 
TransmissionBase   (TransmissionBaseID, TransmissionTypeID, TransmissionNumSpeedsID, TransmissionControlTypeID) 
TransmissionType   (TransmissionTypeID, TransmissionTypeName) 
TransmissionNumSpeeds  (TransmissionNumSpeedsID, TransmissionNumSpeeds) 
TransmissionControlType  (TransmissionControlTypeID, ???) -- possible description column per note below 
TransmissionMfrCode   (TransmissionMfrCodeID, TransmissionMfrCode) 
ElecControlled    (ElecControlledID, ElecControlled) 
Mfr       (MfrID, MfrName) 
WheelBase     (WheelBaseID, WheelBase, WheelBaseMetric) 

还,同时看着这些连接获得覆盖索引,我注意到联接到转向配置到转向型基础上

ON SteeringConfig.SteeringConfigID = SteeringType.SteeringTypeID 

如果这已经被做...

ON SteeringConfig.SteeringTypeID = SteeringType.SteeringTypeID 

在另一个项目... TransmissionControlType连接到,但你不拉从任何列在输出查询......可能已经有这么多的表稍有疏忽/连接。

这些应该对查询中的覆盖索引有很大帮助

+0

感谢您提供类似案例的帮助并提供您自己的体验。我开始用你的建议来运行查询,现在它似乎正在移动。我很快会报告回复这10条记录需要多长时间,但它肯定比它更好(在统计中被锁住了整晚)。 –

+0

关于STRAIGHT_JOIN的好建议。我还建议检查以确保所有正在连接的密钥都被编入索引。您可以逐个添加一个连接,直到查询性能开始下降,从而解决像这样的极长查询问题。那么你会更好地了解你的瓶颈在哪里。 – dartonw

+0

@BrianSchroeter,修订后的内容显示了我在覆盖索引方面的内容,以及关于可能的错误JOIN的发现。 – DRapp