Big Data and Analytics DAX এর জন্য Performance Optimization গাইড ও নোট

488

DAX (Data Analysis Expressions) একটি শক্তিশালী এক্সপ্রেশন ভাষা যা Power BI, PowerPivot, এবং SQL Server Analysis Services (SSAS)-এ ব্যবহৃত হয়। DAX queries এবং calculations যত জটিল এবং বড় হতে থাকে, তত বেশি performance সমস্যা দেখা দিতে পারে। ডেটা বিশ্লেষণের জন্য DAX ব্যবহারের সময় performance optimization অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করে যে আপনার রিপোর্ট এবং কাস্টম ক্যালকুলেশনগুলি দ্রুত এবং দক্ষতার সাথে কাজ করবে।

এই প্রবন্ধে আমরা DAX performance optimization এর জন্য কিছু গুরুত্বপূর্ণ কৌশল এবং সেরা অভ্যাস নিয়ে আলোচনা করব, যা আপনাকে আপনার ডেটা মডেল এবং ক্যালকুলেশনগুলির কার্যকারিতা বৃদ্ধি করতে সাহায্য করবে।


১. Efficient Data Model Design

Data Model ডিজাইন করা ডেটার উপর কাজ করার প্রাথমিক ভিত্তি। ডেটা মডেল যত বেশি দক্ষ হবে, তত দ্রুত DAX calculations কাজ করবে।

Best Practices:

  1. Use Star Schema: Star Schema মডেল ব্যবহার করার চেষ্টা করুন, যেখানে একটি fact table এবং একাধিক dimension tables থাকবে। এটি ডেটা মডেলকে সহজ এবং দ্রুত করে তোলে।
  2. Minimize Columns: Data model এর মধ্যে অপ্রয়োজনীয় কলামগুলো না রাখুন। যত কম কলাম থাকবে, তত দ্রুত ক্যালকুলেশন হবে।
  3. Avoid Calculated Columns When Possible: Calculated Columns সরাসরি মডেলে যোগ করার পরিবর্তে measures ব্যবহার করুন, কারণ measures রানটাইমে ক্যালকুলেট হয় এবং calculated columns সব সারির জন্য স্টোর করতে হয়।
  4. Use Proper Data Types: সঠিক ডেটা টাইপ ব্যবহার করুন (যেমন, Integer, Date, Boolean)। সঠিক ডেটা টাইপের ব্যবহার পারফরম্যান্স উন্নত করে।

২. Optimizing DAX Queries

DAX queries যত বেশি কমপ্লেক্স হবে, তত বেশি পারফরম্যান্স সমস্যা দেখা দিতে পারে। সুতরাং, যতটা সম্ভব queries সরল এবং কার্যকরী রাখুন।

Best Practices:

  1. Use Measures Instead of Calculated Columns: Measures ব্যবহার করুন, কারণ এগুলি calculated columns এর তুলনায় দ্রুত এবং র‍্যuntime এ ক্যালকুলেট হয়।
  2. Avoid Complex Nested Expressions: DAX queries তে nested expressions এড়িয়ে চলুন। যখন সম্ভব, এক্সপ্রেশনগুলিকে variables এ সংরক্ষণ করুন, যাতে এগুলি একবার ক্যালকুলেট করা হয় এবং পরে পুনঃব্যবহার করা যায়।
  3. Use Filter Context Efficiently: CALCULATE ফাংশনের ভিতরে FILTER ফাংশন ব্যবহার করার সময়, আপনার filter এর শর্তগুলো সঠিকভাবে সেট করুন। অপ্রয়োজনীয় ফিল্টারিং পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে।

Example:

এখানে একটি filter context ব্যবহার করার উদাহরণ দেওয়া হলো:

Total Sales = 
CALCULATE(
    SUM(Sales[Amount]), 
    Sales[Region] = "North"
)

এটি Sales টেবিলের Amount এর মোট যোগফল বের করবে, তবে শুধুমাত্র Region "North" এর জন্য।


৩. Use of Variables in DAX

Variables ব্যবহার করলে DAX queries দ্রুততর হয়, কারণ এক্সপ্রেশনগুলি বারবার ক্যালকুলেট করা হয় না। VAR এবং RETURN ব্যবহার করে আপনি এক্সপ্রেশনগুলোকে সংরক্ষণ করতে পারেন এবং তাদের পুনঃব্যবহার করতে পারেন।

Best Practices for Variables:

  1. Store Intermediate Results: যদি আপনি এক্সপ্রেশনটির মান বারবার ব্যবহার করতে চান, তাহলে সেটিকে একটি variable এ সংরক্ষণ করুন।
  2. Simplify Complex Calculations: Variables ব্যবহার করার মাধ্যমে complex calculations সরল করা যায় এবং পারফরম্যান্স উন্নত হয়।

Example:

Sales Difference = 
VAR TotalSales = SUM(Sales[Amount])
VAR Discount = AVERAGE(Sales[Discount])
RETURN TotalSales - Discount

এখানে, TotalSales এবং Discount দুইটি ভ্যারিয়েবল হিসেবে সংরক্ষণ করা হয়েছে, যাতে ক্যালকুলেশন একবার করা হয় এবং পরে RETURN অংশে ব্যবহার করা হয়।


৪. Efficient Use of Filter and Aggregation Functions

Filter এবং Aggregation functions ব্যবহারে সঠিক কৌশল ব্যবহার করলে DAX calculations দ্রুততর হয় এবং পারফরম্যান্স বৃদ্ধি পায়।

Best Practices:

  1. Avoid Using ALL Unless Necessary: ALL ফাংশনটি সব ধরনের ফিল্টার কনটেক্সট মুছে দেয়। এটি পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে, তাই শুধুমাত্র যখন এটি প্রয়োজন তখনই ব্যবহার করুন।
  2. Use CALCULATE Wisely: CALCULATE ফাংশনটি খুব শক্তিশালী, তবে এর অপ্রয়োজনীয় ব্যবহার পারফরম্যান্সে প্রভাব ফেলতে পারে। CALCULATE ব্যবহারের আগে শর্তগুলিকে সঠিকভাবে সঠিকভাবে তৈরি করুন।
  3. Avoid Multiple Nested Filters: FILTER ফাংশনের মধ্যে একাধিক শর্ত ব্যবহার করার সময়, চেষ্টা করুন logical expressions (যেমন AND, OR) ব্যবহার করতে, যাতে ক্যালকুলেশন সহজ হয়।

