আমি সম্প্রতি ভিএস ২০১০-তে আপগ্রেড করেছি এবং লিনকুইয়ের সাথে ডেটাসেটে প্রায় খেলছি। অনুমোদনের জন্য আমার কাছে শক্তিশালী টাইপ করা ডেটাसेट রয়েছে যা একটি এএসপি.নেট ওয়েব অ্যাপ্লিকেশনটির এইচটিপিচিতে রয়েছে।
সুতরাং আমি জানতে চেয়েছিলাম যে ব্যবহারকারী কোনও কিছুর জন্য অনুমোদিত কিনা তা যাচাই করার দ্রুততম উপায়টি। কারও আগ্রহী হলে এখানে আমার ডেটামোডেল এবং অন্যান্য কিছু তথ্য।
আমি 3 টি উপায় পরীক্ষা করেছি:
- সরাসরি ডাটাবেস
- সঙ্গে LINQ ক্যোয়ারী কোথায় হিসাবে "যোগদান করুন" অবস্থা - সিনট্যাক্স
- যোগদান - সিনট্যাক্স সহ লাইনকিউ ক্যোয়ারী
প্রতিটি ফাংশনে 1000 টি কল সহ এগুলি ফলাফল:
1. সূচনা:
- 4,2841519 সেকেন্ড
- 115,7796925 সেকেন্ড।
- 2,024749 সেকেন্ড
2.Iteration:
- 3,1954857 সেকেন্ড
- 84,97047 সেকেন্ড।
- 1,5783397 সেকেন্ড
3.Iteration:
- 2,7922143 সেকেন্ড
- 97,8713267 সেকেন্ড।
- 1,8432163 সেকেন্ড
গড়:
- ডাটাবেস: 3,4239506333 সেকেন্ড
- যেখানে: 99,5404964 সেকেন্ড
- যোগদান করুন: 1,815435 সেকেন্ড
যোগ-সংস্করণটি যেখানে-সিনট্যাক্সের চেয়ে এত দ্রুত কেন এটি একটি অকেজো করে তোলে যদিও লিনকিউ নবাগত হিসাবে এটি সবচেয়ে সুস্পষ্ট বলে মনে হয়। অথবা আমি আমার প্রশ্নের কিছু মিস করেছি?
এখানে লিনকিউ প্রশ্নগুলি রয়েছে, আমি ডাটাবেসটি এড়িয়ে চলেছি:
কোথায় :
Public Function hasAccessDS_Where(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
যোগদান:
Public Function hasAccessDS_Join(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
তুমাকে অগ্রিম ধন্যবাদ.
সম্পাদনা করুন : আরও অর্থপূর্ণ পারফরম্যান্স-মান পেতে উভয় প্রশ্নের কিছু উন্নতি করার পরে, JOIN এর সুবিধা আগের চেয়ে অনেক গুণ বেশি:
যোগদান :
Public Overloads Shared Function hasAccessDS_Join(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
কোথায় :
Public Overloads Shared Function hasAccessDS_Where(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
1000 টি কল (দ্রুত কম্পিউটারে) এর ফলাফল
- যোগ দিন | 2. কোথায়
1. সূচনা:
- 0,0713669 সেকেন্ড
- 12,7395299 সেকেন্ড
2.Iteration:
- 0,0492458 সেকেন্ড
- 12,3885925 সেকেন্ড
3.Iteration:
- 0,0501982 সেকেন্ড
- 13,3474216 সেকেন্ড
গড়:
- যোগদান: 0,0569367 সেকেন্ড।
- যেখানে: 12,8251813 সেকেন্ড
যোগদান 225 গুণ দ্রুত হয়
উপসংহার: সম্পর্কগুলি নির্দিষ্ট করতে ও যেখানেই সম্ভব যোগ দানের জন্য নিখুঁতভাবে এড়িয়ে চলুন (স্পষ্টতই লিনকিউতে ডেটাসেটে এবং Linq-To-Objects
সাধারণভাবে)।