একটি কোয়েরিতে পারফরম্যান্স টিউনিং


9

এই ক্যোয়ারী কর্মক্ষমতা উন্নত করতে সহায়তা চাইছেন।

এসকিউএল সার্ভার ২০০৮ আর 2 এন্টারপ্রাইজ , সর্বোচ্চ র‌্যাম 16 জিবি, সিপিইউ 40, সমান্তরালতার সর্বোচ্চ ডিগ্রি 4।

SELECT DsJobStat.JobName AS JobName
    , AJF.ApplGroup AS GroupName
    , DsJobStat.JobStatus AS JobStatus
    , AVG(CAST(DsJobStat.ElapsedSec AS FLOAT)) AS ElapsedSecAVG
    , AVG(CAST(DsJobStat.CpuMSec AS FLOAT)) AS CpuMSecAVG 
FROM DsJobStat, AJF 
WHERE DsJobStat.NumericOrderNo=AJF.OrderNo 
AND DsJobStat.Odate=AJF.Odate 
AND DsJobStat.JobName NOT IN( SELECT [DsAvg].JobName FROM [DsAvg] )         
GROUP BY DsJobStat.JobName
, AJF.ApplGroup
, DsJobStat.JobStatus
HAVING AVG(CAST(DsJobStat.ElapsedSec AS FLOAT)) <> 0;

এক্সিকিউশন বার্তা,

(0 row(s) affected)
Table 'AJF'. Scan count 11, logical reads 45, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DsAvg'. Scan count 2, logical reads 1926, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DsJobStat'. Scan count 1, logical reads 3831235, physical reads 85, read-ahead reads 3724396, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
      CPU time = 67268 ms,  elapsed time = 90206 ms.

টেবিলের কাঠামো:

-- 212271023 rows
CREATE TABLE [dbo].[DsJobStat](
    [OrderID] [nvarchar](8) NOT NULL,
    [JobNo] [int] NOT NULL,
    [Odate] [datetime] NOT NULL,
    [TaskType] [nvarchar](255) NULL,
    [JobName] [nvarchar](255) NOT NULL,
    [StartTime] [datetime] NULL,
    [EndTime] [datetime] NULL,
    [NodeID] [nvarchar](255) NULL,
    [GroupName] [nvarchar](255) NULL,
    [CompStat] [int] NULL,
    [RerunCounter] [int] NOT NULL,
    [JobStatus] [nvarchar](255) NULL,
    [CpuMSec] [int] NULL,
    [ElapsedSec] [int] NULL,
    [StatusReason] [nvarchar](255) NULL,
    [NumericOrderNo] [int] NULL,
CONSTRAINT [PK_DsJobStat] PRIMARY KEY CLUSTERED 
(   [OrderID] ASC,
    [JobNo] ASC,
    [Odate] ASC,
    [JobName] ASC,
    [RerunCounter] ASC
));

-- 48992126 rows
CREATE TABLE [dbo].[AJF](  
    [JobName] [nvarchar](255) NOT NULL,
    [JobNo] [int] NOT NULL,
    [OrderNo] [int] NOT NULL,
    [Odate] [datetime] NOT NULL,
    [SchedTab] [nvarchar](255) NULL,
    [Application] [nvarchar](255) NULL,
    [ApplGroup] [nvarchar](255) NULL,
    [GroupName] [nvarchar](255) NULL,
    [NodeID] [nvarchar](255) NULL,
    [Memlib] [nvarchar](255) NULL,
    [Memname] [nvarchar](255) NULL,
    [CreationTime] [datetime] NULL,
CONSTRAINT [AJF$PrimaryKey] PRIMARY KEY CLUSTERED 
(   [JobName] ASC,
    [JobNo] ASC,
    [OrderNo] ASC,
    [Odate] ASC
));

-- 413176 rows
CREATE TABLE [dbo].[DsAvg](
    [JobName] [nvarchar](255) NULL,
    [GroupName] [nvarchar](255) NULL,
    [JobStatus] [nvarchar](255) NULL,
    [ElapsedSecAVG] [float] NULL,
    [CpuMSecAVG] [float] NULL
);

