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


12

আমি শুধু কৌতূহল কেন একটি সামগ্রিক ক্যোয়ারী GROUP BYছাড়াই একটি ধারা ছাড়া এত দ্রুত চলে ।

উদাহরণস্বরূপ, এই কোয়েরিটি চালাতে প্রায় 10 সেকেন্ড সময় নেয়

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1

যদিও এটি এক সেকেন্ডের চেয়ে কম সময় নেয়

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate

CreatedDateএক্ষেত্রে কেবল একটিই রয়েছে, সুতরাং গোষ্ঠীযুক্ত ক্যোয়ারী অদলিতদের মতো একই ফলাফল প্রদান করে।

আমি লক্ষ্য করেছি যে দুটি প্রশ্নের জন্য মৃত্যুদণ্ড কার্যকর করার পরিকল্পনাগুলি আলাদা - দ্বিতীয় ক্যোয়ারী সমান্তরালতা ব্যবহার করে যখন প্রথম ক্যোয়ারীটি না করে।

কোয়েরি 1 এক্সিকিউশন প্ল্যান কোয়েরি 2 এক্সিকিউশন প্ল্যান

এসকিউএল সার্ভারের যদি সামগ্রীর ক্যোয়ারির গ্রুপ বা গ্রুপ না থাকে তবে আলাদাভাবে মূল্যায়ন করা কি সাধারণ? এবং কোন GROUP BYধারা না ব্যবহার করে 1 ম ক্যোয়ারির কার্যকারিতা উন্নত করতে আমি কি কিছু করতে পারি ?

সম্পাদন করা

আমি মাত্র শিখেছি আমি OPTION(querytraceon 8649)0 টিতে সমান্তরালতার ব্যয় ওভারহেড সেট করতে ব্যবহার করতে পারি , যা কোয়েরিকে কিছুটা সমান্তরালতা ব্যবহার করে এবং রানটাইমকে 2 সেকেন্ডে হ্রাস করে, যদিও আমি জানি না যে এই কোয়েরি ইঙ্গিতটি ব্যবহার করার কোনও ডাউনসাইড রয়েছে কিনা তা আমি জানি না।

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)

এখানে চিত্র বর্ণনা লিখুন

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

SELECT Min(CreatedDate)
FROM
(
    SELECT Min(CreatedDate) as CreatedDate
    FROM MyTable WITH (NOLOCK) 
    WHERE SomeIndexedValue = 1
    GROUP BY CreatedDate
) as T

সম্পাদনা # 2

আরও তথ্যের জন্য মার্টিনের অনুরোধের প্রতিক্রিয়া :

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

MyTable3 মিলিয়নেরও বেশি রেকর্ড রয়েছে এবং প্রতিটি রেকর্ডে এমন একটি গোষ্ঠী নির্ধারিত হয় যা এটি ( SomeIndexedValue) এর অন্তর্গত । গ্রুপগুলি 1 থেকে 200,000 রেকর্ড পর্যন্ত যে কোনও জায়গায় হতে পারে

উত্তর:


8

দেখে মনে হচ্ছে এটি সম্ভবত CreatedDateনীচ থেকে সর্বোচ্চের জন্য একটি সূচক অনুসরণ করছে এবং SomeIndexedValue = 1ভবিষ্যদ্বাণীটি মূল্যায়নের জন্য লুপআপ করছে।

এটি যখন প্রথম মিলের সারিটি সন্ধান করে এটি সম্পন্ন হয় তবে এটি এমন সারিটি খুঁজে পাওয়ার আগে এটি প্রত্যাশার চেয়ে আরও অনেক বেশি লকআপ করে থাকে (এটি অনুমান করে যে প্রাকটির সাথে মেলে থাকা সারিগুলি এলোমেলোভাবে তারিখ অনুসারে বিতরণ করা হয়েছে।)

অনুরূপ ইস্যুটির জন্য আমার উত্তরটি এখানে দেখুন

এই প্রশ্নের সাথে জন্য আদর্শ সূচক উপর এক হতে হবে SomeIndexedValue, CreatedDate। ধরে নেওয়া যাক আপনি যে যোগ করতে পারবেন না যে বা অন্তত আপনার বিদ্যমান সূচক করে তাদের উপর এর SomeIndexedValueকভার CreatedDateএকটি অন্তর্ভুক্ত কলাম হিসাবে তারপর আপনি ক্যোয়ারী rewriting নিম্নরূপ চেষ্টা করে দেখতে পারেন

SELECT MIN(DATEADD(DAY, 0, CreatedDate)) AS CreatedDate
FROM MyTable
WHERE SomeIndexedValue = 1

যে নির্দিষ্ট পরিকল্পনা ব্যবহার থেকে এটি প্রতিরোধ।


2

আমরা কি MAXDOP- র জন্য নিয়ন্ত্রণ করতে পারি এবং একটি পরিচিত টেবিল, যেমন, অ্যাডভেঞ্চার ওয়ার্কস.প্রডাকশন.ট্রান্সেকশনহিসটরি চয়ন করতে পারি?

আমি যখন আপনার সেটআপটি ব্যবহার করে পুনরায় বলি

--#1
SELECT MIN(TransactionDate) 
FROM AdventureWorks.Production.TransactionHistory
WHERE TransactionID = 100001 
OPTION( MAXDOP 1) ;

