ক্যোয়ারীটি খুব ধীরে ধীরে কার্যকর হচ্ছে, এটিকে আরও উন্নত করার কোনও উপায় আছে কি?


9

আমার কাছে নিম্নলিখিত কোয়েরি রয়েছে এবং প্রচুর SUMফাংশন কল করার কারণে আমার ক্যোয়ারীটি খুব ধীর গতিতে চলছে। আমার ডাটাবেসে আমার প্রচুর রেকর্ড রয়েছে এবং আমি প্রতি বছরের জন্য চলতি বছর এবং গত বছর (শেষ 30 দিন, শেষ 90 দিন এবং শেষ 365 দিন) থেকে একটি প্রতিবেদন পেতে চাই:

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 30 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 30 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 90 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 90 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 365 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 365 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 30 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 30 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 90 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 90 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 365 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 365 Days Col2]


    FROM 
    tb1 a
INNER JOIN 
    tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN 
    tb3 c on b.fid = c.col5
INNER JOIN       
    tb4 d on c.id = d.col6
INNER JOIN 
    tb5 e on c.col7 = e.id
GROUP BY
    b.id, d.Title, e.Class

কারও কি ধারণা আছে যে আমি কীভাবে আরও দ্রুত চালাতে পারি?

সম্পাদনা: আমাকে বিবৃতিতে DATEADDফাংশন কলটি সরিয়ে নিয়ে যাওয়ার জন্য উত্সাহিত করা হয়েছিল whereএবং প্রথমে দু'বছর আগে লোড করুন তারপরে সেগুলি কলামগুলিতে ফিল্টার করুন তবে আমি নিশ্চিত নই যে প্রস্তাবিত উত্তরটি কার্যকর করা হয়েছে এবং এটি কাজ করে, এটি এখানে পাওয়া যাবে: https: // stackoverflow। কম / A / 59944426/12536284

যদি আপনি উপরের সমাধানটির সাথে একমত হন তবে দয়া করে আমাকে দেখান আমি কীভাবে এটি আমার বর্তমান ক্যোয়ারিতে প্রয়োগ করতে পারি?

শুধু এফওয়াইআই, আমি এই এসপি সি # তে ব্যবহার করছি, সত্তা ফ্রেমওয়ার্ক (ডিবি-ফার্স্ট), এরকম কিছু:

var result = MyDBEntities.CalculatorSP();

4
আপনার কার্যকর করার পরিকল্পনাটি আমাদের দেখান ...
ডেল কে

1
যে কোনও কিছুর জন্য - কোয়েরিটি ধীর করে দিতে পারে
ফ্যাবিও


2
আবার, দয়া করে কার্যকর করার পরিকল্পনা পোস্ট করুন।
এসকিউএল পুলিশ

2
এখনও আমরা দেখতে পাচ্ছি না Execution Plan। দয়া করে এটি পোস্ট করুন
অরুণ পলানিসামী

উত্তর:


10

এটি ইতিমধ্যে উল্লেখ করা হয়েছে যে, কার্যকর করা পরিকল্পনা এই ক্ষেত্রে সত্যিই সহায়ক হবে। আপনি যা দেখিয়েছেন তার উপর ভিত্তি করে দেখে মনে হচ্ছে আপনি এ থেকে মোট 15 টি কলামের 12 টি কলাম বের করেছেন tb1 (a), সুতরাং আপনি আপনার কোয়েরিটি কোনও যোগদান ছাড়াই চালানোর চেষ্টা করতে পারেন এবং tb1আপনার কোয়েরিটি প্রত্যাশার মতো কাজ করছে কিনা তা দেখার জন্য। যেহেতু আমি আপনার এসইউএম ফাংশন কলগুলির সাথে কোনও ভুল দেখতে পাচ্ছি না, আমার সেরা অনুমানটি হল আপনার যোগদানের সাথে কোনও সমস্যা আছে, তাই আমি নিম্নলিখিতটি করার পরামর্শ দেব। উদাহরণস্বরূপ আপনি সর্বশেষ যোগদানটি বাদ দিয়ে শুরু করতে পারেন, INNER JOIN tb5 e on c.col7 = e.id মত এটি এ সম্পর্কিত কোন ব্যবহার e.Class as [Class]এবংe.Classবিবৃতি দ্বারা আপনার গ্রুপে। আমরা এটিকে পুরোপুরি বাদ দিতে যাচ্ছি না, সমস্যাটি রয়েছে কিনা তা নিশ্চিত করার জন্য এটি কেবল একটি পরীক্ষা, যদি আপনার ক্যোয়ারী আরও ভাল চলে এবং প্রত্যাশার মতো আপনি শেষ যোগদানের পরিবর্তে কোনও টেম্প টেবিলটি ওয়ার্কআউন্ড হিসাবে ব্যবহার করার চেষ্টা করতে পারেন , এটার মতো কিছু:

