অন্য কলামের উপর ভিত্তি করে চলমান মোট রিসেট করুন


10

আমি মোট চলমান গণনা করার চেষ্টা করছি। তবে এটি পুনরায় সেট করা উচিত যখন অন্য কলাম মানের থেকে সংখ্যাসূচক যোগফল

create table #reset_runn_total
(
id int identity(1,1),
val int, 
reset_val int,
grp int
)

insert into #reset_runn_total
values 
(1,10,1),
(8,12,1),(6,14,1),(5,10,1),(6,13,1),(3,11,1),(9,8,1),(10,12,1)


SELECT Row_number()OVER(partition BY grp ORDER BY id)AS rn,*
INTO   #test
FROM   #reset_runn_total

সূচকের বিশদ:

CREATE UNIQUE CLUSTERED INDEX ix_load_reset_runn_total
  ON #test(rn, grp) 

নমুনা তথ্য

+----+-----+-----------+-----+
| id | val | reset_val | Grp |
+----+-----+-----------+-----+
|  1 |   1 |        10 | 1   |
|  2 |   8 |        12 | 1   |
|  3 |   6 |        14 | 1   |
|  4 |   5 |        10 | 1   |
|  5 |   6 |        13 | 1   |
|  6 |   3 |        11 | 1   |
|  7 |   9 |         8 | 1   |
|  8 |  10 |        12 | 1   |
+----+-----+-----------+-----+ 

প্রত্যাশিত ফলাফল

+----+-----+-----------------+-------------+
| id | val |    reset_val    | Running_tot |
+----+-----+-----------------+-------------+
|  1 |   1 | 10              |       1     |  
|  2 |   8 | 12              |       9     |  --1+8
|  3 |   6 | 14              |       15    |  --1+8+6 -- greater than reset val
|  4 |   5 | 10              |       5     |  --reset 
|  5 |   6 | 13              |       11    |  --5+6
|  6 |   3 | 11              |       14    |  --5+6+3 -- greater than reset val
|  7 |   9 | 8               |       9     |  --reset -- greater than reset val 
|  8 |  10 | 12              |      10     |  --reset
+----+-----+-----------------+-------------+

প্রশ্ন:

আমি ব্যবহার করে ফলাফল পেয়েছি Recursive CTE। আসল প্রশ্নটি এখানে /programming/42085404/reset-running-total-based-on-another-column

;WITH cte
     AS (SELECT rn,id,
                val,
                reset_val,
                grp,
                val                   AS running_total,
                Iif (val > reset_val, 1, 0) AS flag
         FROM   #test
         WHERE  rn = 1
         UNION ALL
         SELECT r.*,
                Iif(c.flag = 1, r.val, c.running_total + r.val),
                Iif(Iif(c.flag = 1, r.val, c.running_total + r.val) > r.reset_val, 1, 0)
         FROM   cte c
                JOIN #test r
                  ON r.grp = c.grp
                     AND r.rn = c.rn + 1)
SELECT *
FROM   cte 

T-SQLব্যবহার না করে এর চেয়ে ভাল বিকল্প আর কি আছে CLR?


কিভাবে ভাল? এই ক্যোয়ারী খারাপ কর্মক্ষমতা প্রদর্শন করে? কি মেট্রিক ব্যবহার করছেন?
অ্যারন বার্ট্র্যান্ড

অ্যারোনবার্ট্র্যান্ড - আরও ভাল বোঝার জন্য আমি মাত্র একটি গোষ্ঠীর জন্য নমুনা ডেটা পোস্ট করেছি। আইডির চারপাশের 50000গ্রুপগুলির জন্য আমাকেও একই কাজ করতে হবে । সুতরাং মোট রেকর্ডের গণনা প্রায় হবে । আমি নিশ্চিত স্কেল ভাল হবে না । আমি অফিসে ফিরে এলে মেট্রিকগুলি আপডেট করব। Sqlperformance.com/2012/07/t-sql-queries/running-totals আপনি এই নিবন্ধটিতে যেমন ব্যবহার করেছেন আমরা কি তা ব্যবহার করে তা অর্জন করতে পারি60 3000000Recursive CTE3000000sum()Over(Order by)
পি ரதீப்