Example:

Total Sales Filtered = 
CALCULATE(
    SUM(Sales[Amount]), 
    Sales[Region] = "North", 
    Sales[Amount] > 1000
)

এটি Sales টেবিলের Amount এর যোগফল বের করবে যেখানে Region "North" এবং Amount 1000 এর বেশি।


৫. Time Intelligence Optimization

Time Intelligence ক্যালকুলেশনগুলি, যেমন YTD, QTD, MTD, SAMEPERIODLASTYEAR, DATESYTD, ইত্যাদি ব্যবহার করার সময় কিছু কৌশল অবলম্বন করলে পারফরম্যান্স উন্নত হয়।

Best Practices:

  1. Use a Date Table: Time Intelligence ফাংশন সঠিকভাবে কাজ করার জন্য একটি Date Table থাকতে হবে, যাতে CALENDAR বা CALENDARAUTO ফাংশন ব্যবহার করে একটি পূর্ণাঙ্গ ক্যালেন্ডার তৈরি করা হয়।
  2. Use Continuous Date Columns: আপনার Date Table এর মধ্যে continuous dates থাকতে হবে, যাতে সময়ভিত্তিক ক্যালকুলেশন সঠিকভাবে কাজ করতে পারে।
  3. Minimize Complex Time Intelligence Functions: যতটা সম্ভব Time Intelligence ফাংশনের মধ্যে জটিল এক্সপ্রেশন ব্যবহার এড়িয়ে চলুন। যদি সম্ভব হয়, সরাসরি measures এবং aggregations ব্যবহার করুন।

Example:

YTD Sales = 
TOTALYTD(SUM(Sales[Amount]), Sales[Date])

এটি Sales টেবিলের Amount এর Year-to-Date (YTD) মোট বিক্রয় বের করবে।


৬. Avoiding Performance Issues with Large Datasets

বড় ডেটাসেটের সাথে কাজ করার সময় পারফরম্যান্সের সমস্যা সাধারণত দেখা যায়। কিছু কৌশল রয়েছে যা large datasets এর সাথে কাজ করার সময় পারফরম্যান্স উন্নত করতে সাহায্য করে।

Best Practices:

  1. Use DirectQuery: বড় ডেটাসেটের জন্য DirectQuery ব্যবহার করুন, যেখানে ডেটা live connection থেকে রিট্রিভ করা হয় এবং মেমরিতে স্টোর করা হয় না।
  2. Pre-Aggregated Data: Pre-aggregated data ব্যবহার করুন, যেখানে সমষ্টিগত পরিসংখ্যান আগে থেকেই তৈরি করা থাকে।
  3. Reduce Model Size: ডেটা মডেলের আকার কমানোর জন্য অপ্রয়োজনীয় কলাম ও টেবিল মুছে ফেলুন।

সারাংশ

DAX Performance Optimization ডেটা বিশ্লেষণ এবং কাস্টম ক্যালকুলেশন দ্রুত এবং কার্যকর করতে অত্যন্ত গুরুত্বপূর্ণ। Efficient data model design, DAX query optimization, use of variables, এবং filter and aggregation functions সঠিকভাবে ব্যবহার করার মাধ্যমে আপনি DAX calculations এর পারফরম্যান্স উন্নত করতে পারেন। Time Intelligence ক্যালকুলেশন, large datasets ম্যানেজমেন্ট এবং DirectQuery এর ব্যবহার, পারফরম্যান্সে গুরুত্বপূর্ণ প্রভাব ফেলতে পারে। DAX-এর এই সেরা অভ্যাসগুলি অনুসরণ করলে, আপনি দ্রুত এবং কার্যকরী ডেটা বিশ্লেষণ এবং রিপোর্ট তৈরি করতে সক্ষম হবেন।

Content added By

DAX এর Performance Issues এবং Optimization Techniques

439

DAX (Data Analysis Expressions) একটি শক্তিশালী ভাষা যা Power BI, PowerPivot, এবং SQL Server Analysis Services (SSAS)-এ ব্যবহৃত হয় ডেটা বিশ্লেষণ এবং কাস্টম ক্যালকুলেশন তৈরির জন্য। তবে, যখন বড় ডেটাসেট এবং জটিল ক্যালকুলেশন ব্যবহার করা হয়, তখন DAX এর পারফরম্যান্সের উপর প্রভাব পড়তে পারে। সঠিকভাবে DAX কোড অপটিমাইজ না করলে, এটি slow performance বা long query times এর কারণ হতে পারে। এই প্রবন্ধে, আমরা DAX এর পারফরম্যান্স ইস্যু এবং optimization techniques নিয়ে আলোচনা করব।


১. DAX Performance Issues

DAX এর পারফরম্যান্স ইস্যু সাধারণত data model design, complex calculations, এবং inefficient queries এর কারণে হতে পারে। কিছু সাধারণ performance issues হলো:

1.1. Complex Calculations and Large Datasets

যখন ডেটাসেট বড় হয় এবং জটিল ক্যালকুলেশন বা ফাংশন ব্যবহার করা হয়, তখন এটি পারফরম্যান্সে প্রভাব ফেলতে পারে। বিশেষ করে যখন iterators (যেমন SUMX, AVERAGEX, COUNTX) ব্যবহার করা হয়, কারণ তারা প্রতিটি সারির জন্য আলাদাভাবে ক্যালকুলেশন করে।

1.2. Row Context and Filter Context

Row Context এবং Filter Context সঠিকভাবে না ব্যবহৃত হলে পারফরম্যান্স হ্রাস পায়। বিশেষ করে যখন FILTER বা CALCULATE ফাংশনগুলির মধ্যে complex filters ব্যবহৃত হয়, তখন এটি ডেটা মডেলের উপরে অতিরিক্ত লোড তৈরি করতে পারে।

1.3. Bi-Directional Relationships

Bi-directional relationships ব্যবহৃত হলে, পারফরম্যান্সে সমস্যা হতে পারে, কারণ filter propagation দুই দিকে হতে থাকে, যার ফলে সিস্টেমকে বেশি ডেটা প্রক্রিয়া করতে হয়।

1.4. Large Calculated Columns

