সংখ্যার টেবিলগুলি কেন "অমূল্য"?


112

আমাদের আবাসিক ডাটাবেস বিশেষজ্ঞ আমাদের বলছেন যে সংখ্যার সারণী অমূল্য । আমি কেন পুরোপুরি বুঝতে পারছি না। এখানে একটি সংখ্যা সারণী:

USE Model
GO

CREATE TABLE Numbers
(
    Number INT NOT NULL,
    CONSTRAINT PK_Numbers 
        PRIMARY KEY CLUSTERED (Number)
        WITH FILLFACTOR = 100
)

INSERT INTO Numbers
SELECT
    (a.Number * 256) + b.Number AS Number
FROM 
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) a (Number),
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) b (Number)
GO

ব্লগ পোস্ট প্রতি দেওয়া, যুক্তি দেওয়া হয়

নম্বর সারণী সত্যই অমূল্য। আমি স্ট্রিং ম্যানিপুলেশন, উইন্ডো ফাংশন সিমুলেশন, প্রচুর ডেটা দিয়ে টেস্ট টেবিলগুলি পপুলেশন করা, কার্সারের যুক্তি নির্মূল করা এবং এমন অনেকগুলি কাজ করে যা তাদের ব্যতীত অবিশ্বাস্যরকম কঠিন would

তবে আমি বুঝতে পারছি না যে এইগুলি ব্যবহারগুলি হ'ল - আপনি কি কিছু জোরপূর্বক, নির্দিষ্ট উদাহরণ প্রদান করতে পারেন যেখানে "সংখ্যার সারণী" আপনাকে এসকিউএল সার্ভারে একটি টন কাজ বাঁচায় - এবং কেন আমাদের সেগুলি রাখা উচিত?


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

4
@ নিক: আমি বলব যে অন-ফ্লাই সিটিই ভিত্তিক নম্বর টেবিল বনাম একটি ভৌত ​​টেবিল আপনি কীভাবে নম্বর সারণি তৈরি করেন তার একটি বাস্তবায়ন বিশদ । আলু বনাম আলু ...
রিমাস রুসানু

1
@ রেমাস - হ্যাঁ আমি কেবল জেফের এই বিকল্পটি চিহ্নিত করতে চেয়েছিলাম।
নিক চাম্মাস

2
আমার কাছে এসও স্ট্যাকওভারফ্লো . com/search ? q=user%3A27535+%2B%22numbers+ table%22 এ সংখ্যার সারণি ব্যবহার করে এক ডজন উত্তর রয়েছে ।
জিবিএন

উত্তর:


82

যখন আপনার 'ডেটা মিসিং' প্রকল্পের প্রয়োজন হয় তখন আমি অনেকগুলি ব্যবহার দেখেছি। যেমন। আপনার একটি টাইম সিরিজ রয়েছে (উদাহরণস্বরূপ অ্যাক্সেস লগ) এবং আপনি গত 30 দিনের জন্য প্রতিদিন হিটের সংখ্যাটি প্রদর্শন করতে চান (বিশ্লেষণ ড্যাশবোর্ড ভাবেন)। আপনি যদি এটি করেন তবে আপনি select count(...) from ... group by dayপ্রতিদিনের জন্য গণনাটি পাবেন তবে ফলাফলটিতে প্রতিদিন অন্তত একটি অ্যাক্সেস থাকলে কেবল তার জন্য একটি সারি থাকবে। অন্যদিকে, যদি আপনি প্রথমে আপনার নম্বর টেবিল ( select dateadd(day, -number, today) as day from numbers) থেকে দিনের একটি টেবিল প্রজেক্ট করেন এবং তারপরে আপনি গণনাগুলির সাথে যোগ দেন (বা বাইরের প্রয়োগ করুন, আপনি যা কিছু কল্পনা করেন) তবে আপনি একটি ফলাফল পাবেন যেটির জন্য আপনার গণনার জন্য 0 রয়েছে কোন প্রবেশাধিকার ছিল। এটি কেবল একটি উদাহরণ। অবশ্যই, কেউ তর্ক করতে পারে যে আপনার ড্যাশবোর্ডের উপস্থাপনা স্তরটি অনুপস্থিত দিনগুলি পরিচালনা করতে পারে এবং পরিবর্তে কেবল 0 দেখায়, তবে কিছু সরঞ্জাম (যেমন, এসএসআরএস) কেবল এটি পরিচালনা করতে সক্ষম হবে না।

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