একটি কার্সার একটি পুনরাবৃত্ত সিটিই
পাপারাজ্জো

উত্তর:


6

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

সমস্যাটি সম্পর্কে চিন্তা করার একটি উপায় হ'ল আপনি যদি পূর্বের সঠিক সারি থেকে চলমান মোট বিয়োগ করতে পারেন তবে আপনি যদি কোনও প্রাথমিক চলমান মোট গণনা করেন তবে আপনি চান শেষ ফলাফলটি পেতে পারেন। উদাহরণস্বরূপ, আপনার নমুনা ডেটাতে id4 এর মান হয় running total of row 4 - the running total of row 3id6 এর মান হ'ল running total of row 6 - the running total of row 3কারণ পুনরায় সেট করা এখনও হয়নি। id7 এর মান হ'ল running total of row 7 - the running total of row 6এবং তেমন ।

আমি লুপে টি-এসকিউএল দিয়ে এটি ব্যবহার করব। আমি কিছুটা দূরে সরে গিয়েছি এবং মনে করি আমার একটি সম্পূর্ণ সমাধান রয়েছে। 3 মিলিয়ন সারি এবং 500 টি গোষ্ঠীর জন্য কোডটি আমার ডেস্কটপে 24 সেকেন্ডের মধ্যে শেষ হয়েছে। আমি এসকিউএল সার্ভার 2016 বিকাশকারী সংস্করণ 6 টি ভিসিপিইউ দিয়ে পরীক্ষা করছি। আমি সমান্তরাল সন্নিবেশ এবং সমান্তরাল সম্পাদনার সুবিধা নিচ্ছি তাই আপনার যদি পুরানো সংস্করণে থাকে বা ডপ সীমাবদ্ধতা থাকে তবে আপনার কোডটি পরিবর্তন করতে হবে।

কোডটি নীচে যা আমি ডেটা উত্পন্ন করতে ব্যবহার করি। রেঞ্জগুলি চালু VALএবং RESET_VALআপনার নমুনা ডেটার অনুরূপ হওয়া উচিত।

drop table if exists reset_runn_total;

create table reset_runn_total
(
id int identity(1,1),
val int, 
reset_val int,
grp int
);

DECLARE 
@group_num INT,
@row_num INT;
BEGIN
    SET NOCOUNT ON;
    BEGIN TRANSACTION;

    SET @group_num = 1;
    WHILE @group_num <= 50000 
    BEGIN
        SET @row_num = 1;
        WHILE @row_num <= 60
        BEGIN
            INSERT INTO reset_runn_total WITH (TABLOCK)
            SELECT 1 + ABS(CHECKSUM(NewId())) % 10, 8 + ABS(CHECKSUM(NewId())) % 8, @group_num;

            SET @row_num = @row_num + 1;
        END;
        SET @group_num = @group_num + 1;
    END;
    COMMIT TRANSACTION;
END;

অ্যালগরিদম নিম্নরূপ:

1) একটি টেম্প টেবিলের মধ্যে স্ট্যান্ডার্ড চলমান মোট সহ সমস্ত সারি সন্নিবেশ করে শুরু করুন।

2) একটি লুপে:

২ ক) প্রতিটি গ্রুপের জন্য, প্রথম সারিটি টেবিলের মধ্যে থাকা রিসেট_মূল্যের উপরে চলমান মোটের সাথে গণনা করুন এবং আইডি, চলমান মোট যা খুব বড় ছিল এবং টেম্প টেবিলের মধ্যে পূর্বের চলমান মোটটি খুব বড় store

2 খ) প্রথম টেম্প টেবিল থেকে সারণিগুলি মুছুন ফলাফলের টেম্প টেবিলের মধ্যে যা দ্বিতীয় টেম্প টেবিলের IDচেয়ে কম বা সমান ID। প্রয়োজন অনুসারে চলমান মোট সমন্বয় করতে অন্যান্য কলামগুলি ব্যবহার করুন।