বড় calculated columns ব্যবহার করার ফলে data refresh এবং query processing ধীর হতে পারে, কারণ এটি data model এর মধ্যে প্রতিটি সারির জন্য ক্যালকুলেশন সম্পন্ন করে।

1.5. Using TOO Many Measures and Calculated Columns

একাধিক measures এবং calculated columns ডেটা মডেলে অতিরিক্ত জটিলতা তৈরি করতে পারে, এবং এগুলি যদি সঠিকভাবে অপটিমাইজ না করা হয় তবে এটি slow report generation এর কারণ হতে পারে।


২. DAX Performance Optimization Techniques

DAX কোড অপটিমাইজ করার মাধ্যমে পারফরম্যান্সের উন্নতি সাধন করা সম্ভব। কিছু optimization techniques যা DAX কোডের কার্যকারিতা বাড়াতে সহায়ক:

2.1. Use Variables to Simplify Calculations

Variables ব্যবহার করলে আপনি একাধিক বার একই গণনা করা থেকে বাঁচতে পারবেন এবং আপনার DAX expression কে আরো কার্যকরী এবং দ্রুত করতে পারবেন।

Example:

যদি আপনি একটি এক্সপ্রেশনে একাধিক বার একই গণনা ব্যবহার করেন, তাহলে সেটা variable হিসেবে সংরক্ষণ করা উচিত:

Total Sales = 
VAR TotalAmount = SUM(Sales[Amount])
VAR Discount = AVERAGE(Sales[Discount])
RETURN TotalAmount - Discount

এখানে, TotalAmount এবং Discount দুটি ভ্যারিয়েবল হিসেবে সংরক্ষিত হয়েছে, যাতে বারবার একই গণনা না করতে হয় এবং কার্যকারিতা উন্নত হয়।

2.2. Avoid Using Complex Calculations in Real-Time Reports

Real-time reports বা live data বিশ্লেষণের সময় জটিল ক্যালকুলেশন ব্যবহার করা উচিত নয়। কারণ তা query execution time বাড়িয়ে দিতে পারে।

  • Pre-aggregate your data: Calculated columns এবং measures এর পরিবর্তে, aggregated tables ব্যবহার করুন যাতে query execution দ্রুত হয়।
  • Materialized views বা summary tables ব্যবহার করুন যাতে আপনাকে রিয়েল-টাইমে complex calculations করতে না হয়।

2.3. Use Efficient DAX Functions

DAX functions এর মধ্যে কিছু ফাংশন অন্যদের চেয়ে অধিক কার্যকরী। উদাহরণস্বরূপ:

  • SUM এবং AVERAGE ফাংশনগুলো সাধারণত iteration functions এর তুলনায় বেশি কার্যকরী, কারণ তারা শুধুমাত্র কলামকে স্ক্যান করে এবং কোনো সারি ভিত্তিক গণনা করে না।
  • CALCULATE ফাংশনটি জটিল ফিল্টার এবং ক্যালকুলেশন প্রয়োগ করার জন্য ব্যবহার করা যেতে পারে, তবে এটি iterators এর তুলনায় অপেক্ষাকৃত ধীর হতে পারে।

2.4. Minimize the Use of Bi-Directional Relationships

Bi-directional relationships সাধারণত ব্যবহার করা উচিত না, কারণ এটি filter propagation দুই দিকে কাজ করতে দেয় এবং complexity বাড়ায়। সম্ভব হলে, single-directional relationships ব্যবহার করুন।

2.5. Use Optimized Filter Expressions

FILTER এবং CALCULATE ফাংশনের মধ্যে complex filter expressions এড়ানোর চেষ্টা করুন, যা data model এর উপরে অতিরিক্ত চাপ সৃষ্টি করতে পারে।

Example:

এটি এড়ানো যেতে পারে:

Total Sales = CALCULATE(SUM(Sales[Amount]), Sales[Region] = "East", Sales[Product] = "A")

এর পরিবর্তে, ডেটা মডেলকে ফিল্টার করতে ভেরিয়েবল বা আরও সরল এক্সপ্রেশন ব্যবহার করা উচিত।

2.6. Optimize Relationships

আপনার ডেটা মডেলে relationships নিশ্চিত করুন। One-to-many সম্পর্ক ব্যবহারে পারফরম্যান্স ভাল হয়, তবে যদি many-to-many সম্পর্ক থাকে, তাহলে সেগুলি যতটা সম্ভব কম করতে চেষ্টা করুন।

  • Use star schema: Fact tables এবং Dimension tables এর মধ্যে সম্পর্ক তৈরি করতে star schema ব্যবহার করুন, যাতে ডেটা বিশ্লেষণ সহজ হয় এবং পারফরম্যান্স বাড়ে।
  • Use inactive relationships carefully: যখন আপনি inactive relationships ব্যবহার করেন, তখন USERELATIONSHIP ফাংশন ব্যবহার করতে পারেন, তবে এটির অত্যধিক ব্যবহার এড়ানো উচিত।

2.7. Avoid Using Too Many Measures in Reports

যখন আপনার রিপোর্টে অনেক measures থাকে, তখন সেগুলি আপনার report generation প্রক্রিয়াকে ধীর করতে পারে। অতিরিক্ত measures ব্যবহারের পরিবর্তে, আপনি pre-calculated summaries ব্যবহার করতে পারেন।

2.8. Simplify Calculated Columns

যতটা সম্ভব, calculated columns এর সংখ্যা সীমিত করুন এবং তাদের জটিলতা কমাতে চেষ্টা করুন। বড় calculated columns ডেটা মডেলকে ভারী করে এবং data refresh time বাড়ায়।


৩. DAX Query Optimization Tips

  • Indexing: ডেটাবেস স্তরে সঠিক indexing ব্যবহার করুন, বিশেষত যখন আপনি column-based filtering করছেন।
  • Query Folding: যখন সম্ভব query folding ব্যবহার করুন, যাতে ডেটাবেস স্তরের ক্যালকুলেশন Power BI বা Excel এ করা না হয়।
  • Avoid Nested Calculations: সঠিকভাবে nested calculations এড়ানো উচিত, কারণ এগুলি অনেক সময় slow performance এর কারণ হতে পারে।
  • Use "EARLIER" Only When Necessary: EARLIER ফাংশনটি ব্যবহারের সময় সতর্ক থাকতে হবে, কারণ এটি কিছু ক্ষেত্রে পারফরম্যান্সে সমস্যা সৃষ্টি করতে পারে।