CREATE NONCLUSTERED INDEX [DJS_Dashboard_2] ON [dbo].[DsJobStat] 
(   [JobName] ASC,
    [Odate] ASC,
    [StartTime] ASC,
    [EndTime] ASC
)
INCLUDE ( [OrderID],
[JobNo],
[NodeID],
[GroupName],
[JobStatus],
[CpuMSec],
[ElapsedSec],
[NumericOrderNo]) ;

CREATE NONCLUSTERED INDEX [Idx_Dashboard_AJF] ON [dbo].[AJF] 
(   [OrderNo] ASC,
[Odate] ASC
)
INCLUDE ( [SchedTab],
[Application],
[ApplGroup]) ;

CREATE NONCLUSTERED INDEX [DsAvg$JobName] ON [dbo].[DsAvg] 
(   [JobName] ASC
)

হত্যা পরিকল্পনা:

https://www.brentozar.com/pastetheplan/?id=rkUVhMlXM


উত্তর পাওয়ার পরে আপডেট করুন

আপনাকে অনেক ধন্যবাদ @ জো ওবিশ

আপনি এই কোয়েরির ইস্যুটি সম্পর্কে ঠিক বলেছেন যা ডিএসজবস্ট্যাট এবং ডিএসএভিজি-র মধ্যে রয়েছে। এটি কীভাবে যোগদান করবেন এবং না IN ব্যবহার করবেন না সে সম্পর্কে এটি বেশি নয়।

আপনি অনুমান হিসাবে সত্যিই একটি টেবিল আছে।

CREATE TABLE [dbo].[DSJobNames](
    [JobName] [nvarchar](255) NOT NULL,
 CONSTRAINT [DSJobNames$PrimaryKey] PRIMARY KEY CLUSTERED 
(   [JobName] ASC
) ); 

আমি আপনার পরামর্শ চেষ্টা করেছিলাম,

SELECT DsJobStat.JobName AS JobName
, AJF.ApplGroup AS GroupName
, DsJobStat.JobStatus AS JobStatus
, AVG(CAST(DsJobStat.ElapsedSec AS FLOAT)) AS ElapsedSecAVG
, Avg(CAST(DsJobStat.CpuMSec AS FLOAT)) AS CpuMSecAVG 
FROM DsJobStat
INNER JOIN DSJobNames jn
    ON jn.[JobName]= DsJobStat.[JobName]
INNER JOIN AJF 
    ON DsJobStat.Odate=AJF.Odate 
    AND DsJobStat.NumericOrderNo=AJF.OrderNo 
WHERE NOT EXISTS ( SELECT 1 FROM [DsAvg] WHERE jn.JobName =  [DsAvg].JobName )      
GROUP BY DsJobStat.JobName, AJF.ApplGroup, DsJobStat.JobStatus
HAVING AVG(CAST(DsJobStat.ElapsedSec AS FLOAT)) <> 0;   

সম্পাদন বার্তা:

(0 row(s) affected)
Table 'DSJobNames'. Scan count 5, logical reads 1244, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DsAvg'. Scan count 5, logical reads 2129, physical reads 0, read-ahead reads 24, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DsJobStat'. Scan count 8, logical reads 84, physical reads 0, read-ahead reads 83, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AJF'. Scan count 5, logical reads 757999, physical reads 944, read-ahead reads 757311, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 21776 ms,  elapsed time = 33984 ms.

সম্পাদন পরিকল্পনা: https://www.brentozar.com/pastetheplan/?id=rJVkLSZ7f


যদি এটির বিক্রেতার কোড যা আপনি পরিবর্তন করতে পারবেন না, তবে সবচেয়ে ভাল কাজটি হ'ল বিক্রেতার সাথে একটি সমর্থন ঘটনা খোলা, যতটা বেদনাদায়ক হতে পারে, এবং এমন একটি কোয়েরীর জন্য তাদের মারধর করা যাতে অনেকের পড়া শেষ হয়। 413 হাজার সারি সহ একটি টেবিলের মানগুলিকে বোঝায় এমন নং আইএনটি হ'ল, আহ, উপ-অনুকূল। ডিএসজবস্টেটে সূচক স্ক্যানটি 212 মিলিয়ন সারি ফিরিয়ে দিচ্ছে, যা 212 মিলিয়ন নেস্টেড লুপগুলি বুদবুদ করেছে এবং আপনি দেখতে পারেন 212 মিলিয়ন সারি সংখ্যা ব্যয়ের 83% is আমি মনে করি না যে আপনি পুনরায় লিখিত প্রশ্ন ছাড়াই বা ডেটা শুকিয়ে ছাড়াই এটিকে সহায়তা করতে পারবেন ...
টনি

