mysql 调sp_MySql嵌套SP可以成为瓶颈吗?

我们有这个MySQL SP,它称为嵌套SP.似乎在负载下表现不佳.

此SP可能在加载时变慢,因为它调用了嵌套SP并使用临时表将数据传递给主SP?

DELIMITER $$

drop procedure if exists `GeoAreaFlattened_Select`;

create procedure `GeoAreaFlattened_Select`(

_areas MEDIUMTEXT,

_comparisonGroup varchar(21844),

_parentArea varchar(21844),

_areaType varchar(21844)

)

begin

drop temporary table if exists areas;

-- areas

call CreateAreas(_areas, _comparisonGroup, _parentArea, _areaType);

SELECT

areas.ID,

areas.Code,

areas.Name,

areas.LevelId,

GeoAreaLevel.Name AS AreaTypeLabel,

GeoAreaLevel.Identifier AS AreaTypeIdentifier

FROM

areas

INNER JOIN

GeoAreaLevel

ON

areas.levelid = GeoAreaLevel.id

ORDER BY areas.name ASC;

drop temporary table areas;

end

嵌套的SP:

-- --------------------------------------------------------------------------------

-- Routine DDL

-- Note: comments before and after the routine body will not be stored by the server

-- --------------------------------------------------------------------------------

drop procedure if exists `CreateAreas`;

DELIMITER $$

CREATE PROCEDURE `CreateAreas`(

_areas varchar(21844),

_comparisonGroup varchar(21844),

_parentArea varchar(21844),

_areaType varchar(21844)

)

BEGIN

-- create temporary table "areas"

-- fill with area ids

create temporary table areas (

id int not null,

code varchar(30),

name varchar(100),

shortName varchar(100),

levelid int not null,

sortOrder int not null,

key (id)

);

-- assumes that only one of the 3 options is valid, areas, comparison group, bounded comparison group

if (_areas is not null) then

set @sql = concat('insert into areas (id, code, name, shortName, levelid, sortOrder) select id, Code, Name, ShortName, LevelID, 0 from GeoArea where Code in (''', replace(_areas, ',', ''','''), ''')');

prepare stmt from @sql;

execute stmt;

deallocate prepare stmt;

elseif (_comparisonGroup is not null) then

-- might not be the most efficient way, but is consistent with the approach above, and we do not expect the list to be long

insert into areas (id, code, name, shortName, levelid, sortOrder)

select GeoAreaID, GeoArea.Code, GeoArea.Name, GeoArea.ShortName, GeoArea.LevelID, SortOrder

from ComparisonGroupGeoAreaLink

INNER JOIN

GeoArea

ON GeoArea.ID = GeoAreaID

where ComparisonGroupID = (select id from ComparisonGroup where Identifier = _comparisonGroup)

and IsMember = 1;

elseif (_parentArea is not null and _areaType is not null) then

-- might not be the most efficient way, but is consistent with the approach above, and we do not expect the list to be long

insert into areas (id, code, name, shortName, levelid, sortOrder)

select a.ID, a.Code, a.Name, a.ShortName, a.LevelID, 0

from (select id from GeoArea where Code = _parentArea) as t

INNER JOIN

GeoAreaLinkCache c

ON

c.ParentAreaID = t.id

inner join GeoArea a

on c.ChildAreaID = a.ID

INNER JOIN

(select id from GeoAreaLevel where Identifier = _areaType) as l

ON

a.LevelID = l.id;

elseif (_areaType is not null) then

-- might not be the most efficient way, but is consistent with the approach above, and we do not expect the list to be long

set @sql = concat('insert into areas (id, code, name, shortName, levelid, sortOrder)

select a.ID, a.Code, a.Name, a.ShortName, a.LevelID, 0

from

(select id from GeoAreaLevel where Identifier in (''', replace(_areaType, ',', ''','''), ''')) l

INNER JOIN

GeoArea a

ON

a.LevelID = l.id');

prepare stmt from @sql;

execute stmt;

deallocate prepare stmt;

end if;

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值