WARNINGThis is out of the box, non-standard, and not supported. Proceed at your own risk. Make sure you have a backup. Don't try this at home (more likely work).
UPDATE 11/12/2020: I added some more details and comments about the code
Tableau server only allows you to set the cache for everything server wide. I have our server set at 12 hours. This is a pretty good compromise for things that update monthly, weekly, or daily. Newer versions of Tableau will dump the cache if an extract refreshes or the workbook is republished but a dashboard with a live database connection also gets that 12 hour cache. Mark Wu has a great article about how to manage this. I chatted with Mark last week at TC19 and got some really good insights. His solution is to add 1 millisecond to the last_published_at value for the workbook. His blog doesn't include code so below is what I came up with. Since the workbook thinks it has been updated it will dump the cache.
There are comments in the code, but there are some things I am checking for:
- Who tagged it? Unless the tagger was the owner, site admin, or server admin I will ignore the tag.
- Does the workbook have an extract? This is intended for live database connections where the data is constantly changing. Extracts refreshes trigger a cache reload automatically so we want to use the cache.
I run it every 5 minutes, but there is no reason you couldn't extend the idea to using multiple tags and having a more customizable cache. Something like a '1h-cache' tag to update it hourly and '15m-cache' that runs every 15 minutes.
/* The idea here is to refresh the cache ala http://enterprisetableau.com/cache3/ How it works: This update statement will increment the published date for a workbook view tagged 'no-cache' by 1 millisecond This forces the cache to be ignored and requery the database. */
update workbooks w set last_published_at = last_published_at + interval '1 millisecond' FROM views v ,taggings ts ,tags t ,users u ,system_users su where v.workbook_id = w.id AND ts.user_id=u.id AND su.id=u.system_user_id AND v.id=ts.taggable_id AND ts.tag_id=t.id AND t.name='no-cache' --the tag we are looking for AND (w.owner_id=ts.user_id --owner tagged the workbook OR su.admin_level=10 --OR a server admin tagged it OR u.site_role_id=0 --OR a site admin tagged it ) -- we are going to ignore it if it the workbook has an extract AND (w.refreshable_extracts=false OR w.incrementable_extracts=false);
For some reason the if I tag a workbook it shows as the view being tagged in the repository. I also set it to only do this for tags that were created by an admin (server or site) or the workbook owner.
No comments:
Post a Comment