SELECT *
INTO #Temp
FROM
  (
     select * from tb5
  ) As tempTable;

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]

    -- SUM Functions

FROM 
    tb1 a
INNER JOIN 
    tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN 
    tb3 c on b.fid = c.col5
INNER JOIN       
    tb4 d on c.id = d.col6
INNER JOIN 
    #Temp e on c.col7 = e.id
GROUP BY
    b.id, d.Title, e.Class

আসলে, অস্থায়ী টেবিলগুলি এমন টেবিল যা এসকিউএল সার্ভারে অস্থায়ীভাবে বিদ্যমান। অস্থায়ী সারণীগুলি একাধিকবার অ্যাক্সেস হওয়া তাত্ক্ষণিক ফলাফল সেটগুলি সংরক্ষণ করার জন্য দরকারী। আপনি এখানে এ সম্পর্কে আরও পড়তে পারেন https://www.sqlservertutorial.net/sql-server-basics/sql-server-temporary-tables/ এবং এখানে https://codingsight.com/intr پيداوار- to-temporary- tables-in -SQL সার্ভার/

এছাড়াও আমি দৃঢ়ভাবে সুপারিশ করবে, যদি আপনি সঞ্চিত পদ্ধতি ব্যবহার করছেন, সেট NOCOUNTকরতে ON, এটি একটি উল্লেখযোগ্য কর্মক্ষমতা বুস্ট প্রদান করতে পারেন কারণ নেটওয়ার্ক ট্রাফিক ব্যাপকভাবে কমে যাবে:

SET NOCOUNT ON
SELECT *
INTO #Temp
-- The rest of code

উপর ভিত্তি করে এই :

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


1
কেন আপনি সমগ্র অনুলিপি ব্যাখ্যা দয়া করে করতে পারেন tb5থেকে #Tempটেবিল এবং দ্রুত যোগদান চেয়ে টেম্প টেবিল কাজ যোগদান tb5সরাসরি? অচলভাবে তারা একই ডেটা ধারণ করে (এবং #Tempএটি বিদ্যমান থাকলে কোনও সূচক অনুপস্থিত হতে পারে tb5)। আমি কেন বুঝতে পারছি না কেন এটি আরও দক্ষ (সবার জন্য আমি জানি সমস্ত ডেটা অনুলিপি করতে এবং যোগদানের জন্য এটি কম দক্ষ হওয়া উচিত )।
জিগ

2
@ জিগ আপনি এই ক্ষেত্রে ঠিকই আছেন, তবে tb5অন্য সার্ভারে অবস্থিত থাকলে কী হবে ? এই ক্ষেত্রে একটি টেম্প টেবিল ব্যবহার করা অন্য সার্ভারে সরাসরি যোগদানের চেয়ে অবশ্যই দ্রুত। এটি কেবল পরীক্ষা করার জন্য এবং যা কিছু পরিবর্তন হয়েছিল কিনা তা আগে দেখার মতো আমারও একই পরিস্থিতি ছিল এবং এটি ভাগ্যক্রমে মনে হয় যে টেম্প টেবিলটিও এই ক্ষেত্রে ওপিকে সহায়তা করেছিল helped
সালাহ আকবরী

