আমি কীভাবে এই মাইএসকিউএল কোয়েরিটিকে আরও অনুকূলিত করতে পারি?


9

আমার একটি ক্যোয়ারী রয়েছে যা চালাতে বিশেষত দীর্ঘ সময় নিচ্ছে (15+ সেকেন্ড) এবং আমার ডেটাসেট বাড়ার সাথে সাথে এটি কেবল সময়ের সাথে আরও খারাপ হচ্ছে। আমি অতীতে এটি অনুকূলিত করেছি, এবং সূচকগুলি, কোড-স্তরের বাছাই এবং অন্যান্য অপ্টিমাইজেশানগুলি যুক্ত করেছি, তবে এটি আরও কিছু পুনরায় পরিমার্জন প্রয়োজন।

SELECT sounds.*, avg(ratings.rating) AS avg_rating, count(ratings.rating) AS votes FROM `sounds` 
INNER JOIN ratings ON sounds.id = ratings.rateable_id 
WHERE (ratings.rateable_type = 'Sound' 
   AND sounds.blacklisted = false 
   AND sounds.ready_for_deployment = true 
   AND sounds.deployed = true 
   AND sounds.type = "Sound" 
   AND sounds.created_at > "2011-03-26 21:25:49") 
GROUP BY ratings.rateable_id

ক্যোয়ারির উদ্দেশ্য হল আমার sound idসর্বাধিক সাম্প্রতিক, প্রকাশিত শব্দের গড় রেটিং। প্রায় 1500 শব্দ এবং 2 মিলিয়ন রেটিং রয়েছে।

আমার বেশ কয়েকটি সূচক রয়েছে sounds

mysql> show index from sounds;
+--------+------------+------------------------------------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+————+
| Table  | Non_unique | Key_name                                 | Seq_in_index | Column_name          | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+------------------------------------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+————+
| sounds |          0 | PRIMARY                                  |            1 | id                   | A         |        1388 |     NULL | NULL   |      | BTREE      |         | 
| sounds |          1 | sounds_ready_for_deployment_and_deployed |            1 | deployed             | A         |           5 |     NULL | NULL   | YES  | BTREE      |         | 
| sounds |          1 | sounds_ready_for_deployment_and_deployed |            2 | ready_for_deployment | A         |          12 |     NULL | NULL   | YES  | BTREE      |         | 
| sounds |          1 | sounds_name                              |            1 | name                 | A         |        1388 |     NULL | NULL   |      | BTREE      |         | 
| sounds |          1 | sounds_description                       |            1 | description          | A         |        1388 |      128 | NULL   | YES  | BTREE      |         | 
+--------+------------+------------------------------------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+---------+

এবং বেশ কয়েকটি ratings

mysql> show index from ratings;
+---------+------------+-----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+————+
| Table   | Non_unique | Key_name                                | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+-----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+————+
| ratings |          0 | PRIMARY                                 |            1 | id          | A         |     2008251 |     NULL | NULL   |      | BTREE      |         | 
| ratings |          1 | index_ratings_on_rateable_id_and_rating |            1 | rateable_id | A         |          18 |     NULL | NULL   |      | BTREE      |         | 
| ratings |          1 | index_ratings_on_rateable_id_and_rating |            2 | rating      | A         |        9297 |     NULL | NULL   | YES  | BTREE      |         | 
+---------+------------+-----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

এখানে EXPLAIN

mysql> EXPLAIN SELECT sounds.*, avg(ratings.rating) AS avg_rating, count(ratings.rating) AS votes FROM sounds INNER JOIN ratings ON sounds.id = ratings.rateable_id WHERE (ratings.rateable_type = 'Sound' AND sounds.blacklisted = false AND sounds.ready_for_deployment = true AND sounds.deployed = true AND sounds.type = "Sound" AND sounds.created_at > "2011-03-26 21:25:49") GROUP BY ratings.rateable_id;
+----+-------------+---------+--------+--------------------------------------------------+-----------------------------------------+---------+-----------------------------------------+---------+——————+
| id | select_type | table   | type   | possible_keys                                    | key                                     | key_len | ref                                     | rows    | Extra       |
+----+-------------+---------+--------+--------------------------------------------------+-----------------------------------------+---------+-----------------------------------------+---------+——————+
|  1 | SIMPLE      | ratings | index  | index_ratings_on_rateable_id_and_rating          | index_ratings_on_rateable_id_and_rating | 9       | NULL                                    | 2008306 | Using where | 
|  1 | SIMPLE      | sounds  | eq_ref | PRIMARY,sounds_ready_for_deployment_and_deployed | PRIMARY                                 | 4       | redacted_production.ratings.rateable_id |       1 | Using where | 
+----+-------------+---------+--------+--------------------------------------------------+-----------------------------------------+---------+-----------------------------------------+---------+-------------+

