Data Governance & Lineage • Fine-grained Access Control & PoliciesHard⏱️ ~3 min
FGAC Design Trade-offs: When to Use What
The Central Tension:
Choosing an access control strategy means balancing precision against performance, centralization against flexibility, and security against developer productivity. There is no universally correct answer. The right choice depends on your read to write ratio, user scale, data sensitivity, and organizational structure.
Performance versus Precision:
Very granular row level filters can significantly increase planning and execution time. A query that normally scans 200 gigabytes and finishes in 5 seconds might degrade to 20 seconds p99 if the engine cannot efficiently push down user specific predicates. This happens when predicates reference complex functions or external lookups that break index usage.
Some teams deliberately accept slightly broader access with coarser filters in exchange for predictable performance. For example, filtering by department instead of individual user IDs reduces permission table size from millions to hundreds of rows. The trade off is that some users see data from colleagues in the same department that they do not strictly need.
Centralization versus Flexibility:
Central policy engines like Unity Catalog or Lake Formation give you one place to manage rules and generate audit logs. But they can be slower to evolve and might not capture application specific logic. If your recommendation system needs to filter based on complex user preference graphs, encoding that in a central policy language is painful.
In contrast, embedding access control in application code gives teams more control and faster iteration. But it risks inconsistent policies where the data warehouse enforces one set of rules, the search index enforces different rules, and the mobile API has yet another implementation. When you explain this trade off in an interview, emphasize who owns policies and how you prevent divergence.
Security versus Productivity:
Strict fine grained controls on development and staging data reduce risk of leaking production information, but they slow down debugging and experimentation. Some systems adopt secure by default where policies apply everywhere. This forces developers to work with anonymized data, which surfaces data quality issues earlier but makes reproducing production bugs harder.
Others allow more open access in non production environments but require more rigor in data anonymization pipelines. The key question is whether your threat model includes insider threats from developers with environment access.
When to Choose Pre Filtered Views:
Despite the data duplication, pre filtered materialized views make sense when access patterns are stable and user populations are discrete. If you have exactly three business units that never overlap in their data needs, maintaining three filtered copies is simpler than dynamic row level security. Views are easier to reason about, perform better, and avoid policy evaluation overhead entirely.
Choose built in FGAC when user attributes change frequently, access patterns are unpredictable, or you have thousands of distinct permission combinations that would explode into unmanageable view counts.
Built In FGAC
Dynamic, consistent, but adds 10-20% query overhead
vs
Pre Filtered Views
Fast, simple, but creates data duplication
"The real decision is not whether to use FGAC. It is where to draw the line between central policies for compliance and application logic for business rules."
💡 Key Takeaways
✓Very granular predicates can add 10 to 20% query overhead; sometimes coarser filters trading precision for performance make sense
✓Central policy engines ensure consistency but slow evolution; application embedded controls offer flexibility but risk divergence
✓Pre filtered materialized views perform better and are simpler but duplicate data; use when access patterns are stable
✓Secure by default in non production slows debugging; open non production access requires strong anonymization pipelines
✓The decision framework is: how often do permissions change, how many distinct combinations exist, and what is your read versus write ratio
📌 Examples
1Team chooses department level filtering instead of user level, reducing permission table from 5 million to 500 rows and improving join performance by 40%
2Company maintains 3 pre filtered views for business units rather than dynamic FGAC because access never overlaps and queries run 3x faster
3Development environment uses full production policies with anonymized data, catching data quality bugs early but requiring sophisticated anonymization pipeline