2

সারণী ভেরিয়েবল / হ্যাশ টেবিলের মধ্যে সন্নিবেশ করাই সেরা পদ্ধতির (সারি সংখ্যাটি যদি ছোট হয় তবে একটি সারণী ভেরিয়েবল ব্যবহার করুন বা সারি সংখ্যাটি যদি বেশ বড় হয় তবে হ্যাশ টেবিল ব্যবহার করুন)। তারপরে সমষ্টিটি আপডেট করুন এবং তারপরে শেষ পর্যন্ত সারণি ভেরিয়েবল বা হ্যাশ টেবিল থেকে নির্বাচন করুন। ক্যোয়ারী পরিকল্পনাটি সন্ধান করা প্রয়োজন।

DECLARE @MYTABLE TABLE (ID INT, [Title] VARCHAR(500), [Class] VARCHAR(500),
[Current - Last 30 Days Col1] INT, [Current - Last 30 Days Col2] INT,
[Current - Last 90 Days Col1] INT,[Current - Last 90 Days Col2] INT,
[Current - Last 365 Days Col1] INT, [Current - Last 365 Days Col2] INT,
[Last year - Last 30 Days Col1] INT, [Last year - Last 30 Days Col2] INT,
[Last year - Last 90 Days Col1] INT, [Last year - Last 90 Days Col2] INT,
[Last year - Last 365 Days Col1] INT, [Last year - Last 365 Days Col2] INT)



INSERT INTO @MYTABLE(ID, [Title],[Class], 
[Current - Last 30 Days Col1], [Current - Last 30 Days Col2],
[Current - Last 90 Days Col1], [Current - Last 90 Days Col2],
[Current - Last 365 Days Col1], [Current - Last 365 Days Col2],
[Last year - Last 30 Days Col1], [Last year - Last 30 Days Col2],
[Last year - Last 90 Days Col1], [Last year - Last 90 Days Col2],
[Last year - Last 365 Days Col1], [Last year - Last 365 Days Col2]
  )
SELECT    b.id  ,d.[Title] ,e.Class ,0,0,0,0,0,0,0,0,0,0,0,0        
FROM     tb1 a
INNER JOIN   tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN   tb3 c on b.fid = c.col5
INNER JOIN   tb4 d on c.id = d.col6
INNER JOIN  tb5 e on c.col7 = e.id
GROUP BY b.id, d.Title, e.Class

UPDATE T 
SET [Current - Last 30 Days Col1]=K.[Current - Last 30 Days Col1] , 
[Current - Last 30 Days Col2]    =K.[Current - Last 30 Days Col2],
[Current - Last 90 Days Col1]    = K.[Current - Last 90 Days Col1], 
[Current - Last 90 Days Col2]    =K.[Current - Last 90 Days Col2] ,
[Current - Last 365 Days Col1]   =K.[Current - Last 365 Days Col1], 
[Current - Last 365 Days Col2]   =K.[Current - Last 365 Days Col2],
[Last year - Last 30 Days Col1]  =K.[Last year - Last 30 Days Col1],
 [Last year - Last 30 Days Col2] =K.[Last year - Last 30 Days Col2],
[Last year - Last 90 Days Col1]  =K.[Last year - Last 90 Days Col1], 
[Last year - Last 90 Days Col2]  =K.[Last year - Last 90 Days Col2],
[Last year - Last 365 Days Col1] =K.[Last year - Last 365 Days Col1],
 [Last year - Last 365 Days Col2]=K.[Last year - Last 365 Days Col2]
    FROM @MYTABLE T JOIN 
     (
SELECT 
    b.id as [ID]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Current - Last 30 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Current - Last 30 Days Col2]

    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Current - Last 90 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Current - Last 90 Days Col2]

    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Current - Last 365 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Current - Last 365 Days Col2]

    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Last year - Last 30 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Last year - Last 30 Days Col2]

    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Last year - Last 90 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Last year - Last 90 Days Col2]

    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END),0) as [Last year - Last 365 Days Col1]
    ,ISNULL(Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END),0) as [Last year - Last 365 Days Col2]
    FROM     tb1 a
