but RLS is still not fast. For example, without RLS, reports work very fast (almost instantaneous) but after applying RLS, some of them take a very long time (almost 1 min in some cases). So I'm guessing it comes down to a faster alternative for CONTAINSSTRING dax query.
1. string concatenated email id's of users (;email@example.com;firstname.lastname@example.org;email@example.com)
2. containsstring([VIEWERS],(lower(USERPRINCIPALNAME())))=TRUE for the role where VIEWERS contains this concatenated email id's
Am I doing anything wrong in the logic above? We have a lot of business rules, hence concatenating email id's in the backend based on the logic seemed like the best option.
Use RLS for all your users so that Power BI has to query the backend server separately and cache separate reports for every user, which might slow down the report performance. This is a design issue and may have little to do with your guess.
I searched for power bi relationship bi but not found documents that mentioned how to mapping rows without affect performance. Since power bi data model stored data at AS instance, maybe you can take a look at AS tabular model RLS related document: