A further update on this one from today's investigation.
I've applied some varring to the Core. To be honest VarScoper is giving me back a lot so without working out what's persisted and what's not it was easier to just focus on the main ones I've mentioned already.
We've not applied these yet but we have switch on CF Server Monitoring and that's brought up some interesting results.
It seems that the database (mySQL) is struggling to process some of the queries we're firing through to it. The biggest culprit being the News Listing Rules that are filtered by Category. Currently this type of query (see below) is taking around a 1mins to 2mins to process.
This generated through the FAPI getContentObject() method....
select objectid, 'dmNews' as typename
from dmNews
where1=1
AND status in ('approved')
AND
(
publishDate is null
OR publishDate = '2050-01-01 00:00:00'
OR publishDate > '2111-12-08 15:51:06'
OR publishDate <= '2011-12-08 15:51:06'
)
AND
(
expiryDate is null
OR expiryDate = '2050-01-01 00:00:00'
OR expiryDate > '2111-12-08 15:51:06'
OR expiryDate >= '2011-12-08 15:51:06'
)
AND
objectid in (
selectobjectid
fromrefCategories
wherecategoryid in ('xxxxxxxx,xxxxxxx')
group byobjectid
havingcount(objectid)=2
)
ORDER BY publishdate DESC;
----
We've tried switching on some indexing but that doesn't seem to have made any difference so a bit more delving into this we've found out the use of IN within mySQL is a real performance hit. A good article on it here:-
http://www.artfulsoftware.com/infotree/queries.php#568
The recommendation seems to be that the queries within getContentObjects, for mySQL anyway, should be formatted like so:-
objectid in (
select
objectid from (
select
objectid
from
#application.dbowner#refCategories
where categoryid in (<cfqueryparam
cfsqltype="#f.sqltype#" list="true"
value="#f.value#" />)
group by objectid
having
count(objectid)=<cfqueryparam cfsqltype="cf_sql_integer"
value="#listlen(f.value)#" />
) as tmp
)
I'm still to test this in the project but we're certaintly seeing an improvement when we run this SQL directly through the database.
Anyway update over, hope it's of some help
Cheers,
James