আমি একবারে প্রাপ্ত ফলাফলগুলিতে ক্যাশে করি, তাই সাইটের কার্য সম্পাদন কোনও সমস্যার বেশি হয় না, তবে আমার ক্যাশে ওয়ার্মাররা এই কলটি এত বেশি সময় নিয়ে যাওয়ার কারণে চালাতে আরও বেশি সময় নিচ্ছে এবং এটি একটি ইস্যুতে পরিণত হতে শুরু করেছে। এটি একটি ক্যোয়ারিতে ক্রাঙ্ক করার মতো অনেক সংখ্যার মতো বলে মনে হচ্ছে না ...

এটিকে আরও ভালভাবে সম্পাদন করতে আমি আরও কী করতে পারি ?


EXPLAINআউটপুট দেখাতে পারবেন ? EXPLAIN SELECT sounds.*, avg(ratings.rating) AS avg_rating, count(ratings.rating) AS votes FROM sounds INNER JOIN ratings ON sounds.id = ratings.rateable_id WHERE (ratings.rateable_type = 'Sound' AND sounds.blacklisted = false AND sounds.ready_for_deployment = true AND sounds.deployed = true AND sounds.type = "Sound" AND sounds.created_at > "2011-03-26 21:25:49") GROUP BY ratings.rateable_id
ডেরেক ডাউনি

@ কনিবিয়ার এটি আমার জন্য আজ খুব আকর্ষণীয় চ্যালেঞ্জ ছিল !!! আপনার প্রশ্নের জন্য +1। আমি আশা করি নিকট ভবিষ্যতে এ জাতীয় আরও প্রশ্ন আসুক।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ কনিবিয়ার দেখে মনে হচ্ছে নতুন এক্সপ্ল্লেইন কেবল 2,008,306 এর পরিবর্তে 21540 সারি (359 এক্স 60) পড়ে reads দয়া করে আমি আমার উত্তরটিতে মূলত প্রস্তাবিত ক্যোয়ারির উপরের ব্যাখ্যাটি চালান। আমি যে সারিগুলি থেকে আসে তার সংখ্যা দেখতে চাই।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ রোল্যান্ডোমাইএসকিউএলডিবিএ নতুন ব্যাখ্যাটিতে প্রকৃতপক্ষে সূচকটি দিয়ে দেখানো হয়েছে যে কম পরিমাণে সারি রয়েছে, তবে কোয়েরিটি কার্যকর করার সময়টি এখনও প্রায় 15 সেকেন্ড ছিল, কোনও উন্নতি
দেখায়নি

@coneybeare আমি কোয়েরিটি ভাল করে দিয়েছি। দয়া করে আমার নতুন ক্যোয়ারিতে ব্যাখ্যাটি চালান। আমি আমার উত্তরে এটি যুক্ত করেছি।
রোল্যান্ডোমাইএসকিউএলডিবিএ

উত্তর:


7

ক্যোয়ারী, টেবিলগুলি এবং ক্লজগুলি এবং কোথায় এবং গ্রুপটি দেখার পরে আমি নিম্নলিখিতটি সুপারিশ করছি:

প্রস্তাবনা # 1) রিফ্যাক্টর ক্যোয়ারী

আমি তিনটি (3) কাজ করার জন্য ক্যোয়ারিকে পুনর্গঠিত করেছি:

  1. ছোট টেম্প টেবিল তৈরি করুন
  2. এই টেম্প টেবিলগুলিতে WHERE ক্লজটি প্রক্রিয়া করুন
  3. দেরী শেষ পর্যন্ত যোগদান

