我在尝试排查我们需要为内部目的运行的查询。这个查询不是应用程序的一部分,所以它不一定非常有效,但我希望它尽可能快,以便我们可以获得我们需要向前移动的数据集。通过多个连接优化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查询的,因为这样的数据库是建立。数据库是我们行业的标准,不是我想要改变的。应该指出,这个查询可能只会每几个月运行一次,所以优化它很重要,它不一定非常高效。对最终结果的唯一期望是,我们没有等待数据准备好的几天和几天。
我很欣赏这方面的任何指导,并且很抱歉,如果这是有点多问的建议。
删除'sql-server'标记。 – Kermit
谢谢先生 - 对不起! –
出于病态的好奇,这头野兽有什么执行计划? – Zane