A new sales manager joins, opens the Opportunity grid, and finds 34 views in the dropdown. Six are named “My Open Opps” with slight variations. Two come from a 2019 consultant who left. None of them include the Pipeline Stage column the team actually uses. This is view sprawl, and it makes Dynamics feel old long before the data does.
The Three View Types and Who Owns Them
System views are owned by the table and ship through solutions. Public views are owned by an environment user, usually the System Customizer, and appear to everyone with read access to the columns. Personal views belong to a single user and can be shared with others or with teams.
The governance failures cluster around the last two. Public views accumulate because makers create them in production for a single training session and never delete them. Personal views accumulate because users build them to solve a one-off filter and never clean up.
Inventory in One FetchXML
Pull the full view inventory before you negotiate any cleanup policy. The savedquery table holds system and public views, userquery holds personal views.
<fetch>
<entity name="userquery">
<attribute name="name" />
<attribute name="returnedtypecode" />
<attribute name="ownerid" />
<attribute name="modifiedon" />
<filter>
<condition attribute="modifiedon" operator="olderthan-x-months" value="12" />
</filter>
<order attribute="modifiedon" />
</entity>
</fetch>
Run the same shape against savedquery to find public views nobody has touched in a year. These are your retirement candidates.
The Naming Contract
Adopt a prefix convention and enforce it with a flow that emails the maker when a view name does not match. A workable shape is:
[Team] [Object] [Filter] [Sort]
SLS Opp Open by Close Date
SVC Case Active by Priority
ADM Audit System by User
Names without a team prefix are personal by default and do not need approval. Public views without a prefix get flagged for review.
Performance Cost of Wide Views
Every column on a view adds a join or a select to the underlying query. A view with 18 columns including three lookups to related tables will run roughly twice as slow as a focused view with seven columns. On the main grid this is the difference between a 400 millisecond paint and a noticeable 900 millisecond stall.
Open the most-used view on each top-five table, count columns, and trim anything not used in the last two weeks based on user feedback. Track grid performance in App Insights through the unified client telemetry feed.
Sharing Personal Views Cleanly
Users share personal views by emailing screenshots of the dropdown rather than using the Share button. Train them on the share dialog, and grant Append To privileges on userquery to the relevant teams. A shared personal view appears in the dropdown for the recipient with the original owner’s name, which is often clearer than promoting it to a public view.
Retiring Without Breaking Bookmarks
Deleting a view breaks any bookmark or saved link that referenced its query. Before deletion, replace the target with the closest surviving view and keep the old view for two weeks in a hidden state by removing it from app modules but leaving the savedquery row in place. Then delete after the bookmark window passes.
Quarterly Review Cadence
Once a quarter, run the inventory query, share the candidates with team leads, and delete the agreed list. Track the count over time. A healthy environment trends downward. An environment trending up has a maker who needs coaching or a permission that needs tightening.
What to do this week
Run the inventory FetchXML, share the top 20 stale views with their owners, and delete the ones nobody defends within five business days. Add the naming contract to your maker onboarding doc and make the quarterly review a recurring calendar entry.