এখানে আমার প্রস্তাবিত ক্যোয়ারী:

SELECT
  sounds.*,srkeys.avg_rating,srkeys.votes
FROM
(
  SELECT AA.id,avg(BB.rating) AS avg_rating, count(BB.rating) AS votes
  (
    SELECT id FROM sounds
    WHERE blacklisted = false 
    AND   ready_for_deployment = true 
    AND   deployed = true 
    AND   type = "Sound" 
    AND   created_at > '2011-03-26 21:25:49'
  ) AA INNER JOIN
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
  ) BB
  ON AA.id = BB.rateable_id
  GROUP BY BB.rateable_id
) srkeys INNER JOIN sounds USING (id);

প্রস্তাবনা # 2) শব্দের সারণি সূচকটি এমন একটি সূচি দিয়ে সূচিত করে যা পুরো ধারাটি মঞ্জুর করবে

এই সূচকের কলামগুলিতে প্রথমে স্থির মানগুলির সাথে সর্বশেষ ক্লোজিং লক্ষ্য সহ WHERE ধারা থেকে সমস্ত কলাম অন্তর্ভুক্ত রয়েছে

ALTER TABLE sounds ADD INDEX support_index
(blacklisted,ready_for_deployment,deployed,type,created_at);

আমি আন্তরিকভাবে বিশ্বাস করি যে আপনি আনন্দিতভাবে অবাক হবেন। একবার চেষ্টা করে দেখো !!!

আপডেট ২০১১-০৫-২১ ১৯:০৪

আমি কেবল কার্ডিনালিটি দেখেছি। ওহ !!! রেটেবল_আইডির জন্য কার্ডিনালিটি 1। ছেলে, আমি বোকা বোধ করি !!!

আপডেট ২০১১-০৫-২১ ১৯:২০

হতে পারে সূচি তৈরি করা জিনিসগুলির উন্নতির জন্য যথেষ্ট হবে।

আপডেট করুন 2011-05-21 22:56

দয়া করে এটি চালান:

EXPLAIN SELECT
  sounds.*,srkeys.avg_rating,srkeys.votes
FROM
(
  SELECT AA.id,avg(BB.rating) AS avg_rating, count(BB.rating) AS votes FROM
  (
    SELECT id FROM sounds
    WHERE blacklisted = false 
    AND   ready_for_deployment = true 
    AND   deployed = true 
    AND   type = "Sound" 
    AND   created_at > '2011-03-26 21:25:49'
  ) AA INNER JOIN
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
  ) BB
  ON AA.id = BB.rateable_id
  GROUP BY BB.rateable_id
) srkeys INNER JOIN sounds USING (id);

আপডেট করুন 2011-05-21 23:34

আমি আবার এটি রিফ্যাক্টর। দয়া করে এটি চেষ্টা করুন:

EXPLAIN
  SELECT AA.id,avg(BB.rating) AS avg_rating, count(BB.rating) AS votes FROM
  (
    SELECT id FROM sounds
    WHERE blacklisted = false 
    AND   ready_for_deployment = true 
    AND   deployed = true 
    AND   type = "Sound" 
    AND   created_at > '2011-03-26 21:25:49'
  ) AA INNER JOIN
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
  ) BB
  ON AA.id = BB.rateable_id
  GROUP BY BB.rateable_id
;

আপডেট করুন 2011-05-21 23:55

আমি আবার এটি রিফ্যাক্টর। দয়া করে একবার চেষ্টা করুন (শেষ বার):

EXPLAIN
  SELECT A.id,avg(B.rating) AS avg_rating, count(B.rating) AS votes FROM
  (
    SELECT BB.* FROM
    (
      SELECT id FROM sounds
      WHERE blacklisted = false 
      AND   ready_for_deployment = true 
      AND   deployed = true 
      AND   type = "Sound" 
      AND   created_at > '2011-03-26 21:25:49'
    ) AA INNER JOIN sounds BB USING (id)
  ) A INNER JOIN
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
  ) B
  ON A.id = B.rateable_id
  GROUP BY B.rateable_id;

