যখন আপনার কাছে কোনও ক্যোয়ারী বা সঞ্চিত পদ্ধতি রয়েছে যার জন্য পারফরম্যান্স টিউনিং প্রয়োজন, আপনি প্রথমে চেষ্টা করেন এমন কয়েকটি কি?
যখন আপনার কাছে কোনও ক্যোয়ারী বা সঞ্চিত পদ্ধতি রয়েছে যার জন্য পারফরম্যান্স টিউনিং প্রয়োজন, আপনি প্রথমে চেষ্টা করেন এমন কয়েকটি কি?
উত্তর:
এখানে আমি সর্বদা আমাকে অপ্টিমাইজেশন সম্পর্কে জিজ্ঞাসা করে এমন কাউকে উপহার দিই এমন জিনিসগুলির সহজ-সরল তালিকা is
আমরা মূলত সাইবাজ ব্যবহার করি তবে বেশিরভাগ পরামর্শই বোর্ড জুড়ে প্রযোজ্য।
উদাহরণস্বরূপ, এসকিউএল সার্ভারটি উপস্থিত রয়েছে পারফরম্যান্স মনিটরিং / টিউনিং বিটগুলির একটি হোস্টের সাথে, তবে আপনার যদি এমন কিছু না থাকে (এবং সম্ভবত আপনি তা করেনও) তবে আমি নিম্নলিখিতগুলি বিবেচনা করব ...
সমস্যার 99% আমি দেখেছি নির্বাণ দ্বারা ঘটিত হয় একটি যোগদানের অনেকগুলি টেবিল । এর জন্য ঠিক করা হল অর্ধেক যোগ (কিছু টেবিলের সাথে) করা এবং অস্থায়ী সারণীতে ফলাফলগুলি ক্যাশে করা। তারপরে সেই অস্থায়ী টেবিলের সাথে অবশিষ্ট থাকা ক্যোয়ারীটি করুন।
#temp
টেবিলগুলি @table
বৃহত পরিমাণে (কয়েক হাজার সারি) ভেরিয়েবলের চেয়ে আরও ভাল পারফর্ম করতে পারে ।সামান্যভাবে বিষয়বস্তু বন্ধ করুন তবে এই বিষয়গুলিতে আপনার যদি নিয়ন্ত্রণ থাকে ...
উচ্চ স্তর এবং উচ্চ প্রভাব।
CREATE INDEX
আপনার WHERE
এবং JOIN
ধারাগুলির জন্য সূচকগুলি উপলভ্য রয়েছে তা নিশ্চিত করুন । এটি ডেটা অ্যাক্সেসকে ব্যাপকভাবে গতিবেগ করবে।
আপনার পরিবেশ যদি কোনও ডেটা মার্ট বা গুদাম হয় তবে প্রায় কোনও অনুমেয়যোগ্য জিজ্ঞাসার জন্য সূচিগুলি প্রচুর পরিমাণে হওয়া উচিত।
একটি লেনদেনের পরিবেশ , ইনডেক্স সংখ্যা যাতে সূচক রক্ষণাবেক্ষণ সম্পদ নিচে টানছেন না কম এবং তাদের সংজ্ঞা আরো কৌশলগত হওয়া উচিত। (সূচকের রক্ষণাবেক্ষণ তখন হয় যখন সূচকের পাতাগুলি অবশ্যই অন্তর্ভুক্ত টেবিলের পরিবর্তনের প্রতিফলিত করতে INSERT, UPDATE,
এবং DELETE
অপারেশনগুলিতে পরিবর্তন করতে হবে ))
এছাড়াও, সূচকে ক্ষেত্রগুলির ক্রম সম্পর্কে সচেতন থাকুন - ক্ষেত্রটি যত বেশি নির্বাচনী (উচ্চ কার্ডিনালিটি) হয়, সূচকের প্রথমদিকে এটি প্রদর্শিত হবে। উদাহরণস্বরূপ, বলুন আপনি ব্যবহৃত অটোমোবাইলগুলির জন্য অনুসন্ধান করছেন:
SELECT i.make, i.model, i.price
FROM dbo.inventory i
WHERE i.color = 'red'
AND i.price BETWEEN 15000 AND 18000
দামের মধ্যে সাধারণত কার্ডিনালিটি বেশি থাকে। কেবলমাত্র কয়েক ডজন রঙ উপলব্ধ থাকতে পারে, তবে সম্ভবত হাজার হাজার বিভিন্ন জিজ্ঞাসার দাম রয়েছে।
এই সূচক পছন্দগুলির মধ্যে, idx01
ক্যোয়ারীটি সন্তুষ্ট করার দ্রুততর পথ সরবরাহ করে:
CREATE INDEX idx01 ON dbo.inventory (price, color)
CREATE INDEX idx02 ON dbo.inventory (color, price)
এটি কারণ কারণ কম সংখ্যক গাড়ি রঙের পছন্দের চেয়ে দাম পয়েন্টটি পূরণ করবে, ক্যোয়ারী ইঞ্জিনটিকে বিশ্লেষণের তুলনায় অনেক কম ডেটা দেবে।
আমি কেবল দুটি ক্ষেত্রে অনুরূপ সূচকগুলি পৃথক করতে পারছি কেবলমাত্র ক্ষেত্রের ক্রয়ে ক্যোরির (প্রথম নাম, পদবি) এবং অন্যটিতে (পদবি), প্রথম নাম)।
একটি কৌশল আমি সম্প্রতি শিখেছি হ'ল এসকিউএল সার্ভার একটি আপডেট বিবৃতিতে স্থানীয় ভেরিয়েবলের পাশাপাশি ক্ষেত্রগুলিও আপডেট করতে পারে।
UPDATE table
SET @variable = column = @variable + otherColumn
বা আরও পঠনযোগ্য সংস্করণ:
UPDATE table
SET
@variable = @variable + otherColumn,
column = @variable
পুনরাবৃত্ত গণনাগুলি প্রয়োগ করার সময় আমি জটিল কার্সার / যোগদানগুলিতে প্রতিস্থাপন করতে এটি ব্যবহার করেছি এবং কার্যকারিতাতেও অনেক অর্জন করেছি।
এখানে বিবরণ এবং উদাহরণের কোড যা কার্য সম্পাদনে চমত্কার উন্নতি করেছে: http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005--- the-titimative। aspx
এখানে মাইএসকিউএল ধরে নিচ্ছি, কোয়েরিতে কী চলছে তা জানতে এক্সপ্ল্লেইন ব্যবহার করুন, সূচীগুলি যথাসম্ভব দক্ষতার সাথে ব্যবহার করা হচ্ছে তা নিশ্চিত করুন এবং ফাইলের ধরণগুলি বাদ দেওয়ার চেষ্টা করুন। হাই পারফরম্যান্স মাইএসকিউএল: মাইএসকিউএল পারফরম্যান্স ব্লগ হিসাবে এই বিষয়টির একটি অনুকূল বই অপ্টিমাইজেশন, ব্যাকআপস, প্রতিলিপি এবং আরও অনেক কিছু ।
@ তেরাপিনে isnull এবং coalesce এর মধ্যে আরও কয়েকটি পার্থক্য রয়েছে যা উল্লেখযোগ্য (এএনএসআই সম্মতি ছাড়াও এটি আমার পক্ষে অনেক বড়)।
আমি সাধারণত যোগদানের সাথেই শুরু করব - আমি একবারে কোয়েরি থেকে তাদের প্রত্যেককে ছুঁড়ে ফেলি এবং একটি বিশেষ যোগদানের সাথে যদি আমার কোনও সমস্যা হয় তবে একটি ধারণা পেতে পুনরায় রান করব।
আমার সমস্ত টেম্প টেবিলগুলিতে, আমি সূচি তৈরি করতে অনন্য বাধা (যেখানে উপযুক্ত) এবং প্রাথমিক কীগুলি (প্রায় সর্বদা) যুক্ত করতে চাই।
declare @temp table(
RowID int not null identity(1,1) primary key,
SomeUniqueColumn varchar(25) not null,
SomeNotUniqueColumn varchar(50) null,
unique(SomeUniqueColumn)
)
আমি সর্বদা বাইন্ড ভেরিয়েবলগুলি ব্যবহার করার অভ্যাস তৈরি করেছি। যদি আরডিবিএমএস এসকিউএল স্টেটমেন্টগুলি ক্যাশে না করে তবে এটি সম্ভব বাইনড ভেরিয়েবলগুলি সাহায্য করবে না। তবে আপনি যদি বাইন্ড ভেরিয়েবল ব্যবহার না করেন তবে আরডিবিএমএসের কাছে ক্যোয়ারি এক্সিকিউশন পরিকল্পনা এবং পার্সড এসকিউএল স্টেটমেন্টগুলি পুনরায় ব্যবহার করার সুযোগ নেই। সঞ্চয়গুলি বিশাল হতে পারে: http://www.akadia.com/services/ora_bind_variables.html । আমি বেশিরভাগ ওরাকল নিয়ে কাজ করি তবে মাইক্রোসফ্ট এসকিউএল সার্ভার একইভাবে কাজ করে।
আমার অভিজ্ঞতায় আপনি যদি বাইন্ড ভেরিয়েবলগুলি ব্যবহার করছেন বা না জানেন তবে আপনি সম্ভবত তা করছেন না। যদি আপনার অ্যাপ্লিকেশন ভাষা তাদের সমর্থন করে না, তবে এটির মতো একটি আবিষ্কার করুন। কখনও কখনও আপনি কোয়েরি বি এর জন্য বাইন্ড ভেরিয়েবল ব্যবহার করে কোয়েরি এটিকে ঠিক করতে পারেন B.
এর পরে, আরডিবিএমএসকে সবচেয়ে বেশি ব্যথার কারণ কী তা জানতে আমি আমাদের ডিবিএর সাথে কথা বলি। মনে রাখবেন যে আপনি "এই কোয়েরিটি ধীর কেন?" এটি আপনার ডাক্তারকে আপনাকে অ্যাপেন্ডিক্স বের করতে বলার মতো। আপনার ক্যোয়ারিতে সমস্যা হতে পারে তা নিশ্চিত, তবে অন্য কিছু ভুল হওয়ার সম্ভাবনা রয়েছে। বিকাশকারী হিসাবে, আমরা কোড লাইন শর্তাবলী বিবেচনা প্রবণতা। যদি কোনও লাইন ধীর হয় তবে সেই লাইনটি ঠিক করুন। তবে একটি আরডিবিএমএস সত্যিই জটিল সিস্টেম এবং আপনার ধীর অনুসন্ধানটি আরও অনেক বড় সমস্যার লক্ষণ হতে পারে।
বেশ কয়েকটি এসকিউএল টিউন করার টিপস হ'ল কার্গো কাল্ট মূর্তি। বেশিরভাগ সময় সমস্যাটি আপনার ব্যবহার করা সিনট্যাক্সের সাথে সম্পর্কিত বা ন্যূনতমভাবে সম্পর্কিত হয়, তাই আপনার পক্ষে সবচেয়ে পরিষ্কার সিনট্যাক্স ব্যবহার করা সবচেয়ে ভাল। তারপরে আপনি ডাটাবেস টিউন করার উপায়গুলি অনুসন্ধান করা শুরু করতে পারেন (ক্যোরি নয়)। ব্যর্থ হলে কেবল সিনট্যাক্সটিকে টুইঙ্ক করুন।
যে কোনও পারফরম্যান্সের সুরের মতো, সর্বদা অর্থপূর্ণ পরিসংখ্যান সংগ্রহ করুন। আপনি যে টিউন করছেন তার ব্যবহারকারীর অভিজ্ঞতা না থাকলে ওয়ালক্লক সময় ব্যবহার করবেন না। পরিবর্তে সিপিইউ সময়, সারিগুলি পাওয়া এবং ডিস্কের পড়া বন্ধ করার মতো বিষয়গুলি দেখুন। প্রায়শই লোকেরা ভুল জিনিসটির জন্য অনুকূলিত হয়।
যদি সম্ভব হয় তবে বাম আউটয়ার জয়েনস-এ কোয়েরিতে না রূপান্তর করুন if উদাহরণস্বরূপ, আপনি যদি টেবিল 1 এ বিদেশী কী দ্বারা অব্যবহৃত টেবিল 1 এ থাকা সমস্ত সারিগুলি সন্ধান করতে চান আপনি এটি করতে পারেন:
SELECT *
FROM Table1
WHERE Table1.ID NOT IN (
SELECT Table1ID
FROM Table2)
তবে আপনি এটি দিয়ে আরও ভাল পারফরম্যান্স পাবেন:
SELECT Table1.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.Table1ID
WHERE Table2.ID is null
@ ডেভিডএম
এখানে মাইএসকিউএল ধরে নিচ্ছি, কোয়েরিতে কী চলছে তা সন্ধানের জন্য এক্সপ্ল্লেইন ব্যবহার করুন, নিশ্চিত করুন যে সূচিগুলি যথাসম্ভব দক্ষতার সাথে ব্যবহৃত হচ্ছে ...
এসকিউএল সার্ভারে, এক্সিকিউশন প্ল্যানটি আপনাকে একই জিনিস দেয় - এটি আপনাকে সূচিগুলি কীভাবে ক্ষতিগ্রস্থ করছে ইত্যাদি বলে tells
অগত্যা প্রতি এসকিউএল পারফরম্যান্স ট্রিক নয় তবে অবশ্যই সম্পর্কিত:
একটি ভাল ধারণা হ'ল ম্যাকচেড ব্যবহার করা যেখানে সম্ভব হবে কারণ এটি ডেটাবেস থেকে পাওয়ার চেয়ে সরাসরি মেমোরি থেকে প্রাকম্পম্পযুক্ত ডেটা সংগ্রহ করা আরও দ্রুত হবে। মাইএসকিউএল এর একটি স্বাদও রয়েছে যা (তৃতীয় পক্ষ) অন্তর্নির্মিত মেমক্যাচ হয়ে গেছে।
আপনার সূচকের দৈর্ঘ্য যতটা সম্ভব কম তা নিশ্চিত করুন। এটি ডিবিটিকে ফাইল সিস্টেম থেকে একবারে আরও কীগুলি পড়ার অনুমতি দেয়, এইভাবে আপনার যোগদানের গতি বাড়িয়ে দেয়। আমি ধরে নিলাম এটি সমস্ত ডিবি'র সাথে কাজ করে তবে আমি জানি এটি মাইএসকিউএল-এর জন্য একটি নির্দিষ্ট প্রস্তাবনা।
আমি সন্ধান করছি:
SET NOCOUNT ON
সাধারণত আমার সঞ্চিত প্রক্রিয়াগুলির মধ্যে প্রথম লাইন, যদি না আমার আসলে ব্যবহারের প্রয়োজন হয় @@ROWCOUNT
।
এসকিউএল সার্ভারে নলক নির্দেশিকা ব্যবহার করুন। এটি নির্বাচিত কমান্ডটি অপেক্ষা না করেই সম্পূর্ণ করতে দেয় - সাধারণত অন্যান্য লেনদেন শেষ হয়।
SELECT * FROM Orders (nolock) where UserName = 'momma'
স্প্রোকগুলিতে ফাংশন কলগুলি সরিয়ে ফেলুন যেখানে প্রচুর সারি ফাংশনটি কল করবে।
আমার সহকর্মী খুব বিস্তৃত রেকর্ডসেটগুলি ফিরতে ফাংশন কলগুলি (উদাহরণস্বরূপ ব্যবহারকারীর কাছ থেকে লাস্টলগাইন্ডেট পেয়েছিল) ব্যবহার করেছিল।
অপ্টিমাইজেশনের কাজটি সম্পন্ন করে আমি স্প্রোকের ফাংশনের কোডগুলিকে ফাংশনের কোড দিয়ে প্রতিস্থাপন করেছি: আমি অনেক স্প্রোকের চলমান সময়> 20 সেকেন্ড থেকে <1 এ নামিয়ে পেয়েছি।
আমি ব্যবহার করতে চাই
isnull(SomeColThatMayBeNull, '')
উপর
coalesce(SomeColThatMayBeNull, '')
যখন আমার একাধিক যুক্তি সাপোর্টের প্রয়োজন হবে না যা coalesce আপনাকে দেয়।
http://blog.falafel.com/2006/04/05/SQLServerArcanaISNULLVsCOALESCE.aspx
"Sp_" দিয়ে সঞ্চিত প্রক্রিয়া নামগুলি উপস্থাপন করবেন না কারণ সিস্টেমের পদ্ধতিগুলি সমস্ত "sp_" দিয়ে শুরু হয় এবং এসকিউএল সার্ভারের যখন এটি আহ্বান করা হয় তখন আপনার পদ্ধতিটি খুঁজে পেতে আরও কঠোরভাবে অনুসন্ধান করতে হবে।
set transaction isolation level read uncommitted
মৃত লকগুলি প্রতিরোধ করে যেখানে লেনদেনের অখণ্ডতা একেবারে প্রয়োজনীয় নয় (যা সাধারণত সত্য)
আমি সর্বদা এসকিউএল প্রোফাইলার (যদি এটি অনেকগুলি নেস্টিং স্তর সহ একটি সঞ্চিত প্রক্রিয়া হয়) বা ক্যোয়ারি এক্সিকিউশন প্ল্যানার (যদি এটি কোনও নেস্টিংয়ের সাথে কয়েকটি এসকিউএল স্টেটমেন্ট না থাকে) প্রথমে যাই। 90% সময় এই দুটি সরঞ্জামের মধ্যে একটির সাথে আপনি তত্ক্ষণাত্ সমস্যাটি খুঁজে পেতে পারেন।