BTW, আমি সত্য যে এমনকি একটি সংখ্যা টেবিল এটি ব্যবহার যদিও কল আউট প্রয়োজন বোধ মতানুযায়ী অনুজ্ঞাসূচক পদ্ধতিগত সঞ্চালনের মতো অভিমানী এটি ভ্রান্ত ধারণা পড়া না হয় অনুজ্ঞাসূচক। আমাকে একটি উদাহরণ দিতে দাও:

int x;
for (int i=0;i<1000000;++i)
  x = i;
printf("%d",x);

এই প্রোগ্রামটি 999999 আউটপুট দেবে, এটি বেশ গ্যারান্টিযুক্ত।

একটি সংখ্যা সারণী ব্যবহার করে এসকিউএল সার্ভারে একই চেষ্টা করা যাক। প্রথমে 1,000,000 সংখ্যার একটি সারণী তৈরি করুন:

create table numbers (number int not null primary key);
go

declare @i int = 0
    , @j int = 0;

set nocount on;
begin transaction
while @i < 1000
begin
    set @j = 0;
    while @j < 1000
    begin
        insert into numbers (number) 
            values (@j*1000+@i);
        set @j += 1;
    end
    commit;
    raiserror (N'Inserted %d*1000', 0, 0, @i)
    begin transaction;
    set @i += 1;
end
commit
go

এখন 'লুপের জন্য' করুন:

declare @x int;
select @x = number 
from numbers with(nolock);
select @x as [@x];

ফলাফল হলো:

@x
-----------
88698

আপনি এখন একজন ডব্লিউটিএফ মুহূর্ত থাকার তাহলে করছি (পরে number হয় ক্লাস্টার প্রাথমিক কী!), কৌতুক বলা হয় বরাদ্দ অর্ডার স্ক্যান এবং আমি সন্নিবেশ করা হয়নি @j*1000+@iদৃর্ঘটনায় ... এছাড়াও আপনি একটি অনুমান venture এবং বলে ফলাফলের কারণ ছিল পারে সমান্তরালতা এবং এটি কখনও কখনও সঠিক উত্তর হতে পারে।

এই ব্রিজের নীচে অনেকগুলি ট্রল রয়েছে এবং আমি কিছু অন ​​এসকিউএল সার্ভার বুলেয়ান অপারেটর শর্ট সার্কিট এবং টি-এসকিউএল ফাংশনগুলিতে মৃত্যুদন্ড কার্যকর করার কোনও নির্দিষ্ট আদেশ বোঝায় না


55

আমি বিভিন্ন পরিস্থিতিতে একটি সংখ্যা সারণী বেশ কার্যকর খুঁজে পেয়েছি।

আমি একটি অক্জিলিয়ারী সংখ্যার টেবিল ব্যবহার করা সম্ভব নয়? , 2004 সালে লিখিত, আমি কয়েকটি উদাহরণ দেখাই:

  • একটি স্ট্রিং পার্সিং করা হচ্ছে
  • পরিচয়ের ফাঁক ফেলা
  • জন্মের তারিখের ব্যাপ্তি (উদাহরণস্বরূপ একটি ক্যালেন্ডার টেবিল তৈরি করা, যা অমূল্যও হতে পারে)
  • সময় স্লাইস তৈরি করা
  • আইপি ব্যাপ্তি তৈরি হচ্ছে

খারাপ অভ্যাস লাথি: লুপ ব্যবহার বৃহৎ টেবিল পূরণ করতে , আমি কিভাবে সংখ্যার সারণী সারিগুলি অনেকটা ঢোকাতে (যেমন যখন একটি লুপ ব্যবহার করে ক্রোধান্বিত পদ্ধতির থেকে ভিন্ন) স্বল্প কাজ করতে ব্যবহার করা যেতে পারে প্রদর্শন করুন।

পূর্ণসংখ্যার একটি তালিকা প্রক্রিয়া করার সময় : আমার পদ্ধতির এবং বিভাজন তালিকার আরও: কাস্টম ডিলিমিটারগুলি, সদৃশগুলি প্রতিরোধ করা এবং শৃঙ্খলা বজায় রাখার জন্য , আমি স্ট্রিংকে বিভক্ত করতে সংখ্যার টেবিলটি কীভাবে ব্যবহার করতে হয় তা দেখায় (উদাহরণস্বরূপ কমা-বিভাজিত মানগুলির একটি সেট) এবং কার্য সম্পাদন সরবরাহ করি এই এবং অন্যান্য পদ্ধতির মধ্যে তুলনা। বিভাজন এবং অন্যান্য স্ট্রিং হ্যান্ডলিং সম্পর্কিত আরও তথ্য:

এবং এসকিউএল সার্ভার নাম্বার সারণিতে, ব্যাখ্যা - পর্ব 1 , আমি ধারণাটি সম্পর্কে কিছু ব্যাকগ্রাউন্ড দিচ্ছি এবং নির্দিষ্ট অ্যাপ্লিকেশনগুলির বিশদে ভবিষ্যতে পোস্টগুলি রেখেছি।

অন্যান্য অনেকগুলি ব্যবহার রয়েছে, সেগুলি কেবলমাত্র কয়েকটি যেগুলি তাদের সম্পর্কে লেখার জন্য আমার কাছে যথেষ্ট দাঁড়িয়েছে।

এবং @gbn এর মতো, স্ট্যাক ওভারফ্লোতে এবং এই সাইটে আমার কাছে কয়েকটি উত্তর রয়েছে যা সংখ্যার সারণীটিও ব্যবহার করে।

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


26

অ্যাডাম মাচানিকের কাছ থেকে আমি সম্প্রতি ব্যবহার করেছি এটির একটি দুর্দান্ত উদাহরণ :

CREATE FUNCTION dbo.GetSubstringCount
(
    @InputString TEXT, 
    @SubString VARCHAR(200),
    @NoisePattern VARCHAR(20)
)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    RETURN 
    (
        SELECT COUNT(*)
        FROM dbo.Numbers N
        WHERE
            SUBSTRING(@InputString, N.Number, LEN(@SubString)) = @SubString
            AND PATINDEX(@NoisePattern, SUBSTRING(@InputString, N.Number + LEN(@SubString), 1)) = 0
            AND 0 = 
                CASE 
                    WHEN @NoisePattern = '' THEN 0
                    ELSE PATINDEX(@NoisePattern, SUBSTRING(@InputString, N.Number - 1, 1))
                END
    )
END

CTEপারস্পরিক সম্পর্কযুক্ত সীমিত তথ্যের সাথে কাজ করার জন্য আমি সাবস্ট্রিংয়ের একটি নির্দিষ্ট উদাহরণ (অর্থাত "এই স্ট্রিংয়ের 3 য় পাইপটি সন্ধান করুন") সন্ধান করার জন্য এ জাতীয় কিছু অনুরূপ ব্যবহার করেছি :

declare @TargetStr varchar(8000), 
@SearchedStr varchar(8000), 
@Occurrence int
set @TargetStr='a'
set @SearchedStr='abbabba'
set @Occurrence=3;

WITH Occurrences AS (
SELECT Number,
       ROW_NUMBER() OVER(ORDER BY Number) AS Occurrence
FROM master.dbo.spt_values
WHERE Number BETWEEN 1 AND LEN(@SearchedStr) AND type='P'
  AND SUBSTRING(@SearchedStr,Number,LEN(@TargetStr))=@TargetStr)
SELECT Number
FROM Occurrences
WHERE Occurrence=@Occurrence

আপনার যদি একটি নম্বর সারণী না থাকে তবে বিকল্পটি হ'ল কোনও ধরণের লুপ ব্যবহার করা। মূলত, একটি সংখ্যা সারণী আপনাকে কার্সার বা লুপ ছাড়াই সেট-ভিত্তিক পুনরাবৃত্তি করতে দেয় allows


5
এবং ইনলাইন টিভিএফগুলিতে স্ট্রিং ম্যানিপুলেশন করার চূড়ান্ত বিপদ সম্পর্কে বাধ্যতামূলক সতর্কতা: টি-এসকিউএল ফাংশনগুলি মৃত্যুদন্ডের একটি নির্দিষ্ট আদেশ বোঝায় না
রেমাস রুসানু

12

যখনই আমার এনকিউরেবল.রেঞ্জের এসকিউএল সমতুল্য প্রয়োজন তখন আমি একটি সংখ্যা টেবিল ব্যবহার করব। উদাহরণস্বরূপ, আমি কেবলমাত্র এই সাইটে একটি উত্তরে এটি ব্যবহার করেছি: ক্রমের পরিমাণ গণনা করা

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