সারাংশ

DAX এর পারফরম্যান্স উন্নত করার জন্য, সঠিকভাবে calculated columns, measures, এবং filter expressions ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। Variables ব্যবহার, pre-aggregation এবং efficient DAX functions প্রয়োগ করার মাধ্যমে আপনি query execution time এবং data processing time কমিয়ে দ্রুত এবং কার্যকরী ডেটা বিশ্লেষণ করতে পারেন। ডেটা মডেলকে অপটিমাইজ করার জন্য সঠিক relationships এবং filtering techniques ব্যবহার করতে হবে। পারফরম্যান্সের জন্য bi-directional relationships, complex DAX expressions, এবং nested calculations থেকে বিরত থাকা উচিত, যাতে আপনি আরও দ্রুত রিপোর্ট এবং বিশ্লেষণ তৈরি করতে পারেন।

Content added By

Query Optimization এবং Performance Monitoring

295

DAX (Data Analysis Expressions) হল একটি শক্তিশালী ভাষা যা Power BI, PowerPivot, এবং SQL Server Analysis Services (SSAS)-এ ব্যবহৃত হয় ডেটা বিশ্লেষণ এবং কাস্টম ক্যালকুলেশন তৈরি করতে। যখন আপনি DAX queries তৈরি করেন, তখন পারফরম্যান্স খুবই গুরুত্বপূর্ণ, বিশেষ করে বৃহৎ ডেটাসেটে কাজ করার সময়। সঠিকভাবে query optimization এবং performance monitoring না করলে, আপনার রিপোর্ট বা ক্যালকুলেশন ধীর হয়ে যেতে পারে, যা ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে।

এই প্রবন্ধে, আমরা DAX queries অপটিমাইজ করার জন্য কিছু টিপস এবং performance monitoring এর মাধ্যমে কিভাবে Power BI বা SSAS-এ পারফরম্যান্স উন্নত করা যায়, তা আলোচনা করব।


১. Query Optimization in DAX

Query optimization হল ডেটা মডেলের ডেটার উপর কাস্টম ক্যালকুলেশন বা ফিল্টার প্রয়োগ করার সময় আরও দ্রুত, কার্যকরী এবং কমপ্লেক্সিটি কমানোর কৌশল। DAX queries অপটিমাইজ করার সময় কিছু প্রধান পদ্ধতি এবং টিপস নিচে দেওয়া হলো:

1.1. Avoid Using Complex Calculations in Visuals

আপনার Power BI বা Excel রিপোর্টে যদি অনেক জটিল DAX queries ব্যবহার করেন, তবে এটি পারফরম্যান্সে প্রভাব ফেলতে পারে। তাই complex calculations এবং heavy DAX expressions সরাসরি visuals-এ ব্যবহার না করে calculated columns বা measures তৈরি করা উচিত।

Best Practice:

  • জটিল DAX calculations আগে থেকেই measures বা calculated columns হিসেবে ডেটা মডেলে তৈরি করুন, এবং visuals-এ কেবলমাত্র সেই measures ব্যবহার করুন।

1.2. Use Aggregation Functions Wisely

Aggregation functions যেমন SUM, AVERAGE, COUNT, MIN, এবং MAX সহজে দ্রুত কাজ করে, তবে যখন আপনি বড় ডেটাসেটের উপর কাজ করেন, তখন X-functions (যেমন SUMX, AVERAGEX) ব্যবহার করলে পারফরম্যান্স কমতে পারে।

Best Practice:

  • SUMX, AVERAGEX বা অন্যান্য iterator functions ব্যবহার করার সময়, সম্ভব হলে ডেটার পরিমাণ সীমিত রাখুন এবং সরাসরি aggregated columns ব্যবহার করুন, যাতে কম সংখ্যক সারি নিয়ে কাজ করতে হয়।

1.3. Minimize the Use of FILTER

FILTER ফাংশনটি ডেটার উপর শর্ত প্রয়োগ করতে ব্যবহৃত হয়, কিন্তু এটি row-by-row calculations করে, যা অনেক সময় পারফরম্যান্সে প্রভাব ফেলতে পারে।

Best Practice:

  • FILTER ফাংশন ব্যবহার করার সময়, যতটা সম্ভব সহজ এক্সপ্রেশন ব্যবহার করুন এবং বৃহৎ ডেটাসেটের জন্য ফিল্টার প্রয়োগ করার আগে ডেটা মডেলে প্রাথমিকভাবে ফিল্টার বা সংক্ষেপণ করুন।

1.4. Use Variables to Simplify Complex Expressions

Variables (যেমন VAR) ব্যবহার করলে এক্সপ্রেশনগুলোকে আরও সোজা এবং দ্রুত করা যায়, কারণ এতে একাধিক ক্যালকুলেশন পুনরায় না করতে হয়। এটি DAX calculations দ্রুত করতে সহায়ক।

Best Practice:

  • Variables ব্যবহার করুন যেখানে পুনরায় এক্সপ্রেশন বা ক্যালকুলেশনগুলি না করে সেগুলি একবারে নির্ধারণ করে পরবর্তীতে ব্যবহার করা যাবে।
Total Sales = 
VAR TotalAmount = SUM(Sales[Amount])
RETURN TotalAmount

1.5. Use SUMMARIZE and ADDCOLUMNS Efficiently

SUMMARIZE এবং ADDCOLUMNS ফাংশনগুলির সাহায্যে আপনি ডেটাকে গ্রুপ করতে পারেন এবং নতুন কলাম যোগ করতে পারেন, তবে অতিরিক্ত কলাম এবং এক্সপ্রেশন ব্যবহারে পারফরম্যান্স কমে যেতে পারে।

Best Practice:

  • SUMMARIZE বা ADDCOLUMNS ফাংশন ব্যবহার করার সময় শুধুমাত্র প্রয়োজনীয় কলাম এবং এক্সপ্রেশন অন্তর্ভুক্ত করুন, অতিরিক্ত কলাম যোগ করতে এড়িয়ে চলুন।

২. Performance Monitoring in DAX

Performance monitoring হল একটি প্রক্রিয়া যা আপনাকে Power BI বা SSAS ডেটা মডেল এবং রিপোর্টের পারফরম্যান্স ট্র্যাক এবং বিশ্লেষণ করতে সহায়তা করে। DAX queries-এর পারফরম্যান্স মনিটর করার জন্য কিছু টুলস এবং পদ্ধতি ব্যবহার করা হয়:

2.1. Performance Analyzer in Power BI

Power BI Performance Analyzer একটি গুরুত্বপূর্ণ টুল যা আপনাকে Power BI reports এর পারফরম্যান্স বিশ্লেষণ করতে সহায়তা করে। এটি আপনাকে DAX query execution time এবং visual rendering time মনিটর করতে সাহায্য করে।

How to Use:

  1. Power BI Desktop খুলুন।
  2. View ট্যাব থেকে Performance Analyzer খুলুন।
  3. Start Recording ক্লিক করুন এবং আপনার রিপোর্টে ডেটা পরিবর্তন বা রিফ্রেশ করুন।
  4. এটি আপনাকে query execution time এবং visual rendering time দেখাবে।

2.2. DAX Studio

DAX Studio একটি ডেভেলপার টুল যা DAX queries এবং Power BI models এর পারফরম্যান্স বিশ্লেষণ করতে ব্যবহৃত হয়। এটি আপনাকে query execution plans দেখাতে পারে এবং কিভাবে আপনার DAX queries রান হচ্ছে তা বিশ্লেষণ করতে সহায়তা করে।

How to Use:

  1. DAX Studio ইন্সটল করুন এবং Power BI Desktop এর সাথে সংযুক্ত করুন।
  2. Query Plan ফিচারটি ব্যবহার করুন এবং DAX queries এর পারফরম্যান্স বিশ্লেষণ করুন।
  3. Server Timings এবং Query Duration মনিটর করে ক্যালকুলেশনের পারফরম্যান্স বুঝুন।

2.3. SQL Server Profiler for SSAS

SQL Server Profiler হল একটি টুল যা SQL Server Analysis Services (SSAS) এর পারফরম্যান্স মনিটর করতে ব্যবহৃত হয়। এটি DAX queries এবং তাদের কার্যকারিতা বিশ্লেষণ করতে সহায়তা করে।

How to Use:

  1. SQL Server Profiler খুলুন এবং একটি নতুন ট্রেস তৈরি করুন।
  2. DAX Queries এবং SSAS Processing ট্র্যাক করুন।
  3. Query Duration এবং Cache Misses বিশ্লেষণ করুন।

2.4. Query Diagnostics in Power BI

Power BI তে Query Diagnostics একটি শক্তিশালী ফিচার যা আপনাকে Power Query এর পারফরম্যান্স মনিটর করতে সহায়তা করে। এটি আপনাকে দেখাবে data loading time, query steps, এবং execution duration

How to Use:

  1. Power Query Editor খুলুন।
  2. Tools মেনু থেকে Query Diagnostics নির্বাচন করুন।
  3. এটি আপনাকে প্রতিটি query step এর পারফরম্যান্স দেখাবে এবং কোথায় অপটিমাইজেশনের প্রয়োজন হতে পারে তা চিহ্নিত করবে।

৩. Best Practices for Performance Optimization in DAX

  1. Avoid Complex Calculations in Visuals: Visuals-এ জটিল ক্যালকুলেশন প্রয়োগ না করে measures বা calculated columns তৈরি করুন।
  2. Use Variables: এক্সপ্রেশনগুলোকে সহজ এবং দ্রুত করতে variables ব্যবহার করুন।
  3. Limit Use of FILTER: যখন সম্ভব হয়, FILTER ফাংশন ব্যবহার না করে সরাসরি pre-filtered data ব্যবহার করুন।
  4. Optimize Query with SUMMARIZE: SUMMARIZE বা ADDCOLUMNS ফাংশন ব্যবহার করে অপ্রয়োজনীয় কলাম এড়িয়ে চলুন।
  5. Use Efficient Aggregation Functions: সাধারণ aggregation functions ব্যবহার করুন, iterator functions (যেমন SUMX, AVERAGEX) এড়িয়ে চলুন যেখানে সম্ভব।
  6. Monitor Performance Regularly: Performance Analyzer, DAX Studio, এবং SQL Server Profiler এর মাধ্যমে পারফরম্যান্স ট্র্যাক করুন।

সারাংশ

DAX queries optimization এবং performance monitoring নিশ্চিত করা ডেটা বিশ্লেষণের জন্য অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি বড় ডেটাসেটে কাজ করেন। Query optimization এর মাধ্যমে ডেটার ফিল্টার প্রভাব কমানো এবং efficient DAX expressions ব্যবহার করা ডেটা বিশ্লেষণকে দ্রুত এবং কার্যকরী করে তোলে। পাশাপাশি, performance monitoring টুলস ব্যবহার করে আপনি Power BI বা SSAS মডেলের পারফরম্যান্স ট্র্যাক করতে পারেন এবং প্রয়োজনে অপটিমাইজেশন করতে পারেন। DAX-এর পারফরম্যান্স উন্নত করার জন্য variables, aggregation functions, এবং query diagnostics এর সঠিক ব্যবহার নিশ্চিত করুন, যা আপনার বিশ্লেষণ এবং রিপোর্টকে আরও দ্রুত কার্যকরী করে তুলবে।

Content added By

VertiPaq Engine এর ভূমিকা

318

VertiPaq Engine হল একটি অত্যন্ত শক্তিশালী columnar storage engine যা Power BI, Power Pivot, এবং SQL Server Analysis Services (SSAS) এর মধ্যে ব্যবহৃত হয়। এটি মূলত in-memory ডেটা সংরক্ষণের জন্য ডিজাইন করা হয়েছে এবং এটি ডেটাকে সঞ্চয় করার জন্য এক ধরনের compression technique ব্যবহার করে, যা ডেটার পারফরম্যান্স এবং স্টোরেজ সক্ষমতা বাড়ায়। DAX functions VertiPaq Engine এর সাথে গভীরভাবে সংযুক্ত, এবং এটি ডেটা মডেলিং, বিশ্লেষণ এবং কাস্টম ক্যালকুলেশন তৈরি করার জন্য অত্যন্ত কার্যকরী।

এই প্রবন্ধে, আমরা VertiPaq Engine এর ভূমিকা এবং কীভাবে এটি DAX functions এর কার্যকারিতা বাড়াতে সাহায্য করে তা বিস্তারিতভাবে আলোচনা করব।


১. VertiPaq Engine কী?