3) মুছে ফেলার পরে আর সারিগুলি প্রক্রিয়া DELETE OUTPUTকরে না ফলাফলের টেবিলটিতে একটি অতিরিক্ত চালায় । এটি সেই গোষ্ঠীর শেষে থাকা সারিগুলির জন্য যা পুনরায় সেট করার মানটি অতিক্রম করে না।

আমি টি-এসকিউএল ধাপে ধাপে উপরের অ্যালগরিদমের একটি বাস্তবায়ন করব।

কয়েকটি টেম্প টেবিল তৈরি করে শুরু করুন। #initial_resultsস্ট্যান্ডার্ড চলমান মোটের সাথে মূল ডেটা ধারণ করে, #group_bookkeepingকোন সারিগুলি সরানো যেতে পারে তা নির্ধারণের জন্য প্রতিটি লুপ আপডেট করা হয় এবং #final_resultsএতে পুনরায় সেট করার জন্য চলমান মোট সমন্বয় সহ ফলাফল রয়েছে।

CREATE TABLE #initial_results (
id int,
val int, 
reset_val int,
grp int,
initial_running_total int
);

CREATE TABLE #group_bookkeeping (
grp int,
max_id_to_move int,
running_total_to_subtract_this_loop int,
running_total_to_subtract_next_loop int,
grp_done bit, 
PRIMARY KEY (grp)
);

CREATE TABLE #final_results (
id int,
val int, 
reset_val int,
grp int,
running_total int
);

INSERT INTO #initial_results WITH (TABLOCK)
SELECT ID, VAL, RESET_VAL, GRP, SUM(VAL) OVER (PARTITION BY GRP ORDER BY ID) RUNNING_TOTAL
FROM reset_runn_total;

CREATE CLUSTERED INDEX i1 ON #initial_results (grp, id);

INSERT INTO #group_bookkeeping WITH (TABLOCK)
SELECT DISTINCT GRP, 0, 0, 0, 0
FROM reset_runn_total;

আমি টেম্প টেবিলের উপরে ক্লাস্টারড ইনডেক্স তৈরি করি যাতে সন্নিবেশ এবং সূচী বিল্ডটি সমান্তরালভাবে করা যায়। আমার মেশিনে একটি বড় পার্থক্য তৈরি করেছে তবে এটি আপনার নাও হতে পারে। উত্স টেবিলের উপর একটি সূচক তৈরি করা সাহায্য বলে মনে হচ্ছে না তবে এটি আপনার মেশিনে সহায়তা করতে পারে।

নীচের কোডটি লুপে চলে এবং বুককিপিং টেবিলটি আপডেট করে। প্রতিটি গোষ্ঠীর জন্য আমাদের সর্বাধিক সন্ধান IDকরতে হবে যা ফলাফল সারণীতে স্থানান্তরিত হওয়া উচিত। আমাদের সেই সারি থেকে চলমান মোটের দরকার তাই আমরা প্রাথমিক চলমান মোট থেকে এটি বিয়োগ করতে পারি। grp_doneকলামটি 1 সেট যখন একটি জন্য কি কোন কাজ নয় grp

WITH UPD_CTE AS (
        SELECT 
        #grp_bookkeeping.GRP
        , MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN ID ELSE NULL END) max_id_to_update
        , MIN(#group_bookkeeping.running_total_to_subtract_next_loop) running_total_to_subtract_this_loop
        , MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN initial_running_total ELSE NULL END) additional_value_next_loop
        , CASE WHEN MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN ID ELSE NULL END) IS NULL THEN 1 ELSE 0 END grp_done
        FROM #group_bookkeeping 
        INNER JOIN #initial_results IR ON #group_bookkeeping.grp = ir.grp
        WHERE #group_bookkeeping.grp_done = 0
        GROUP BY #group_bookkeeping.GRP
    )
    UPDATE #group_bookkeeping
    SET #group_bookkeeping.max_id_to_move = uv.max_id_to_update
    , #group_bookkeeping.running_total_to_subtract_this_loop = uv.running_total_to_subtract_this_loop
    , #group_bookkeeping.running_total_to_subtract_next_loop = uv.additional_value_next_loop
    , #group_bookkeeping.grp_done = uv.grp_done
    FROM UPD_CTE uv
    WHERE uv.GRP = #group_bookkeeping.grp