--#2
SELECT MIN(TransactionDate) 
FROM AdventureWorks.Production.TransactionHistory
WHERE TransactionID = 100001 
GROUP BY TransactionDate
OPTION( MAXDOP 1) ;
GO 

খরচ অভিন্ন।

একদিকে যেমন, আমি প্রত্যাশা করব (এটি ঘটুক) আপনার সূচিকৃত মানটির জন্য একটি সূচক চাই; অন্যথায়, আপনি সম্ভবত স্ট্রিম সমষ্টিগুলির পরিবর্তে হ্যাশ মিলগুলি দেখতে যাচ্ছেন। আপনি ক্লাস্টারবিহীন সূচকের সাথে পারফরম্যান্স উন্নত করতে পারেন যা আপনি সমষ্টি করছেন এমন মানগুলিকে অন্তর্ভুক্ত করে এবং বা আপনার সংকলনগুলি কলাম হিসাবে সংজ্ঞায়িত করে এমন একটি সূচক দৃষ্টিভঙ্গি তৈরি করতে পারে। তারপরে আপনি একটি ক্লাস্টারযুক্ত সূচককে আঘাত করতে যাবেন, যা আপনার সূচক আইডির মাধ্যমে আপনার সমষ্টিগুলিকে ধারণ করে। এসকিউএল স্ট্যান্ডার্ডে আপনি কেবল দৃশ্যটি তৈরি করতে পারেন এবং উইথ (নক্সপ্যান্ড) ইঙ্গিতটি ব্যবহার করতে পারেন।

একটি উদাহরণ (আমি এমআইএন ব্যবহার করি না, যেহেতু এটি সূচিবদ্ধ দৃষ্টিতে কাজ করে না):

USE AdventureWorks ;
GO

-- Covering Index with Include
CREATE INDEX IX_CoverAndInclude
ON Production.TransactionHistory(TransactionDate) 
INCLUDE (Quantity) ;
GO

-- Indexed View
CREATE VIEW dbo.SumofQtyByTransDate
    WITH SCHEMABINDING
AS
SELECT 
      TransactionDate 
    , COUNT_BIG(*) AS NumberOfTransactions
    , SUM(Quantity) AS TotalTransactions
FROM Production.TransactionHistory
GROUP BY TransactionDate ;
GO

CREATE UNIQUE CLUSTERED INDEX SumofAllChargesIndex 
    ON dbo.SumofQtyByTransDate (TransactionDate) ;  
GO


--#1
SELECT SUM(Quantity) 
FROM AdventureWorks.Production.TransactionHistory 
WITH (INDEX(0))
WHERE TransactionID = 100001 
OPTION( MAXDOP 1) ;

--#2
SELECT SUM(Quantity)  
FROM AdventureWorks.Production.TransactionHistory 
WITH (INDEX(IX_CoverAndInclude))
WHERE TransactionID = 100001 
GROUP BY TransactionDate
OPTION( MAXDOP 1) ;
GO 

--#3
SELECT SUM(Quantity)  
FROM AdventureWorks.Production.TransactionHistory
WHERE TransactionID = 100001 
GROUP BY TransactionDate
OPTION( MAXDOP 1) ;
GO

MAXDOPসমান্তরালতার সর্বোচ্চ ডিগ্রি সেট করে যা কোয়েরিটি ব্যবহার করতে পারে এমন প্রসেসরের সংখ্যা সীমাবদ্ধ করে দেয়। এটি মূলত ২ য় ক্যোয়ারিকে প্রথম মেনের মতো ধীর করে দেবে, যেহেতু এটি সমান্তরালতা ব্যবহারের সক্ষমতা অপসারণ করছে, যা আমি চাই না।
রাচেল

@ রাচেল আমি সম্মত; তবে আমরা কিছু মৌলিক নিয়ম না নিলে আমরা কোনও কিছুর তুলনা করতে পারি না। আমি খুব সহজেই 64 টি কোরে চলমান একটি সমান্তরাল প্রক্রিয়াটির একটিতে থাকা একক থ্রেডের সাথে তুলনা করতে পারি না। শেষ পর্যন্ত, আমি আশা করি আমাদের সমস্ত মেশিনের কমপক্ষে একটি লজিকাল সিপিইউ = -) রয়েছে
এ্যাডওয়ায়ার

0

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

আমি অনেকগুলি পরিস্থিতিও দেখেছি যেখানে ক্যোয়ারিকে ভিন্ন বিন্যাসে পুনর্লিখন করা সমান্তরালকরণের মধ্যে পার্থক্য ছিল (উদাহরণস্বরূপ যদিও এসকিউএল-এর বেশিরভাগ নিবন্ধগুলি প্যারামিটারাইজিংয়ের প্রস্তাব দেয় যদিও মাঝে মাঝে স্নিফ করা প্যারামিটারগুলি একই ছিল না এমন সময়ও সামঞ্জস্য তৈরি করার কারণ আমি খুঁজে পেয়েছি) - সমান্তরাল এক, বা ইউনিয়ন সমস্তের সাথে দুটি প্রশ্নের সংমিশ্রণ কখনও কখনও সমান্তরালতা দূর করতে পারে)।

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

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