আপডেট 2011-05-22 00:12

আমি হাল ছেড়ে দিচ্ছি না !!!!

EXPLAIN
  SELECT A.*,avg(B.rating) AS avg_rating, count(B.rating) AS votes FROM
  (
    SELECT BB.* FROM
    (
      SELECT id FROM sounds
      WHERE blacklisted = false 
      AND   ready_for_deployment = true 
      AND   deployed = true 
      AND   type = "Sound" 
      AND   created_at > '2011-03-26 21:25:49'
    ) AA INNER JOIN sounds BB USING (id)
  ) A,
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
    AND AAA.rateable_id = A.id
  ) B
  GROUP BY B.rateable_id;

আপডেট ২০১১-০৫-২২ 07:51

এটি আমাকে বিরক্ত করছে যে এক্সপ্লাইনে 2 মিলিয়ন সারি নিয়ে রেটিংগুলি ফিরে আসছে। তারপরে, এটি আমাকে আঘাত করেছে। রেটিং টেবিলটিতে আপনার আর একটি সূচক প্রয়োজন হতে পারে যা রেটেবল_ টাইপ দিয়ে শুরু হয়:

ALTER TABLE ratings ADD INDEX
rateable_type_rateable_id_ndx (rateable_type,rateable_id);

এই সূচকটির লক্ষ্য হ'ল টেম্প টেবিলটি হ্রাস করা যা রেটিংগুলিতে হেরফের করে যাতে এটি 2 মিলিয়নের চেয়ে কম হয়। যদি আমরা সেই টেম্প টেবিলটি উল্লেখযোগ্যভাবে ছোট (কমপক্ষে অর্ধেক) পেতে পারি, তবে আমরা আপনার ক্যোয়ারিতে আরও ভাল আশা করতে পারি এবং আমারও দ্রুত কাজ করছে।

সেই সূচিটি তৈরির পরে, দয়া করে আমার মূল প্রস্তাবিত ক্যোয়ারীটি আবার চেষ্টা করুন এবং আপনার চেষ্টাও করুন:

SELECT
  sounds.*,srkeys.avg_rating,srkeys.votes
FROM
(
  SELECT AA.id,avg(BB.rating) AS avg_rating, count(BB.rating) AS votes
  (
    SELECT id FROM sounds
    WHERE blacklisted = false 
    AND   ready_for_deployment = true 
    AND   deployed = true 
    AND   type = "Sound" 
    AND   created_at > '2011-03-26 21:25:49'
  ) AA INNER JOIN
  (
    SELECT AAA.ratings,AAA.rateable_id
    FROM ratings AAA
    WHERE rateable_type = 'Sound'
  ) BB
  ON AA.id = BB.rateable_id
  GROUP BY BB.rateable_id
) srkeys INNER JOIN sounds USING (id);

আপডেট ২০১১-০৫-২২ ১৮:৩৯: শেষ শব্দ

আমি একটি সঞ্চিত পদ্ধতিতে একটি কোয়েরি রিফ্যাক্টর করেছিলাম এবং জিনিসগুলি গতি বাড়ানোর বিষয়ে একটি প্রশ্নের উত্তর দিতে সহায়তা করার জন্য একটি সূচক যুক্ত করেছি। আমি 6 টি upvotes পেয়েছি, উত্তর গৃহীত হয়েছে, এবং 200 অনুগ্রহ বাছাই।

আমি আরও একটি ক্যোয়ারী (প্রান্তিক ফলাফল) রিফ্যাক্ট করে একটি সূচক (নাটকীয় ফলাফল) যুক্ত করেছি। আমি 2 টি upvotes পেয়েছি এবং উত্তর গৃহীত হয়েছে।

আমি আরও একটি ক্যোয়ারী চ্যালেঞ্জের জন্য একটি সূচক যুক্ত করেছি এবং একবার উত্সাহিত হয়েছিল

এবং এখন আপনার প্রশ্ন

এগুলি (আপনার সহ) সকল প্রশ্নের উত্তর দিতে চাইছি এমন একটি ইউটিউব ভিডিও দ্বারা অনুপ্রাণিত হয়েছিল যা আমি রিফেক্টরিং কোয়েরিতে দেখেছি।