INNER JOIN   tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN   tb3 c on b.fid = c.col5
INNER JOIN   tb4 d on c.id = d.col6
INNER JOIN  tb5 e on c.col7 = e.id
GROUP BY    b.id
) AS K ON T.ID=K.ID


SELECT *
FROM @MYTABLE

0

আমি ধরে নিচ্ছি টিবি 1 একটি বড় টেবিল (টিবি 2, টিবি 3, টিবি 4 এবং টিবি 5 এর সাথে সম্পর্কিত)।

যদি তা হয় তবে table টেবিলটি (একটি বিধিবিধানের সাথে) নির্বাচন সীমাবদ্ধ করার জন্য এটি এখানে বোধগম্য।

যদি টিবি 1 এর একটি ছোট্ট অংশ ব্যবহার করা হয়, উদাহরণস্বরূপ, কারণ টিবি 2, টিবি 3, টিবি 4 এবং টিবি 5 এর সাথে যোগ দেয় প্রয়োজনীয় সারিগুলি কেবল কয়েক শতাংশে হ্রাস করে, তবে আপনার পরীক্ষা করা উচিত যে সারণিতে আপনি যোগদানকারী কলামগুলিতে সূচিযুক্ত কিনা? ।

যদি টিবি 1 এর একটি বড় অংশ ব্যবহার করা হয়, তবে এটি টিবি 2, টিবি 3, টিবি 4 এবং টিবি 5 এ যোগ দেওয়ার আগে এর ফলাফলগুলি গোষ্ঠী করাতে বুদ্ধিমান হতে পারে। নীচে তার একটি উদাহরণ দেওয়া আছে।

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]
    ,SUM(a.[Current - Last 30 Days Col1]) AS [Current - Last 30 Days Col1]
    ,SUM(a.[Current - Last 30 Days Col2]) AS [Current - Last 30 Days Col2]
    ,SUM(a.[Current - Last 90 Days Col1]) AS [Current - Last 90 Days Col1]
    -- etc.
    FROM (
      SELECT a.id, a.col3

      ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 30 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 30 Days Col2]

      ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 90 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 90 Days Col2]

      ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 365 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 365 Days Col2]

      ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 30 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 30 Days Col2]

      ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 90 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 90 Days Col2]

      ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 365 Days Col1]
      ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 365 Days Col2]

      FROM  tb1 a
      WHERE a.DateCol >= DATEADD(YEAR,-2,GETDATE())
      GROUP BY a.id, a.col3
    ) AS a
INNER JOIN 
    tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN 
    tb3 c on b.fid = c.col5
INNER JOIN       
    tb4 d on c.id = d.col6
INNER JOIN 
    tb5 e on c.col7 = e.id
GROUP BY
    b.id, d.Title, e.Class

প্রথমে কার্যকরকরণ পরিকল্পনাটি দেখা এবং তারপরে সূচী তৈরি এবং পরিসংখ্যান পুনরুদ্ধার করার বিষয়ে সিদ্ধান্ত নেওয়া আরও ভাল far
এসকিউএল পুলিশ

আমি সত্যিই এটি ঘৃণা করি যে কেন কোনও কারণ ছাড়াই আমার পোস্টটি নেতিবাচক স্কোর পায়। অবশ্যই আমি একমত যে পারফরম্যান্স ইস্যুটি কেন্দ্রীভূত করার জন্য, আমাদের কার্যকর করার পরিকল্পনাটি পরীক্ষা করতে হবে। এটি বলার পরে, আমি কোয়েরিতে প্রাসঙ্গিক যে কোনও বিদেশী কীগুলির জন্য সূচকগুলি পরীক্ষা করার বিষয়ে আমার সুপারিশের পাশে আছি।
গার্ট-

