We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 38677
    • 21 Posts
    Yes, still new. Getting the hang of using (and generally loving) XPDO. But I definitely lack some understanding. I'd appreciate if somebody could have a quick look at this.

    This is my custom table schema.

    <?xml version="1.0" encoding="UTF-8"?>
    <model package="koshu" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
    	<object class="Agents" table="agents" extends="xPDOSimpleObject">
    		<field key="agent_code" dbtype="int" precision="6" phptype="integer" null="true" />
    		<field key="agent_group" dbtype="varchar" precision="4" phptype="string" null="true" />
    		<field key="agent_name" dbtype="varchar" precision="256" phptype="string" null="true" />
    		<field key="agent_country" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="agent_office" dbtype="varchar" precision="3" phptype="string" null="true" index="index" />
    		<index alias="OFFICE" name="OFFICE" primary="false" unique="false" type="BTREE" >
    			<column key="agent_office" length="" collation="A" null="true" />
    		</index>
    		<aggregate alias="Market" class="Markets" local="agent_office" foreign="id" cardinality="one" owner="foreign" />
    		<composite alias="Tour" class="Tours" local="id" foreign="tour_agentNumber" cardinality="many" owner="local" />
    	</object>
    	<object class="Markets" table="markets" extends="xPDOSimpleObject">
    		<field key="market_city" dbtype="varchar" precision="50" phptype="string" null="true" />
    		<field key="market_office" dbtype="varchar" precision="3" phptype="string" null="true" />
    	</object>
    	<object class="Remarks" table="remarks" extends="xPDOSimpleObject">
    		<field key="remark_date" dbtype="datetime" phptype="datetime" null="true" index="index" />
    		<field key="remark_creator" dbtype="varbinary" precision="12" phptype="binary" null="true" />
    		<field key="remark_level" dbtype="int" precision="1" phptype="integer" null="true" />
    		<field key="remark_type" dbtype="int" precision="2" phptype="integer" null="true" index="index" />
    		<field key="remark_tour" dbtype="int" precision="8" phptype="integer" null="true" index="index" />
    		<field key="remark_service" dbtype="int" precision="8" phptype="integer" null="true" index="index" />
    		<field key="remark_text" dbtype="text" phptype="string" null="true" />
    		<index alias="DATE" name="DATE" primary="false" unique="false" type="BTREE" >
    			<column key="remark_date" length="" collation="A" null="true" />
    		</index>
    		<index alias="TYPE" name="TYPE" primary="false" unique="false" type="BTREE" >
    			<column key="remark_type" length="" collation="A" null="true" />
    		</index>
    		<index alias="TOUR" name="TOUR" primary="false" unique="false" type="BTREE" >
    			<column key="remark_tour" length="" collation="A" null="true" />
    		</index>
    		<index alias="SERVICE" name="SERVICE" primary="false" unique="false" type="BTREE" >
    			<column key="remark_service" length="" collation="A" null="true" />
    		</index>
    		<aggregate alias="Service" class="Services" local="remark_service" foreign="id" cardinality="one" owner="foreign" />
    		<aggregate alias="Tour" class="Tours" local="remark_tour" foreign="id" cardinality="one" owner="foreign" />
    	</object>
    	<object class="Services" table="services" extends="xPDOSimpleObject">
    		<field key="service_status" dbtype="varchar" precision="4" phptype="string" null="true" index="index" />
    		<field key="service_lastUpdate" dbtype="datetime" phptype="datetime" null="true" index="index" />
    		<field key="service_tourno" dbtype="int" precision="10" phptype="integer" null="true" index="index" />
    		<field key="service_deadline_cfm" dbtype="datetime" phptype="datetime" null="true" />
    		<field key="service_key_so" dbtype="varchar" precision="10" phptype="string" null="true" />
    		<field key="service_key_ga" dbtype="varchar" precision="10" phptype="string" null="true" />
    		<field key="service_key_ok" dbtype="varchar" precision="10" phptype="string" null="true" />
    		<field key="service_price_so" dbtype="float" phptype="float" null="true" />
    		<field key="service_price_ga" dbtype="float" phptype="float" null="true" />
    		<field key="service_price_cfm" dbtype="float" phptype="float" null="true" />
    		<field key="service_supplement" dbtype="float" phptype="float" null="true" />
    		<field key="service_currency" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="service_priority" dbtype="int" precision="1" phptype="integer" null="true" default="0" />
    		<field key="service_difficultPeriod" dbtype="int" precision="1" phptype="integer" null="true" default="0" />
    		<field key="service_date" dbtype="datetime" phptype="datetime" null="true" />
    		<field key="service_cxlDate" dbtype="datetime" phptype="datetime" null="true" index="index" />
    		<field key="service_market" dbtype="int" precision="4" phptype="integer" null="true" default="0" index="index" />
    		<index alias="LASTUPDATE" name="LASTUPDATE" primary="false" unique="false" type="BTREE" >
    			<column key="service_lastUpdate" length="" collation="A" null="true" />
    		</index>
    		<index alias="TOUR" name="TOUR" primary="false" unique="false" type="BTREE" >
    			<column key="service_tourno" length="" collation="A" null="true" />
    		</index>
    		<index alias="MARKET" name="MARKET" primary="false" unique="false" type="BTREE" >
    			<column key="service_market" length="" collation="A" null="true" />
    		</index>
    		<index alias="STATUS" name="STATUS" primary="false" unique="false" type="BTREE" >
    			<column key="service_status" length="" collation="A" null="true" />
    		</index>
    		<index alias="CANCELALTION" name="CANCELALTION" primary="false" unique="false" type="BTREE" >
    			<column key="service_cxlDate" length="" collation="A" null="true" />
    		</index>
    		<aggregate alias="Market" class="Markets" local="service_market" foreign="id" cardinality="one" owner="foreign" />
    		<aggregate alias="Tour" class="Tours" local="service_tourno" foreign="tour_number" cardinality="one" owner="foreign" />
    		<composite alias="Remarks" class="Remarks" local="id" foreign="remark_service" cardinality="many" owner="local" />
    	</object>
    	<object class="Tours" table="tours" extends="xPDOSimpleObject">
    		<field key="tour_status" dbtype="varchar" precision="3" phptype="string" null="true" index="index" />
    		<field key="tour_lastUpdate" dbtype="datetime" phptype="datetime" null="true" index="index" />
    		<field key="tour_number" dbtype="int" precision="10" phptype="integer" null="true" default="0" index="unique" />
    		<field key="tour_name" dbtype="varchar" precision="45" phptype="string" null="true" />
    		<field key="tour_provisional" dbtype="int" precision="1" phptype="integer" null="true" default="0" index="index" />
    		<field key="tour_agentNumber" dbtype="int" precision="7" phptype="integer" null="true" default="0" />
    		<field key="tour_market" dbtype="int" precision="4" phptype="integer" null="true" default="0" index="index" />
    		<field key="tour_responsible_so" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="tour_opererator_so" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="tour_operator_aga" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="tour_controller" dbtype="varchar" precision="3" phptype="string" null="true" />
    		<field key="tour_pax" dbtype="int" precision="4" phptype="integer" null="true" default="0" />
    		<field key="tour_bookingstatus" dbtype="int" precision="4" phptype="integer" null="true" default="0" />
    		<field key="tour_date_ga" dbtype="datetime" phptype="datetime" null="true" />
    		<field key="tour_date_departure" dbtype="datetime" phptype="datetime" null="true" />
    		<field key="tour_deadline_cfm" dbtype="datetime" phptype="datetime" null="true" />
    		<field key="tour_profit_sold" dbtype="float" phptype="float" null="true" default="0" />
    		<field key="tour_profit_ga" dbtype="float" phptype="float" null="true" default="0" />
    		<index alias="TOURNUMBER" name="TOURNUMBER" primary="false" unique="true" type="BTREE" >
    			<column key="tour_number" length="" collation="A" null="true" />
    		</index>
    		<index alias="STATUS" name="STATUS" primary="false" unique="false" type="BTREE" >
    			<column key="tour_status" length="" collation="A" null="true" />
    		</index>
    		<index alias="PROVISIONAL" name="PROVISIONAL" primary="false" unique="false" type="BTREE" >
    			<column key="tour_provisional" length="" collation="A" null="true" />
    		</index>
    		<index alias="MARKET" name="MARKET" primary="false" unique="false" type="BTREE" >
    			<column key="tour_market" length="" collation="A" null="true" />
    		</index>
    		<index alias="LASTUPDATE" name="LASTUPDATE" primary="false" unique="false" type="BTREE" >
    			<column key="tour_lastUpdate" length="" collation="A" null="true" />
    		</index>
    		<aggregate alias="Market" class="Markets" local="tour_market" foreign="id" cardinality="one" owner="foreign" />
    		<composite alias="Services" class="Services" local="tour_number" foreign="service_tourno" cardinality="many" owner="local" />
    		<composite alias="Remarks" class="Remarks" local="id" foreign="remark_tour" cardinality="many" owner="local" />
    	</object>
    </model>


    I'm importing relatively large amounts of data - and that all works fine. But I find that my data retrieval doesn't only take too long, but also eats up way too much memory.

    Here an example. I make two separate calls.

    1. Get all services for a specific tour.

    $oServicesByTour = $modx->getCollection('Services', array('service_tourno' => 1285788));


    This returns 6 rows (of the 21510 in the table), takes 0 seconds and the RAM peaks out at 11.3 MB.

    The seconds call is getting all services by department:

    $oMarket = $modx->getObject('Markets',array('market_office' => 'TYO'));
    $oTours = $modx->getCollection('Services', array('service_market' => $oMarket->get('id')));


    This gets 8872 rows (of the 21510 in the table), takes 11 seconds and spikes at 126.31 mb RAM.

    What am I doing wrong?

    Thanks for any tips and tricks and hints.

    a.
      • 3548
      • 102 Posts
      Try using getIterator instead of getCollection (getCollection loads all objects into RAM at once). Also, joining tables is good practice (second call).
        Antonio Zdilar
        linearvector.com