VertiPaq Engine হল in-memory ভিত্তিক একটি columnar database engine, যা Power BI, Power Pivot, এবং SSAS Tabular Models-এ ডেটা মডেল এবং বিশ্লেষণ প্রক্রিয়াতে ব্যবহৃত হয়। এটি columnar storage ব্যবহার করে যেখানে ডেটা কলামের আকারে সঞ্চিত থাকে এবং দ্রুত বিশ্লেষণ এবং ক্যালকুলেশন করার জন্য অপটিমাইজড।

VertiPaq Engine ডেটার পারফরম্যান্স বাড়াতে compression টেকনিক ব্যবহার করে, যার ফলে এটি আরও কম মেমরি ব্যবহার করে বৃহত্তর ডেটাসেটকে সঞ্চয় করতে সক্ষম হয়। এটি মূলত DAX ক্যালকুলেশনগুলির দ্রুততা এবং কার্যকারিতা নিশ্চিত করে, বিশেষত বৃহত্তর ডেটাসেটের ক্ষেত্রে।


২. VertiPaq Engine এর কাজের প্রক্রিয়া

VertiPaq Engine এর কার্যপ্রণালী মূলত তিনটি প্রধান উপাদানে বিভক্ত:

১. Columnar Data Storage:

VertiPaq Engine ডেটা columnar storage-এ সঞ্চিত রাখে, যার ফলে এটি এক্সপ্রেশন এবং ক্যালকুলেশন করার সময় কলাম ভিত্তিক ডেটা অ্যাক্সেস করতে সক্ষম হয়। Columnar storage প্রক্রিয়া ফাইল সাইজ কমাতে সহায়ক এবং ডেটার উপরে দ্রুত বিশ্লেষণ করতে সক্ষম হয়।

২. Compression Techniques:

VertiPaq Engine ডেটাকে compress করে memory-তে সংরক্ষণ করে, যার ফলে এটি বড় ডেটাসেটকে খুব ছোট আকারে সংরক্ষণ করতে সক্ষম। এটি Run-Length Encoding (RLE), Dictionary Encoding, এবং Value Encoding এর মতো প্রযুক্তি ব্যবহার করে ডেটা কম্প্রেস করে।

৩. In-memory Calculation:

VertiPaq Engine ডেটাকে মেমরিতে সংরক্ষণ করে এবং DAX functions দ্বারা ক্যালকুলেশন সম্পন্ন করে। এটি in-memory calculations করে, যার ফলে ফলাফল দ্রুত প্রাপ্ত হয় এবং এটি রিয়েল-টাইম বিশ্লেষণ এবং রিপোর্টিংয়ের জন্য উপযুক্ত।


৩. VertiPaq Engine এবং DAX Functions এর সম্পর্ক

DAX functions এবং VertiPaq Engine একে অপরের সাথে নিবিড়ভাবে কাজ করে। যখন আপনি Power BI বা SSAS-এ একটি ক্যালকুলেশন করেন, VertiPaq Engine সেই ক্যালকুলেশনটি মেমরিতে দ্রুত করতে সহায়ক হয়। ডেটার columnar storage এবং compression প্রযুক্তি DAX functions এর দ্রুততার জন্য অপরিহার্য, বিশেষত যখন বিশাল ডেটাসেটের উপর বিশ্লেষণ করা হয়।

1. VertiPaq Compression and DAX Performance:

  • Compression টেকনিকের কারণে, VertiPaq Engine শুধুমাত্র প্রয়োজনীয় ডেটার উপর কাজ করতে পারে, যা DAX functions এর কার্যকারিতা বৃদ্ধি করে।
  • DAX এর FILTER, SUM, AVERAGE, RANKX ইত্যাদি ফাংশনগুলি যখন কলামভিত্তিক সঞ্চিত ডেটার উপর প্রয়োগ করা হয়, তখন কম্প্রেশন প্রযুক্তি ডেটার পুনরুদ্ধার এবং ক্যালকুলেশন দ্রুততর করে।

2. VertiPaq and Efficient Data Models:

  • VertiPaq Engine দক্ষ data models তৈরি করতে সহায়ক। DAX functions যখন ডেটার উপর aggregation, grouping, বা time-based calculation প্রয়োগ করতে হয়, তখন VertiPaq ডেটার সঞ্চয়কে দ্রুততর এবং কার্যকরী করে তোলে।
  • Calculated columns এবং measures তৈরি করার সময়, VertiPaq Engine দ্রুত row-based এবং aggregate calculations করার জন্য প্রয়োজনীয় মেমরি এবং অপটিমাইজড রিসোর্স সরবরাহ করে।

৪. VertiPaq Engine এর সুবিধাসমূহ

VertiPaq Engine ডেটা মডেলিং এবং বিশ্লেষণের ক্ষেত্রে বেশ কিছু সুবিধা প্রদান করে, বিশেষত যখন DAX functions ব্যবহৃত হয়:

১. High Performance:

VertiPaq Engine ডেটাকে in-memory প্রসেস করে এবং columnar storage ব্যবহার করে, যার ফলে এটি দ্রুত ক্যালকুলেশন করতে সক্ষম হয়। DAX functions-এর মাধ্যমে real-time calculations দ্রুত সম্পন্ন হয়, যা Power BI বা SSAS-এর বিশ্লেষণকে দ্রুততর করে।

২. Efficient Storage:

VertiPaq Engine compression techniques ব্যবহার করে ডেটার আকার ছোট করে রাখে, ফলে কম মেমরি ব্যবহার করা হয় এবং বড় ডেটাসেটও দ্রুত প্রক্রিয়াজাত করা সম্ভব হয়। এতে Power BI বা Excel-এ বিশাল ডেটাসেট নিয়ে কাজ করা সহজ হয়।

৩. Scalability:

VertiPaq Engine বড় ডেটাসেটের জন্য অত্যন্ত উপযোগী। এটি বড় ডেটা সেটকে ছোট আকারে সঞ্চিত রাখে এবং দ্রুত সঞ্চালিত করতে সক্ষম হয়, যা ডেটার বিশ্লেষণ এবং কাস্টম ক্যালকুলেশনকে আরও দ্রুত করে তোলে।

৪. Support for Complex Calculations:

VertiPaq Engine DAX functions এর মাধ্যমে complex calculations যেমন time-based calculations, YTD (Year-to-Date), QTD (Quarter-to-Date), dynamic filtering, ranking, ইত্যাদি দ্রুত কার্যকরী করে।