আবার আপনাকে ধন্যবাদ, কনিবিয়ার !!! আমি কেবলমাত্র পয়েন্ট বা প্রশংসা গ্রহণ না করেই এই প্রশ্নের উত্তর পুরোপুরিভাবে দিতে চেয়েছিলাম। এখন, আমি অনুভব করতে পারি যে আমি পয়েন্টগুলি অর্জন করেছি !!!


আমি সূচকটি যুক্ত করেছি, সময়মতো কোনও উন্নতি হয়নি। এখানে নতুন ব্যাখ্যাটি দেওয়া হয়েছে: cloud.coneybeare.net/6y7c
coneybeare

প্রস্তাবনা ১: ক্লাউড.কোনিবিয়ার.net / 6xZ2 থেকে ক্যোয়ারির ব্যাখ্যা দিন, এই কোয়েরিটি চালাতে প্রায় 30 সেকেন্ড সময় লেগেছে
কনেকেয়ার

আমাকে কোনও কারণে আপনার সিনট্যাক্সটি সামান্য সম্পাদনা করতে হয়েছিল (আমি প্রথম ক্যোয়ারির আগে একটি FROM যুক্ত করেছি, এবং আমাকে এএএর নামটি থেকে মুক্তি দিতে হয়েছিল)। এখানে ব্যাখ্যাটি দেওয়া হয়েছে: cloud.coneybeare.net/6xlq আসল জিজ্ঞাসাটি চালাতে প্রায় 30 সেকেন্ড সময় নিয়েছিল
কনেকেয়ার

@ রোল্যান্ডোমাইএসকিউএলডিবিএ: আপনার ২৩:৫৫ আপডেটের বিষয়ে ব্যাখ্যা করুন: ক্লাউড.কুনিবিয়ার.net / 6wrN আসল প্রশ্নটি এক মিনিটেরও বেশি সময় ধরে চলেছিল তাই আমি এই প্রক্রিয়াটি
মেরেছি

দ্বিতীয় অভ্যন্তরীণ নির্বাচন এ নির্বাচন করা টেবিলটি অ্যাক্সেস করতে পারে না, সুতরাং এআইডি ত্রুটি ছুঁড়ে ফেলে।
কনফেয়ার

3

এক্সপ্লেইন আউটপুট জন্য ধন্যবাদ। আপনি যে বিবৃতি থেকে বলতে পারেন যে, এটি এত দিন নিচ্ছে তার কারণটি হ'ল রেটিং টেবিলের পুরো টেবিলস্ক্যান। WHERE বিবৃতিতে কিছুই 2 মিলিয়ন সারিগুলি ফিল্টার করছে না।

আপনি রেটিং.প্রকার টাইপে একটি সূচক যুক্ত করতে পারেন, তবে আমার ধারণা যে কর্ডিনালিটিটি আসল নিম্ন হতে চলেছে এবং আপনি এখনও বেশ কয়েকটি সারি স্ক্যান করতে পারবেন ratings

বিকল্পভাবে আপনি মাইএসকিএলকে শব্দ সূচকগুলি ব্যবহার করতে বাধ্য করার জন্য সূচক ইঙ্গিতগুলি ব্যবহার করার চেষ্টা করতে পারেন ।

আপডেট করা হয়েছে:

এটি যদি আমি হতাম তবে আমি একটি সূচি যুক্ত করতাম sounds.createdকারণ সারিগুলি ফিল্টার করার সর্বোত্তম সম্ভাবনা রয়েছে এবং সম্ভবত মাইএসকিএল কোয়েরি অপ্টিমাইজারকে শব্দ টেবিল সূচকগুলি ব্যবহার করতে বাধ্য করবে। দীর্ঘ তৈরি সময় ফ্রেম (1 বছর, 3 মাস, কেবলমাত্র শব্দ টেবিলের আকারের উপর নির্ভর করে) ব্যবহার করে এমন প্রশ্নের মধ্যে কেবল সাবধান থাকুন।


