Useful DQL
May 31, 2010 16 Comments
I love useful and clever DQL statements. This post will be the first of many (I’m sure) where I post a collection of DQL statements I have collected or created. This first batch is from my book.
Cabinet Content Size (Method 1)
Determine the amount of content in a particular cabinet. Replace ‘/Temp’ with the cabinet of your choice. You can also use the folder() DQL function instead of cabinet().
select sum(r_full_content_size)/1024 as cnt_size_kb from dm_sysobject (all) where cabinet('/Temp',descend);
Cabinet Content Size (Method 2)
A second way to determine the amount of content in a particular cabinet. This one summarizes and displays the size of the content in each individual sub-folder. Replace ‘/Temp’ with the cabinet of your choice. You can also use the folder() DQL function instead of cabinet(). Be aware, this query can take a long time to run.
select f.object_name as folder_name_name, sum(d.r_full_content_size)/1024 as cnt_size_kb from dm_folder f, dm_sysobject (all) d where any d.i_folder_id = f.r_object_id and cabinet('/Temp', descend) group by f.object_name order by object_name;
This query would be much cooler if it could return the r_folder_path for the folder instead of the object_name. As it is, with a lot of sub-folders, it is easy to lose context. If you can figure out how to return r_folder_path I’ll post an update.
UPDATE
So, I found the answer to this problem by accident on an ECN post by dnvhariprasad. Here is the query and the output:
SELECT fr.r_folder_path, count(*) as cnt, sum(r_full_content_size)/1024 as sizeKB FROM dm_sysobject s, dm_sysobject_r sr, dm_folder_r fr, dm_document dm WHERE s.i_is_deleted = 0 AND sr.i_position = -1 AND fr.i_position = -1 AND sr.r_object_id = s.r_object_id AND fr.r_object_id = sr.i_folder_id AND dm.r_object_id = s.r_object_id AND FOLDER('/Temp', descend) GROUP BY fr.r_folder_path
r_folder_path cnt sizekb /Temp 2 3 /Temp/Jobs/dce_Clean 2 2 /Temp/Jobs/dm_ContentWarning 3 11 /Temp/Jobs/dm_DataDictionaryPublisher 14 36 /Temp/Jobs/dm_FTCreateEvents 2 5 /Temp/Jobs/dm_FTIndexAgentBoot 5 6 /Temp/Jobs/dm_FTStateOfIndex 1 1 /Temp/Jobs/dm_GwmClean 3 0 /Temp/Jobs/dm_GwmTask_Alert 9 0 /Temp/Jobs/dm_QmPriorityAging 5 5
Get An Object’s Folder Path
Get an object’s folder path. Replace ‘My Document’ with the object name you are looking for.
select r_folder_path from dm_folder where r_object_id in (select i_folder_id from dm_sysobject where object_name = 'My Document');
Find Deleted Content
Find all the deleted content in the repository. This works well as long as the dm_Clean job has not run. A technique for undeleting content will be the subject of a future post.
select * from dmr_content where any parent_id is NULL and content_size > 0 order by set_time;
Unlock (i.e., Cancel Checkout) of an Object
Cancel the check out of an object. Replace ‘My Document’ with the object name you want to unlock.
update dm_sysobject object set r_lock_owner = '', set r_lock_machine = '', set r_lock_date = date('nulldate') where object_name = 'My Document';
Find the Components of a Virtual Document
Find the objects that belong to a virtual document. Replace ’09…97′ with the object id of the root virtual document.
select * from dm_sysobject in document id('0900218d8000ad97') descend;
Find an Object’s Virtual Document Parent
Determine if an object is part of a virtual document. Replace the object id, ’09…71′, with the i_chronicle_id of the child object.
select parent_id from dmr_containment where component_id ='0900218d80008d71';
Of course, if you have some favorite cool DQL, send it in an I will include it in a future post.
UPDATE: I just discovered that dnvhariprasad has posted a whole handful of useful TaskSpace DQLs on his blog. Check them out: https://community.emc.com/blogs/dctmreference/2010/05/20/dqls-related-to-taskspace
Cabinet Content Size (Method 1)
is this really sufficient in all cases? A document might have more than one dmr_content objects, and as i started summing these I got larger results (as we have some kind of this documents)
BTW: How to sum the size of virtual documents? I’m currently struggling with that…
LikeLike
I’ll have to look at the DQL for cabinet sizing with your question in mind. I don’t know if multiple dmr_content objects would skew the results or not.
In regard to your question about determining the size of a virtual document, try this:
select sum(r_full_content_size) from dm_document where i_chronicle_id in (select component_id from dmr_containment c where c.parent_id in (select r_object_id from dm_document where object_name = 'VD Root'))
LikeLike
For the cabinet or folder size the most common example might be reditions, as I understand documentum right. (they aren’t considered in webtop or DA directly but obviously they need space) I made a join between dm_document objects in the folder/cabinet and the corresponding dmr_content objects, which seems to work well to get the size of renditions as well.
For the virtual I tried to get the r_object_ids of virtual document parts with an IN DOCUMENT statement and check there which one is a vDoc as well and reslove the children there and then summed up the full_content_sizes of the related contents.
I will also have a try with your statement on monday (as I’m in europe I’m not at work any more and have currently no access to the beast 😉 )
LikeLike
hwt – I played around with this query this evening and it seems to produce the correct content size for a cabinet, including renditions. See what you think:
select sum(full_content_size)/1024 from dmr_content where any parent_id in (select r_object_id from dm_document (all) where cabinet(‘/Temp’))
LikeLike
See http://doquent.wordpress.com/2008/05/04/how-big-is-my-document/ for a discussion of exceptions when identifying the correct document size.
LikeLike
Sorry for answering a little late: I ended up with a similar query.
Until I double-checked the object reference, which is pointing out that dmr_content’s parent_id property is a repeating-value property.
After querying the docbase with some test query I found some cases where this aspect is important.
Currently I’m using something like:
select sum(full_content_size ) from dmr_content where r_object_id in (select distinct r.r_object_id from
dm_document (All) d, dmr_content r where folder(‘/test’, descend) and d.r_object_id = r.parent_id)
enable (ROW_BASED);
What do you think?
LikeLike
Looks good to me!
LikeLike
From the tests I’ve done the last days I also can’t tell anything different.
BTW: Did you (or someone else) ever experience some abnormalities when sorting by full_content_size (when not summing up the sizes)? I see some 0–sized results at the top or quie near to that when sorting descending the other documents seem to be ordered accurately.
LikeLike
Hi All,
Need a query to find the total documents and its size in docbase
LikeLike
Something like: select count(*), sum(r_full_content_size) from dm_sysobject (all)
You can also find this information in the State of the Docbase report
LikeLike
Can you please let me know, we have multiple folders and I need to find the largest amount of content is present in which folder. Is there any way to get it?
LikeLike
Doesn’t something like this work for you?
SELECT fr.r_folder_path, count(*) as cnt, sum(r_full_content_size)/1024 as sizeKB FROM dm_sysobject s, dm_sysobject_r sr, dm_folder_r fr, dm_document dm WHERE s.i_is_deleted = 0 AND sr.i_position = -1 AND fr.i_position = -1 AND sr.r_object_id = s.r_object_id AND fr.r_object_id = sr.i_folder_id AND dm.r_object_id = s.r_object_id AND FOLDER(‘/Temp’, descend) GROUP BY fr.r_folder_path
Or are you just looking or the folder with the most content? If so, simply remove the ‘descend’ parameter in the FOLDER() function.
LikeLike
Thanks for your reply. we are trying to find the top10 folders which contains most number of documents and which is high is content size as well. I tried the above query but its not that I’m looking for.
Please suggest.
Thanks.
Anmol
LikeLike
You can add some ORDER BY clauses at the end of the queries to order the results largest to smallest and just examine the top 10.
LikeLike
In addition to above query, while running down the first query sent by you I got ‘Error ORA-01555 contains the message, “snapshot too old’ error message, that is quite something new for me. Is there any way to resolve that as well.
Thanks.
Anmol
LikeLike
That’s an Oracle error; no idea what it means or the cause.
LikeLike