৫. Optimizing DAX Queries with VertiPaq

আপনি যদি Power BI বা SSAS-এ DAX queries ব্যবহার করেন, তবে VertiPaq Engine আপনাকে ডেটার compression এবং efficient memory management এর মাধ্যমে কার্যকরী বিশ্লেষণ করতে সহায়ক। কিছু পদ্ধতি যা DAX queries এর কার্যকারিতা উন্নত করতে সহায়ক:

১. Use Efficient Data Models:

ডেটার সঠিক relationships এবং cardinality নিশ্চিত করুন যাতে VertiPaq Engine দ্রুত ক্যালকুলেশন করতে পারে। এছাড়াও calculated columns এবং measures কাস্টমাইজ করার মাধ্যমে আপনি ডেটার আকার এবং গতিশীলতা বাড়াতে পারেন।

২. Optimize Calculated Columns and Measures:

Calculated columns এবং measures তৈরি করার সময়, সেগুলিকে যতটা সম্ভব কমপ্লেক্স বা পুনরাবৃত্তি না করে সহজ রাখুন। Variables ব্যবহার করে DAX functions অপটিমাইজ করতে পারেন, যাতে VertiPaq Engine দ্রুত ক্যালকুলেশন করতে পারে।

৩. Use Aggregations Efficiently:

SUMX, AVERAGEX, RANKX ইত্যাদি ফাংশনগুলি ব্যবহার করার সময়, ডেটার aggregation এবং filtering প্রয়োগে পারফরম্যান্স অপটিমাইজ করুন।


সারাংশ

VertiPaq Engine হল একটি শক্তিশালী in-memory columnar storage engine, যা Power BI, Power Pivot, এবং SSAS-এ DAX functions ব্যবহারের ক্ষেত্রে অত্যন্ত গুরুত্বপূর্ণ। এটি ডেটার compression এবং columnar storage এর মাধ্যমে DAX calculations দ্রুত এবং কার্যকরী করতে সহায়তা করে। VertiPaq Engine ডেটা মডেল তৈরি করার এবং বিশ্লেষণ করার ক্ষেত্রে পারফরম্যান্স এবং স্টোরেজ দক্ষতা নিশ্চিত করে, বিশেষত real-time calculations এবং complex DAX functions প্রয়োগের ক্ষেত্রে।

Content added By

Best Practices for Efficient DAX Calculations

265

DAX (Data Analysis Expressions) হলো একটি শক্তিশালী ভাষা যা Power BI, PowerPivot, এবং SQL Server Analysis Services (SSAS)-এ ব্যবহৃত হয় ডেটা বিশ্লেষণ এবং কাস্টম ক্যালকুলেশন তৈরির জন্য। DAX calculations তৈরি করার সময় পারফরম্যান্স একটি গুরুত্বপূর্ণ বিষয়, কারণ জটিল ক্যালকুলেশনগুলি এবং বড় ডেটাসেটের উপর কাজ করার সময় কার্যক্ষমতা প্রভাবিত হতে পারে।

এই প্রবন্ধে, আমরা DAX calculations এর জন্য performance optimization এবং best practices নিয়ে আলোচনা করব, যা আপনাকে দ্রুত এবং কার্যকরী রিপোর্ট তৈরি করতে সহায়ক হবে।


১. Minimize Use of Complex Iterators

Iterators ফাংশনগুলি, যেমন SUMX, AVERAGEX, COUNTX, ইত্যাদি, টেবিলের প্রতিটি সারির জন্য গণনা করে কাজ করে, তাই এগুলি ব্যবহারের সময় পারফরম্যান্সে সমস্যা সৃষ্টি হতে পারে, বিশেষত যদি ডেটাসেট বড় হয়।

Best Practice:

  • Use iterators only when necessary: যখন এক্সপ্রেশন গুলি সরাসরি একটি কলামে প্রয়োগ করা সম্ভব, তখন iterators ব্যবহার না করার চেষ্টা করুন।
  • Use aggregation functions directly: উদাহরণস্বরূপ, SUM, AVERAGE, এবং COUNT এর মতো ফাংশনগুলো সরাসরি কলামের উপর কাজ করে, এবং এগুলি iterators এর তুলনায় দ্রুত।

Example:

  • Inefficient (Using SUMX):

    Total Sales = SUMX(Sales, Sales[Quantity] * Sales[Price])
    
  • Efficient (Using SUM):

    Total Sales = SUM(Sales[Quantity] * Sales[Price])
    

এটি SUMX এর পরিবর্তে সরাসরি SUM ফাংশন ব্যবহার করছে, যেটি পারফরম্যান্স উন্নত করে।


২. Avoid Using Calculated Columns When Possible

Calculated columns ডেটার প্রতিটি সারির জন্য ক্যালকুলেশন করে এবং ডেটা মডেলে নতুন কলাম যুক্ত করে। যদিও calculated columns কিছু ক্ষেত্রে উপকারী, তবে এগুলি পারফরম্যান্সের উপর প্রভাব ফেলতে পারে, বিশেষ করে যখন বড় ডেটাসেট থাকে।

Best Practice:

  • Use measures instead of calculated columns: যেখানে সম্ভব measures ব্যবহার করুন, কারণ measures কেবলমাত্র visuals বা reports এর জন্য ক্যালকুলেট হয়, এবং তারা কম রিসোর্স ব্যবহার করে।
  • Calculated columns ব্যবহার করার আগে নিশ্চিত করুন যে সেগুলি ডেটা মডেলের জন্য অপরিহার্য।

Example:

  • Inefficient (Using Calculated Column):

    Profit Margin = Sales[Amount] - Sales[Cost]
    
  • Efficient (Using Measure):

    Profit Margin = SUM(Sales[Amount]) - SUM(Sales[Cost])
    

এটি একটি measure ব্যবহার করছে যা কেবল reporting এর জন্য গণনা করা হবে, এবং ডেটা মডেলে নতুন কলাম যোগ করবে না।


৩. Use Variables to Simplify and Optimize Calculations

Variables (যেমন VAR এবং RETURN) ব্যবহার করে আপনি এক্সপ্রেশনগুলিকে সহজ এবং কার্যকরী করতে পারেন। Variables এক্সপ্রেশনগুলির পুনঃব্যবহার এড়িয়ে চলে এবং পারফরম্যান্স উন্নত করতে সাহায্য করে।