OPTION (LOOP JOIN);

সত্যই LOOP JOINসাধারণভাবে ইঙ্গিতটির অনুরাগী নয় , তবে এটি একটি সাধারণ ক্যোয়ারী এবং আমি যা চাইছিলাম তা পাওয়ার এটি ছিল দ্রুততম উপায়। প্রতিক্রিয়া সময়ের জন্য সত্যিই অপ্টিমাইজ করতে আমি চেয়েছিলাম যে সমান্তরাল নেস্টেড লুপটি ডওপ 1 এর পরিবর্তে একত্রীকরণের সাথে যোগ দেয়।

নীচের কোডটি লুপে চলে এবং প্রাথমিক টেবিল থেকে ডেটা চূড়ান্ত ফলাফলের টেবিলের দিকে নিয়ে যায়। প্রাথমিক চলমান মোটের সমন্বয় লক্ষ্য করুন।

DELETE ir
OUTPUT DELETED.id,  
    DELETED.VAL,  
    DELETED.RESET_VAL,  
    DELETED.GRP ,
    DELETED.initial_running_total - tb.running_total_to_subtract_this_loop
INTO #final_results
FROM #initial_results ir
INNER JOIN #group_bookkeeping tb ON ir.GRP = tb.GRP AND ir.ID <= tb.max_id_to_move
WHERE tb.grp_done = 0;

আপনার সুবিধার জন্য নীচে পুরো কোডটি রয়েছে:

DECLARE @RC INT;
BEGIN
SET NOCOUNT ON;

CREATE TABLE #initial_results (
id int,
val int, 
reset_val int,
grp int,
initial_running_total int
);

CREATE TABLE #group_bookkeeping (
grp int,
max_id_to_move int,
running_total_to_subtract_this_loop int,
running_total_to_subtract_next_loop int,
grp_done bit, 
PRIMARY KEY (grp)
);

CREATE TABLE #final_results (
id int,
val int, 
reset_val int,
grp int,
running_total int
);

INSERT INTO #initial_results WITH (TABLOCK)
SELECT ID, VAL, RESET_VAL, GRP, SUM(VAL) OVER (PARTITION BY GRP ORDER BY ID) RUNNING_TOTAL
FROM reset_runn_total;

CREATE CLUSTERED INDEX i1 ON #initial_results (grp, id);

INSERT INTO #group_bookkeeping WITH (TABLOCK)
SELECT DISTINCT GRP, 0, 0, 0, 0
FROM reset_runn_total;