1
আপনি কিছু না জেনে কিছু "অনুমান" করুন। সুতরাং আপনি অজানা ভিত্তিতে একটি উত্তর পোস্ট করুন। সুতরাং ডাউনভোট। মৃত্যুদণ্ড কার্যকর করার পরিকল্পনা পোস্ট করে ওপিকে তার প্রশ্নের উন্নতি করতে নির্দেশ দেওয়া আরও ভাল।
এসকিউএল পুলিশ

এটাই আমি লিখেছি না। ব্যক্তিগতভাবে, আমি কেবল উত্তরটি খারাপ বা ভুল হলেই কেবল নীচে নামব, যখন আমি কেবল একমত নই। তবে সাড়া দেওয়ার জন্য ধন্যবাদ।
গার্ট-

একটি উপায়ে এটি ভুল, কারণ আপনি কীভাবে এটি সঠিক প্রমাণ করতে পারেন?
এসকিউএল পুলিশ


0

এই জাতীয় গণনা অপ্টিমাইজ করার জন্য আপনি কিছু মানকে প্রাক-গণনা বিবেচনা করেন। প্রাক-গণনাগুলির ধারণা হ'ল সারিগুলির সংখ্যা হ্রাস করা যা আপনাকে পড়তে বা এগিয়ে যেতে হবে।

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

সুতরাং, নীচের উদাহরণে আমি একটি টেবিল তৈরি করছি RowIDএবং RowDatetimeকলামগুলি দিয়ে এবং 1 মিলিয়ন সারি tingোকাচ্ছি। আমি প্রতিদিন সত্তাগুলি গণনা করার জন্য একটি সূচী দৃষ্টিভঙ্গি ব্যবহার করছি, সুতরাং প্রতি বছর 1 মিলিয়ন সারি জিজ্ঞাসা করার পরিবর্তে আমি এই মেট্রিকগুলি গণনা করতে প্রতি বছর ৩5৫ টি সারি জিজ্ঞাসা করব।

DROP TABLE IF EXISTS [dbo].[DataSource];
GO

CREATE TABLE [dbo].[DataSource]
(
    [RowID] BIGINT IDENTITY(1,1) PRIMARY KEY
   ,[RowDateTime] DATETIME2
);

GO

DROP VIEW IF EXISTS [dbo].[vw_DataSource];
GO

CREATE VIEW [dbo].[vw_DataSource] WITH SCHEMABINDING
AS
SELECT YEAR([RowDateTime]) AS [Year]
      ,MONTH([RowDateTime]) AS [Month]
      ,DAY([RowDateTime]) AS [Day]
      ,COUNT_BIG(*) AS [Count]
FROM [dbo].[DataSource]
GROUP BY YEAR([RowDateTime])
        ,MONTH([RowDateTime])
        ,DAY([RowDateTime]);
GO

CREATE UNIQUE CLUSTERED INDEX [IX_vw_DataSource] ON [dbo].[vw_DataSource]
(
    [Year] ASC,
    [Month] ASC,
    [Day] ASC
);

GO

DECLARE @min bigint, @max bigint
SELECT @Min=1 ,@Max=1000000

INSERT INTO [dbo].[DataSource] ([RowDateTime])
SELECT TOP (@Max-@Min+1) DATEFROMPARTS(2019,  1.0 + floor(12 * RAND(convert(varbinary, newid()))), 1.0 + floor(28 * RAND(convert(varbinary, newid())))          )       
FROM master..spt_values t1 
CROSS JOIN master..spt_values t2

GO


SELECT *
FROM [dbo].[vw_DataSource]


SELECT SUM(CASE WHEN DATEFROMPARTS([Year], [Month], [Day]) >= DATEADD(MONTH,-1,GETDATE()) THEN [Count] ELSE 0 END) as [Current - Last 30 Days Col1]
      ,SUM(CASE WHEN DATEFROMPARTS([Year], [Month], [Day]) >= DATEADD(QUARTER,-1,GETDATE()) THEN [Count] ELSE 0 END) as [Current - Last 90 Days Col1]
      ,SUM(CASE WHEN DATEFROMPARTS([Year], [Month], [Day]) >= DATEADD(YEAR,-1,GETDATE()) THEN [Count] ELSE 0 END) as [Current - Last 365 Days Col1]