আমি বুঝতে পারছি না, ইভানের পরামর্শটি আপনাকে প্রথমে কোনও উপকারে আসে নি, ব্যাখ্যা দুটি ব্যতীত উভয় উত্তরই সমান A তবুও আমি দেখতে পাচ্ছি না যে এই দুজনেই আপনাকে যে পরামর্শ দিয়েছিল তা আপনি সম্পূর্ণভাবে প্রয়োগ করেছেন .জ এই প্রশ্নটি আকর্ষণীয় করে তুলেছে।
কুমারহর্ষ

উত্তর:


11

এর যোগদানের আদেশ বিবেচনা করে শুরু করা যাক। আপনার ক্যোয়ারিতে তিনটি সারণী রেফারেন্স রয়েছে। কোন যোগদানের আদেশ আপনাকে সেরা পারফরম্যান্স দিতে পারে? ক্যোয়ারী অপটিমাইজার মনে করেন যে যোগদানের থেকে DsJobStatথেকে DsAvgসারির প্রায় সমস্ত (cardinality অনুমান 1 সারিতে 212195000 থেকে পড়া) নিষ্কাশন করা হবে। আসল পরিকল্পনা আমাদের দেখায় যে অনুমানটি বাস্তবের খুব কাছাকাছি (11 টি সারি এতে যোগ দেয়)। যাইহোক, যোগদানটি ডান বিরোধী আধা মেশিন যোগদান হিসাবে প্রয়োগ করা হয়, সুতরাং DsJobStatসারণী থেকে সমস্ত 212 মিলিয়ন সারি কেবল 11 সারি তৈরি করতে স্ক্যান করা হয়। এটি অবশ্যই দীর্ঘ ক্যোয়ারি এক্সিকিউশন সময়টিতে অবদান রাখতে পারে, তবে আমি যোগদানের জন্য আরও ভাল শারীরিক বা যৌক্তিক অপারেটরটির কথা ভাবতে পারি না যা আরও ভাল হত। আমি নিশ্চিত যেDJS_Dashboard_2অন্যান্য প্রশ্নের জন্য সূচক ব্যবহৃত হয়, তবে অতিরিক্ত কী এবং অন্তর্ভুক্ত সমস্ত কলামগুলির জন্য এই কোয়েরির জন্য আরও আইও প্রয়োজন হবে এবং আপনাকে ধীর করবে। সুতরাং আপনার টেবিলের ইনডেক্স স্ক্যানের সাথে টেবিল অ্যাক্সেসের সমস্যা DsJobStatরয়েছে।

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

অন্য সমস্যাটি যা পরিকল্পনা থেকে উদ্ভাসিত তা হ'ল সারি গণনা স্পুল অপারেটর। এটি খুব লাইটওয়েট অপারেটর তবে এটি 200 মিলিয়নেরও বেশি বার কার্যকর করছে। অপারেটরটি রয়েছে কারণ কোয়েরিটি লেখা হয়েছে NOT IN। যদি একটি একক নাল সারি থাকেDsAvg তবে সমস্ত সারি অবশ্যই নির্মূল করতে হবে। স্পুলটি সেই চেকটির বাস্তবায়ন। এটি সম্ভবত আপনি যে যুক্তি চান তা নয়, সুতরাং আপনি সেই অংশটি ব্যবহার করার জন্য আরও ভাল থাকবেন NOT EXISTS। এই পুনর্লিখনের আসল উপকারটি আপনার সিস্টেম এবং ডেটার উপর নির্ভর করবে।

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

CREATE TABLE [dbo].[DsAvg](
    [JobName] [nvarchar](255) NULL
);