SET @RC = 1;
WHILE @RC > 0 
BEGIN
    WITH UPD_CTE AS (
        SELECT 
        #group_bookkeeping.GRP
        , MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN ID ELSE NULL END) max_id_to_move
        , MIN(#group_bookkeeping.running_total_to_subtract_next_loop) running_total_to_subtract_this_loop
        , MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN initial_running_total ELSE NULL END) additional_value_next_loop
        , CASE WHEN MIN(CASE WHEN initial_running_total - #group_bookkeeping.running_total_to_subtract_next_loop > RESET_VAL THEN ID ELSE NULL END) IS NULL THEN 1 ELSE 0 END grp_done
        FROM #group_bookkeeping 
        CROSS APPLY (SELECT ID, RESET_VAL, initial_running_total FROM #initial_results ir WHERE #group_bookkeeping.grp = ir.grp ) ir
        WHERE #group_bookkeeping.grp_done = 0
        GROUP BY #group_bookkeeping.GRP
    )
    UPDATE #group_bookkeeping
    SET #group_bookkeeping.max_id_to_move = uv.max_id_to_move
    , #group_bookkeeping.running_total_to_subtract_this_loop = uv.running_total_to_subtract_this_loop
    , #group_bookkeeping.running_total_to_subtract_next_loop = uv.additional_value_next_loop
    , #group_bookkeeping.grp_done = uv.grp_done
    FROM UPD_CTE uv
    WHERE uv.GRP = #group_bookkeeping.grp
    OPTION (LOOP JOIN);

    DELETE ir
    OUTPUT DELETED.id,  
        DELETED.VAL,  
        DELETED.RESET_VAL,  
        DELETED.GRP ,
        DELETED.initial_running_total - tb.running_total_to_subtract_this_loop
    INTO #final_results
    FROM #initial_results ir
    INNER JOIN #group_bookkeeping tb ON ir.GRP = tb.GRP AND ir.ID <= tb.max_id_to_move
    WHERE tb.grp_done = 0;

    SET @RC = @@ROWCOUNT;
END;

DELETE ir 
OUTPUT DELETED.id,  
    DELETED.VAL,  
    DELETED.RESET_VAL,  
    DELETED.GRP ,
    DELETED.initial_running_total - tb.running_total_to_subtract_this_loop
    INTO #final_results
FROM #initial_results ir
INNER JOIN #group_bookkeeping tb ON ir.GRP = tb.GRP;

CREATE CLUSTERED INDEX f1 ON #final_results (grp, id);

/* -- do something with the data
SELECT *
FROM #final_results
ORDER BY grp, id;
*/

DROP TABLE #final_results;
DROP TABLE #initial_results;
DROP TABLE #group_bookkeeping;

END;

কেবল দুর্দান্ত আমি আপনাকে অনুগ্রহ দিয়ে পুরষ্কার দেব
পি ரதீப்

আমাদের সার্ভারে, 50000 জিপিপি এবং 60 আইডি এর জন্য আপনার 1 মিনিট 10 সেকেন্ড সময় লেগেছে। Recursive CTE2 মিনিট 15 সেকেন্ড সময় নিয়েছিল
পি ரதீப்

আমি উভয় কোড একই ডেটা দিয়ে পরীক্ষা করেছি। আপনার দুর্দান্ত ছিল। এটি আরও উন্নত করা যেতে পারে?
পি ரதீப்

আমি বলতে চাইছিলাম, আমি আপনার কোডটি আমাদের আসল তথ্যতে চালিয়েছি এবং এটি পরীক্ষা করেছি। আমার বাস্তব পদ্ধতিতে টেম্প টেবিলগুলিতে গণনা প্রক্রিয়া করা হয়, সম্ভবত এটি শক্তভাবে প্যাক করা উচিত। এটি 30 সেকেন্ডের কাছাকাছি যেকোন কিছুতে হ্রাস করা যায় তবে ভাল হবে
পি ரதீப்

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

4

একটি ব্যবহারকারীর ব্যবহার:

ALTER TABLE #reset_runn_total ADD RunningTotal int;

DECLARE @id int, @val int, @reset int, @acm int, @grp int, @last_grp int;
SET @acm = 0;

DECLARE curRes CURSOR FAST_FORWARD FOR 
SELECT id, val, reset_val, grp
FROM #reset_runn_total
ORDER BY grp, id;

OPEN curRes;
FETCH NEXT FROM curRes INTO @id, @val, @reset, @grp;
SET @last_grp = @grp;

WHILE @@FETCH_STATUS = 0  
BEGIN
    IF @grp <> @last_grp SET @acm = 0;
    SET @last_grp = @grp;
    SET @acm = @acm + @val;
    UPDATE #reset_runn_total
    SET RunningTotal = @acm
    WHERE id = @id;
    IF @acm > @reset SET @acm = 0;
    FETCH NEXT FROM curRes INTO @id, @val, @reset, @grp;
END

CLOSE curRes;
DEALLOCATE curRes;

+----+-----+-----------+-------------+
| id | val | reset_val | RunningTotal|
+----+-----+-----------+-------------+
| 1  | 1   | 10        |     1       |
+----+-----+-----------+-------------+
| 2  | 8   | 12        |     9       |
+----+-----+-----------+-------------+
| 3  | 6   | 14        |     15      |
+----+-----+-----------+-------------+
| 4  | 5   | 10        |     5       |
+----+-----+-----------+-------------+
| 5  | 6   | 13        |     11      |
+----+-----+-----------+-------------+
| 6  | 3   | 11        |     14      |
+----+-----+-----------+-------------+
| 7  | 9   | 8         |     9       |
+----+-----+-----------+-------------+
| 8  | 10  | 12        |     10      |
+----+-----+-----------+-------------+

এখানে চেক করুন: http://rextester.com/WSPLO95303


3

উইন্ডোড নয়, তবে বিশুদ্ধ এসকিউএল সংস্করণ:

WITH x AS (
    SELECT TOP 1 id,
           val,
           reset_val,
           val AS running_total,
           1 AS level 
      FROM reset_runn_total
    UNION ALL
    SELECT r.id,
           r.val,
           r.reset_val,
           CASE WHEN x.running_total < x.reset_val THEN x.running_total + r.val ELSE r.val END,
           level = level + 1
      FROM x JOIN reset_runn_total AS r ON (r.id > x.id)
) SELECT
  *
FROM x
WHERE NOT EXISTS (
        SELECT 1
        FROM x AS x2
        WHERE x2.id = x.id
        AND x2.level > x.level
    )
ORDER BY id, level DESC
;

আমি এসকিউএল সার্ভারের উপভাষার বিশেষজ্ঞ নই। এটি পোস্টগ্র্রেএসকিউএল এর প্রাথমিক সংস্করণ (যদি আমি সঠিকভাবে বুঝতে পারি তবে আমি এসকিউএল সার্ভারে পুনরাবৃত্ত অংশে লিমিটেড 1 / টপ 1 ব্যবহার করতে পারি না):

WITH RECURSIVE x AS (
    (SELECT id, val, reset_val, val AS running_total
       FROM reset_runn_total
      ORDER BY id
      LIMIT 1)
    UNION
    (SELECT r.id, r.val, r.reset_val,
            CASE WHEN x.running_total < x.reset_val THEN x.running_total + r.val ELSE r.val END
       FROM x JOIN reset_runn_total AS r ON (r.id > x.id)
      ORDER BY id
      LIMIT 1)
) SELECT * FROM x;

@ জোঅববিশকে সত্য বলতে হবে, এটি প্রশ্ন থেকে সম্পূর্ণ পরিষ্কার নয়। উদাহরণস্বরূপ প্রত্যাশিত ফলাফলগুলি, কোনও grpকলাম দেখায় না ।
ypercubeᵀᴹ

@ জো ওববিশ এটি আমি বুঝতে পেরেছি। তবুও, প্রশ্নটি সে সম্পর্কে একটি স্পষ্ট বিবৃতি থেকে উপকৃত হতে পারে। প্রশ্নের কোড (সিটিই সহ) এটি ব্যবহার করে না (এবং এটিরও আলাদা আলাদা নামযুক্ত কলাম রয়েছে)। এই প্রশ্নটি যে কারও কাছে পড়ে এটি স্পষ্ট হবে - তাদের উত্তর এবং মন্তব্যগুলি পড়তে হবে - এবং করা উচিত নয় -
ypercubeᵀᴹ

@ ypercubeᵀᴹ প্রশ্নের প্রয়োজনীয় তথ্য যুক্ত করেছে।
পি ரதீப்

1

দেখে মনে হচ্ছে সমস্যাটি আক্রমণ করার জন্য আপনার কাছে বেশ কয়েকটি প্রশ্ন / পদ্ধতি রয়েছে তবে আপনি আমাদের সরবরাহ করেন নি - বা এমনকি বিবেচনাও করেছেন? - টেবিলের সূচি।

টেবিলে কী সূচি রয়েছে? এটি হিপ বা এটির একটি ক্লাস্টার্ড সূচক রয়েছে?

আমি এই সূচকটি যুক্ত করার পরে প্রস্তাবিত বিভিন্ন সমাধান চেষ্টা করব:

(grp, id) INCLUDE (val, reset_val)

অথবা কেবল ক্লাস্টারড সূচকটি পরিবর্তন (বা তৈরি করুন) (grp, id)

একটি সূচক যা নির্দিষ্ট ক্যোয়ারিকে লক্ষ্য করে তার দক্ষতা উন্নত করা উচিত - সর্বাধিক যদি না সমস্ত পদ্ধতি থাকে।


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