FROM [dbo].[vw_DataSource];

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

এছাড়াও, উপরোক্ত তথ্য উপাত্তকরণ এবং এটি পড়ার কেবল উদাহরণ। আপনার ক্ষেত্রে আপনাকে আরও কলামের ভিউ সংজ্ঞা যুক্ত করতে হতে পারে।


0

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

তারিখের সারণিতে নিম্নলিখিত কলামগুলি রয়েছে:

ডেটসইড, তারিখ, বছর, কোয়ার্টার, ইয়ারকুইয়ার্টার, মাসনুম, মাসনেমশোর্ট, ইয়ারওয়েইক, উইকনম, ডেওফায়ার, ডেওফামন্থ, ডেএনমঅফ উইক, ডে-নেম

উদাহরণ তথ্য: 20310409 2031-04-09 2031 2 2031-Q2 4 এপ্রিল এপ্রিল 2031_15 15 99 9 3 বুধবার

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

আমি পাশাপাশি একটি পরিচয় কলাম যুক্ত করি যাতে আপনি প্রতিটি তারিখের জন্য একটি পূর্ণসংখ্যা পেতে পারেন। এটি সাথে কাজ করা কিছুটা সহজ করে তোলে তবে প্রয়োজনীয়তা নয়।

SELECT * FROM dbo.dates where dateIndex BETWEEN (getDateIndexDate(getDate())-30 AND getDateIndexDate(getDate())+0) --30 days ago

এটি আমাকে সহজে একটি নির্দিষ্ট সময়ে ফিরে যেতে অনুমতি দেয়। এটি আপনার নিজের মতামত তৈরি করা বেশ সহজ। আপনি অবশ্যই বছর, সপ্তাহ ইত্যাদির জন্য এটি করতে ROW_NUMBER () ফাংশনটি ব্যবহার করতে পারেন।

আমার ডেটেরঞ্জ একবারে চাইলে আমি ডেটাতে যোগ দেই। খুব দ্রুত কাজ করে!


0

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

SELECT f.id, f.[Title], f.Class,
    SUM(CASE WHEN f.MonthDiff = 1 THEN col1 ELSE 0 END) as [Current - Last 30 Days Col1],
    -- etc
FROM (
    SELECT 
        b.id,
        d.[Title],
        e.Class,
        DateDiff(Month, a.DateCol, GETDATE()) as MonthDiff,
        Sum(a.col1) as col1,
        Sum(a.col2) as col2
    FROM  tb1 a
    INNER JOIN tb2 b on a.id = b.fid and a.col3 = b.col4
    INNER JOIN tb3 c on b.fid = c.col5
    INNER JOIN tb4 d on c.id = d.col6
    INNER JOIN tb5 e on c.col7 = e.id
    WHERE a.DateCol between DATEADD(YEAR,-2,GETDATE() and GETDATE()
    GROUP BY b.id, d.Title, e.Class, DateDiff(Month,  a.DateCol, GETDATE())
) f
group by f.id, f.[Title], f.Class

-2

এসকিউএল কোয়েরির গতি উন্নত করতে আপনাকে অবশ্যই সূচিপত্র যুক্ত করতে হবে। প্রতিটি যোগদানের টেবিলের জন্য, আপনাকে একটি সূচক যুক্ত করতে হবে।

ওরাকলের জন্য এই কোড উদাহরণটি পছন্দ করুন:

CREATE INDEX supplier_idx
ON supplier (supplier_name);

এটি কোনও খারাপ পরামর্শ নয়। আপনি ওপি থেকে দেখতে পাচ্ছেন যে কোনও টেম্প টেবিলটি কোনও সূচি ছাড়াই তৈরি করা হয়েছে - cNol7 = e.id এ INNER JOIN #Temp e উত্তরে উন্নতির সুযোগ থাকাকালীন, আমি মনে করি না যে এটি হস্তান্তরিত হওয়া উচিত se বিশেষত একটি নতুন ব্যবহারকারীর জন্য।
স্মুথ 4

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