CREATE CLUSTERED INDEX CI_DsAvg ON [DsAvg] (JobName);

INSERT INTO [DsAvg] WITH (TABLOCK)
SELECT TOP (200000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);

CREATE TABLE [dbo].[DsJobStat](
    [JobName] [nvarchar](255) NOT NULL,
    [JobStatus] [nvarchar](255) NULL,
);

CREATE CLUSTERED INDEX CI_JobStat ON DsJobStat (JobName)

INSERT INTO [DsJobStat] WITH (TABLOCK)
SELECT [JobName], 'ACTIVE'
FROM [DsAvg] ds
CROSS JOIN (
SELECT TOP (1000) 1
FROM master..spt_values t1
) c (t);

INSERT INTO [DsJobStat] WITH (TABLOCK)
SELECT TOP (1000) '200001', 'ACTIVE'
FROM master..spt_values t1;

ক্যোয়ারী পরিকল্পনার ভিত্তিতে আমরা দেখতে পাচ্ছি যে টেবিলটিতে প্রায় 200000 অনন্য JobNameমূল্য DsAvgরয়েছে। আমরা দেখতে পারেন প্রায় সব সারি প্রকৃত সংখ্যা পর যে টেবিলে যোগদানের উপর ভিত্তি করে JobNameমান DsJobStatরয়েছে DsAvgটেবিল। সুতরাং, DsJobStatটেবিলটির জন্য 200001 অনন্য মান রয়েছেJobName কলামের এবং প্রতি মান 1000 সারি রয়েছে।

আমি বিশ্বাস করি যে এই কোয়েরিটি পারফরম্যান্স সমস্যার প্রতিনিধিত্ব করে:

SELECT DsJobStat.JobName AS JobName, DsJobStat.JobStatus AS JobStatus
FROM DsJobStat
WHERE DsJobStat.JobName NOT IN( SELECT [DsAvg].JobName FROM [DsAvg] );

আপনার প্রশ্নের পরিকল্পনা অন্যান্য পণ্যদ্রব্য সমস্ত ( GROUP BY,HAVING প্রাচীন স্টাইলের যোগ দিন, ইত্যাদি) ফলাফল সেটটি 11 টি সারিতে পরিণত হওয়ার পরে ঘটে। এটি বর্তমানে ক্যোয়ারি পারফরম্যান্স দৃষ্টিকোণ থেকে কোনও বিষয় নয়, তবে সেখানে অন্যান্য উদ্বেগ থাকতে পারে যা আপনার টেবিলের পরিবর্তিত ডেটা দ্বারা প্রকাশিত হতে পারে।

আমি এসকিউএল সার্ভার 2017 এ পরীক্ষা করছি, তবে আমি আপনার মতো একই বেসিক পরিকল্পনার আকার পেয়েছি:

পরিকল্পনা আগে

আমার মেশিনে, এই ক্যোয়ারীটি সম্পাদন করতে 62219 এমপি সিপিইউ সময় এবং 65576 এমএস সময় কাটায়। আমি যদি ক্যোয়ারীটি পুনরায় লিখি NOT EXISTS:

SELECT DsJobStat.JobName AS JobName, DsJobStat.JobStatus AS JobStatus
FROM DsJobStat
WHERE NOT EXISTS (SELECT 1 FROM [DsAvg] WHERE DsJobStat.JobName = [DsAvg].JobName);

কোন স্পুল নেই

স্পুলটি আর 212 মিলিয়ন বার কার্যকর করা হয় না এবং এটি বিক্রেতার কাছ থেকে সম্ভবত উদ্দেশ্যপূর্ণ আচরণ করে। এখন ক্যোয়ারি সিপিইউ সময়ের 34516 এমএস এবং অতিবাহিত সময়ের 41132 এমএসে কার্যকর করে। বেশিরভাগ সময় সূচি থেকে 212 মিলিয়ন সারি স্ক্যান করতে ব্যয় হয়।