দেখে মনে হচ্ছে আপনার পরামর্শটি কনিবিয়ারের জন্য উল্লেখযোগ্য ছিল। আমার কাছ থেকেও +1।
রোল্যান্ডোমাইএসকিউএলডিবিএ

তৈরি সূচকটি কোনও সময় শেভ করেনি। এখানে আপডেট করা হয়েছে। cloud.coneybeare.net/6xvc
coneybeare

2

এটি যদি "অন-দ্য ফ্লাই" উপলভ্য ক্যোয়ারী হতে হয়, তবে এটি আপনার বিকল্পগুলি কিছুটা সীমিত করে।

আমি এই সমস্যার জন্য বিভাজন এবং বিজয় প্রস্তাব করতে যাচ্ছি।

--
-- Create an in-memory table
CREATE TEMPORARY TABLE rating_aggregates (
rateable_id INT,
avg_rating NUMERIC,
votes NUMERIC
);
--
-- For now, just aggregate. 
INSERT INTO rating_aggregates
SELECT ratings.rateable_id, 
avg(ratings.rating) AS avg_rating, 
count(ratings.rating) AS votes FROM `sounds`  
WHERE ratings.rateable_type = 'Sound' 
GROUP BY ratings.rateable_id;
--
-- Now get your final product --
SELECT 
sounds.*, 
rating_aggregates.avg_rating, 
rating_aggregates.votes AS votes,
rating_aggregates.rateable_id 
FROM rating_aggregates 
INNER JOIN sounds ON (sounds.id = rating_aggregates.rateable_id) 
WHERE 
ratings.rateable_type = 'Sound' 
   AND sounds.blacklisted = false 
   AND sounds.ready_for_deployment = true 
   AND sounds.deployed = true 
   AND sounds.type = "Sound" 
   AND sounds.created_at > "2011-03-26 21:25:49";

মনে হয় @ কনিবিয়ার আপনার পরামর্শে কিছু দেখেছিল। আমার কাছ থেকে +1 !!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমি আসলে এটি কাজ করতে পারি না। আমি স্কিএল ত্রুটি পেয়েছিলাম যে আমি কীভাবে যাব সে সম্পর্কে আমি নিশ্চিত নই। আমি সত্যিই অস্থায়ী টেবিলগুলি নিয়ে কখনই কাজ করতে পারি নি
কনেকেয়ার

আমি (আমি থেকে যোগ করার জন্য ছিল অবশেষে এটি পেতে করেনি sounds, ratingsমধ্যম ক্যোয়ারী করা), কিন্তু এটা আমার SQL বাক্স লক এবং আমি প্রক্রিয়া হত্যা করতে হয়েছিল।
কনেকেয়ার

0

জোয়াইনগুলি ব্যবহার করুন, সাবকোয়ারি নয়। আপনার subquery প্রচেষ্টা কেউ সাহায্য করেছিল?

টেবিলের শব্দ তৈরি করুন \ জি

টেবিল রেটিং তৈরি করুন \ জি

প্রায়শই সিঙ্গেল-কলামগুলি নয়, তবে "যৌগিক" সূচকগুলি থাকা উপকারী। সম্ভবত INDEX (টাইপ করুন, তৈরি_এটি)

আপনি একটি জোনে উভয় টেবিলগুলিতে ফিল্টার করছেন; এটি সম্ভবত একটি পারফরম্যান্স সমস্যা হতে পারে।

প্রায় 1500 শব্দ এবং 2 মিলিয়ন রেটিং রয়েছে।

আপনার একটি অটো_সংশোধন আইডি চালু আছে ratings, একটি সংক্ষিপ্তসার সারণি তৈরি করুন এবং আপনি কোথায় "রেখে গেছেন" তার নজর রাখার জন্য এআই আইডি ব্যবহার করুন Recommend তবে, একটি সংক্ষিপ্ত সারণীতে গড় সঞ্চয় করবেন না:

গড় (রেটিং.রেটিং) AS গড়_রেটিং,

পরিবর্তে, এসইউএম (রেটিং.রেটিং) রাখুন। গড়ে গড় গণনা করার জন্য গড় গাণিতিকভাবে ভুল; (অঙ্কের যোগফল) / (গণনার যোগফল) সঠিক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.