Best Practice:

  • Use variables for complex calculations: একাধিকবার একই ক্যালকুলেশন ব্যবহারের পরিবর্তে, এটি একটি ভ্যারিয়েবলে সংরক্ষণ করুন, যাতে এটি কেবল একবার গণনা করা হয়।
  • Improve readability: Variables ব্যবহার করলে কোড পরিষ্কার হয় এবং বুঝতে সহজ হয়।

Example:

Profit Margin = 
VAR TotalAmount = SUM(Sales[Amount])
VAR TotalCost = SUM(Sales[Cost])
RETURN TotalAmount - TotalCost

এখানে, TotalAmount এবং TotalCost ভ্যারিয়েবল হিসেবে সংরক্ষিত হয়েছে এবং পরে Profit Margin গণনা করা হয়েছে। এর ফলে পারফরম্যান্স উন্নত হয় এবং কোড সহজ হয়।


৪. Minimize Use of FILTER and ALL Functions

FILTER এবং ALL ফাংশনগুলি ডেটার filter context পরিবর্তন করতে ব্যবহৃত হয়। তবে, এগুলি অতিরিক্ত ব্যবহারের কারণে পারফরম্যান্স প্রভাবিত হতে পারে, বিশেষত যদি ডেটাসেট খুব বড় হয়।

Best Practice:

  • Use FILTER sparingly: শুধুমাত্র প্রয়োজন হলে FILTER ফাংশন ব্যবহার করুন, এবং নিশ্চিত করুন যে এটি নির্দিষ্ট ডেটা রিটার্ন করছে।
  • Use ALLSELECTED instead of ALL: যদি আপনি ALL ফাংশন ব্যবহার করতে চান, তবে ALLSELECTED ব্যবহার করতে পারেন, যা প্রভাবিত ডেটার পরিসীমা কমিয়ে দেয়।

Example:

  • Inefficient (Using ALL):

    Total Sales = CALCULATE(SUM(Sales[Amount]), ALL(Sales))
    
  • Efficient (Using ALLSELECTED):

    Total Sales = CALCULATE(SUM(Sales[Amount]), ALLSELECTED(Sales))
    

এটি ALL ফাংশনের পরিবর্তে ALLSELECTED ব্যবহার করছে, যা শুধু সিলেক্ট করা ডেটার উপর কাজ করবে এবং পারফরম্যান্স উন্নত করবে।


৫. Use DirectQuery for Large Datasets

DirectQuery একটি ফিচার যা আপনাকে Power BI বা SSAS ডেটা মডেল থেকে সরাসরি SQL Server বা অন্য ডেটাবেসে কুয়েরি পাঠানোর অনুমতি দেয়, যাতে আপনি বিশাল ডেটাসেটের সাথে কাজ করতে পারেন।

Best Practice:

  • Use DirectQuery for large datasets: যখন আপনার ডেটাসেট খুব বড় হয় এবং আপনি ডেটা মডেলে স্টোর না করে ডেটা বিশ্লেষণ করতে চান, তখন DirectQuery ব্যবহার করুন। এটি ডেটাবেসের উপর সরাসরি কুয়েরি পাঠায় এবং পারফরম্যান্স উন্নত করে।

Example:

  • DirectQuery ব্যবহার করে, আপনি সরাসরি SQL Server থেকে ডেটা অ্যাক্সেস করতে পারবেন এবং ডেটা মডেলে সংরক্ষণ না করে বিশ্লেষণ করতে পারবেন।

৬. Limit the Use of Bi-directional Relationships

Bi-directional relationships Power BI-এ ব্যবহৃত একটি ফিচার যা দুইটি টেবিলের মধ্যে একাধিক filter context প্রয়োগ করতে সক্ষম। তবে, এটি অতিরিক্ত ব্যবহার করলে পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে।

Best Practice:

  • Use bi-directional relationships sparingly: Bi-directional relationships ব্যবহার করার সময় সতর্ক থাকুন, কারণ এটি ডেটার উপর অতিরিক্ত ফিল্টার প্রভাব ফেলতে পারে।
  • Prefer single-directional relationships: যেখানে সম্ভব, single-directional relationships ব্যবহার করুন, যেগুলি পারফরম্যান্সে কম প্রভাব ফেলে।

৭. Optimize Time Intelligence Calculations

Time Intelligence ফাংশনগুলি (যেমন YTD, QTD, MTD) সময়ভিত্তিক বিশ্লেষণের জন্য ব্যবহৃত হয়, কিন্তু এগুলি সঠিকভাবে ব্যবহার না করলে পারফরম্যান্স প্রভাবিত হতে পারে।

Best Practice:

  • Ensure Date Table is Properly Marked: Date Table সঠিকভাবে চিহ্নিত করা উচিত যাতে Time Intelligence ফাংশনগুলি সঠিকভাবে কাজ করতে পারে।
  • Avoid Complex Time Calculations in Large Datasets: সময়ভিত্তিক ক্যালকুলেশন করার সময়, বড় ডেটাসেটে অতিরিক্ত জটিল ক্যালকুলেশন এড়িয়ে চলুন।

সারাংশ

DAX calculations এর জন্য পারফরম্যান্স অপটিমাইজেশনের জন্য best practices অনুসরণ করা অত্যন্ত গুরুত্বপূর্ণ। Iterators এবং calculated columns এর ব্যবহার কমিয়ে, measures এবং variables ব্যবহার করে আপনি কার্যকরী এবং দ্রুত ক্যালকুলেশন তৈরি করতে পারবেন। FILTER, ALL, এবং bi-directional relationships এর অতিরিক্ত ব্যবহার থেকে বিরত থাকতে হবে। DirectQuery ব্যবহার এবং Time Intelligence ফাংশনগুলির সঠিক ব্যবহার আপনার DAX ক্যালকুলেশনকে আরও দ্রুত এবং কার্যকরী করবে। DAX-এ পারফরম্যান্স অপটিমাইজেশন আপনার রিপোর্টিং এবং ডেটা বিশ্লেষণ প্রক্রিয়াকে আরও উন্নত করবে এবং দ্রুত সিদ্ধান্ত গ্রহণে সহায়ক হবে।

Content added By
Promotion

Are you sure to start over?

Loading...