সেই সূচী স্ক্যানটি সেই প্রশ্নের জন্য অত্যন্ত দুর্ভাগ্যজনক। গড়ে আমাদের অনন্য মানের প্রতি 1000 টি সারি থাকে JobNameতবে আমরা আমাদের প্রথম সারিটি পড়ার পরে জানতে পারি যদি আমাদের পূর্ববর্তী 1000 টি সারি প্রয়োজন হয়। আমাদের প্রায় কখনই এই সারিগুলির প্রয়োজন নেই, তবে আমাদের এখনও সেগুলি স্ক্যান করা দরকার। যদি আমরা জানি যে সারণিগুলি সারণীতে খুব ঘন নয় এবং প্রায় সবগুলিই যোগ দিয়ে মুছে ফেলা হবে আমরা সূচকে সম্ভবত আরও কার্যকর আইও প্যাটার্নটি কল্পনা করতে পারি। এসকিউএল সার্ভার যদি অনন্য মানের প্রতি প্রথম সারিটি পড়ে JobName, যদি সেই মানটি থাকে কিনা তা পরীক্ষা করে থাকে DsAvgএবং JobNameযদি তা হয় তবে এটির পরবর্তী মানটিতে কেবল অগ্রাহ্য হয় ? 212 মিলিয়ন সারি স্ক্যান করার পরিবর্তে প্রায় 200 কে মৃত্যুদণ্ড কার্যকর করার জন্য একটি সিক প্ল্যান করা যেতে পারে।

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

WITH RecursiveCTE
AS
(
    -- Anchor
    SELECT TOP (1)
        [JobName]
    FROM dbo.DsJobStat AS T
    ORDER BY
        T.[JobName]

    UNION ALL

    -- Recursive
    SELECT R.[JobName]
    FROM
    (
        -- Number the rows
        SELECT 
            T.[JobName],
            rn = ROW_NUMBER() OVER (
                ORDER BY T.[JobName])
        FROM dbo.DsJobStat AS T
        JOIN RecursiveCTE AS R
            ON R.[JobName] < T.[JobName]
    ) AS R
    WHERE
        -- Only the row that sorts lowest
        R.rn = 1
)
SELECT js.*
FROM RecursiveCTE
INNER JOIN dbo.DsJobStat js ON RecursiveCTE.[JobName]= js.[JobName]
WHERE NOT EXISTS (SELECT 1 FROM [DsAvg] WHERE RecursiveCTE.JobName = [DsAvg].JobName)
OPTION (MAXRECURSION 0);

এই ক্যোয়ারীটি দেখতে অনেক বেশি তাই আমি আসল পরিকল্পনাটি যত্ন সহকারে পরীক্ষা করার পরামর্শ দিই । প্রথমে আমরা 200002 সূচক DsJobStatঅনন্য সমস্ত JobNameমান পেতে সূচকের বিপরীতে চেষ্টা করি । তারপরে আমরা এতে যোগ হয়ে DsAvgসমস্ত সারি বাদ দিই তবে একটি। অবশিষ্ট সারির জন্য, আবার যোগদান করুন DsJobStatএবং প্রয়োজনীয় সমস্ত কলামগুলি পান।

আইও প্যাটার্নটি সম্পূর্ণ পরিবর্তিত হয়। আমরা এটি পাওয়ার আগে:

সারণী 'ডিএসজবস্ট্যাট'। স্ক্যান কাউন্ট 1, যৌক্তিক পাঠ 1091651, দৈহিক 13836, রিড-ফরোয়ার্ড 181966 পড়ছে

পুনরাবৃত্তির ক্যোয়ারী সহ আমরা এটি পেয়েছি:

সারণী 'ডিএসজবস্ট্যাট'। স্ক্যান গণনা 200003, যৌক্তিক পঠন 1398000, শারীরিক পাঠ 1, রিড-ফরোয়ার্ড 7345 পড়ছে

আমার মেশিনে, নতুন ক্যোয়ারি সিপিইউ সময়ের মাত্র 6891 এমএস এবং অতিবাহিত সময়ের 7107 এমএসে কার্যকর করে। নোট করুন যে এইভাবে পুনরাবৃত্তিটি ব্যবহার করার দরকার থেকে বোঝা যায় যে ডেটা মডেল থেকে কিছু অনুপস্থিত (অথবা সম্ভবত এটি পোস্ট করা প্রশ্নটিতে কেবল অস্টেটড ছিল)। যদি কোনও তুলনামূলকভাবে ছোট টেবিল থাকে যা সমস্ত সম্ভাব্য থাকে JobNamesতবে বড় টেবিলটিতে পুনরাবৃত্তির বিপরীতে সেই টেবিলটি ব্যবহার করা আরও ভাল। এটি কীভাবে ফুটে উঠেছে JobNamesতা হল আপনার যদি প্রয়োজনীয় ফলাফলগুলি সমেত কোনও ফলাফলের সেট থাকে তবে আপনি অনুপস্থিত কলামগুলির বাকী অংশগুলি পেতে সূচী চেষ্টাটি ব্যবহার করতে পারেন। যাইহোক, আপনার প্রয়োজন হয় না এমন ফলাফলের সেট দিয়ে আপনি এটি করতে পারবেন না JobNames


আমি পরামর্শ দিলাম NOT EXISTS। তারা ইতিমধ্যে প্রতিক্রিয়া জানিয়েছে "আমি প্রশ্ন পোস্ট করার আগেই আমি উভয় চেষ্টা করেছিলাম, যোগদান করেছি এবং উপস্থিত নেই, খুব বেশি পার্থক্য নেই।"
ইভান ক্যারল 21

1
পুনরাবৃত্ত ধারণাটি কাজ করে কিনা তা জানতে আগ্রহী হব, যদিও এটি ভয়াবহ।
ইভান ক্যারল

আমি মনে করি যে ধারা থাকার দরকার নেই। "এল্যাপসডসেক নাল নয়" যেখানে ক্লজটি করবে। এছাড়াও আমি মনে করি পুনরাবৃত্ত সিটিই প্রয়োজন হয় না y আপনি সারি_নম্বার () নাম দিয়ে জব নাম অনুসারে পার্টিশন) ব্যবহার করতে পারবেন যেখানে আর নেই (নির্বাচন করুন ক্যোয়ারী) .আমার ধারণা সম্পর্কে আপনার কী বলতে হবে?
কুমারহর্ষ

@ জো ওবিশ, আমি আমার পোস্ট আপডেট করেছি। অনেক ধন্যবাদ.
ওয়েন্ডি

হ্যাঁ, রিকার্সিভ সিটিই আউট অফ রো (সংখ্যা অনুসারে নাম অনুসারে বিভাজন) আরএনটি 1 মিনিট করে সম্পাদন করে ut তবে একই সাথে আমি আপনার নমুনা ডেটা ব্যবহার করে রিকার্সিভ সিটিইতে কোনও বাড়তি লাভ দেখতে পেলাম না।
কুমারহর্ষ

0

আপনি যদি শর্তটি পুনর্লিখন করেন তবে কী ঘটে তা দেখুন,

AND DsJobStat.JobName NOT IN( SELECT [DsAvg].JobName FROM [DsAvg] )         

প্রতি

AND NOT EXISTS ( SELECT 1 FROM [DsAvg] AS d WHERE d.JobName = DsJobStat.JobName )

আপনার এসকিউএল 89 এ যোগদানের পুনর্লিখন বিবেচনা করুন কারণ সেই স্টাইলটি ভয়াবহ।

পরিবর্তে

FROM DsJobStat, AJF 
WHERE DsJobStat.NumericOrderNo=AJF.OrderNo 
AND DsJobStat.Odate=AJF.Odate 

চেষ্টা

FROM DsJobStat
INNER JOIN AJF ON (
  DsJobStat.NumericOrderNo=AJF.OrderNo 
  AND DsJobStat.Odate=AJF.Odate
)

আমি আরও সন্দেহ করি যে এই শর্তটি আরও ভাল লেখা যেতে পারে তবে কী ঘটছে সে সম্পর্কে আমাদের আরও জানতে হবে

HAVING AVG(CAST(DsJobStat.ElapsedSec AS FLOAT)) <> 0;

আপনার কি সত্যিই জানতে হবে গড়টি শূন্য নয়, বা গ্রুপের একটি উপাদান শূন্য নয়?


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