এটি প্রতি বাগ কিনা তা নিশ্চিত নন তবে এটি অবশ্যই একটি আকর্ষণীয় ঘটনা। অনলাইন পার্টিশন পুনর্নির্মাণগুলি এসকিউএল সার্ভার ২০১৪-তে নতুন so
আপনার জন্য আমার সেরা ব্যাখ্যা এখানে। বর্ধিত পরিসংখ্যানগুলির জন্য একেবারে প্রয়োজন যে সমস্ত পার্টিশন একই হারে নমুনা করা উচিত যাতে ইঞ্জিন যখন পরিসংখ্যান পৃষ্ঠাগুলি একত্রিত করে তখন নিশ্চিত হয়ে যায় যে নমুনা বিতরণ তুলনীয়। REBUILD
অগত্যা 100% নমুনা হারে ডেটা স্যাম্পল করে। পার্টিশন 9-তে 100% নমুনা হার সর্বদা বাকী পার্টিশনের সঠিক নমুনার হার হতে চলেছে এমন কোনও গ্যারান্টি নেই। এর কারণ হিসাবে, এটি ইঞ্জিনটি নমুনাগুলি একীভূত করতে পারে না এমন মনে হয় এবং আপনি একটি খালি পরিসংখ্যান ব্লব দিয়ে শেষ করেন। তবে, পরিসংখ্যান অবজেক্ট এখনও আছে:
select
check_time = sysdatetime(),
schema_name = sh.name,
table_name = t.name,
stat_name = s.name,
index_name = i.name,
stats_column = index_col(quotename(sh.name)+'.'+quotename(t.name),s.stats_id,1),
s.stats_id,
s.has_filter,
s.is_incremental,
s.auto_created,
sp.last_updated,
sp.rows,
sp.rows_sampled,
sp.unfiltered_rows,
modification_counter
from sys.stats s
join sys.tables t
on s.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
left join sys.indexes i
on s.object_id = i.object_id
and s.name = i.name
outer apply sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
where t.name = 'TransactionHistory' and sh.name = 'dbo'
আপনি যে কোনও সংখ্যক মাধ্যমে ব্লবটি পূরণ করতে পারেন:
UPDATE STATISTICS dbo.TransactionHistory (IDX_ProductId) WITH RESAMPLE;
অথবা
UPDATE STATISTICS dbo.TransactionHistory (IDX_ProductId) WITH RESAMPLE ON PARTITIONS (9);
অথবা আপনি সেই বস্তুটি ব্যবহার করে কোনও ক্যোয়ারী পরিকল্পনার প্রথম সংকলনটিতে অটোস্ট্যাটসের আপডেট হওয়ার অপেক্ষা করতে পারেন:
-- look at my creative query
select *
from dbo.TransactionHistory
where TransactionDate = '20140101';
সব বলেছে, ইরিন স্টেলাটো এই আলোকিত পোস্ট post যা বর্ধিত পরিসংখ্যানের একটি বড় ঘাটতি হিসাবে বিবেচিত হয়েছে তা তুলে ধরেছে। তাদের পার্টিশন-স্তরের ডেটাগুলি কোয়েরি প্ল্যান জেনারেশনে অপ্টিমাইজার ব্যবহার করে না, বর্ধিত পরিসংখ্যানগুলির অনুমিত সুবিধা হ্রাস করে। তাহলে, বর্ধিত পরিসংখ্যানের বর্তমান উপকারটি কী? আমি জমা দিচ্ছি যে তাদের প্রাথমিক ইউটিলিটি tableতিহ্যগত পরিসংখ্যানের তুলনায় আরও বেশি হারে আরও বড় ধারাবাহিকভাবে বড় টেবিলগুলির নমুনা নেওয়ার ক্ষমতাতে রয়েছে।
আপনার উদাহরণ ব্যবহার করে জিনিসগুলি দেখতে কেমন তা এখানে:
set statistics time on;
update statistics dbo.TransactionHistory(IDX_ProductId)
with fullscan;
--SQL Server Execution Times:
-- CPU time = 94 ms, elapsed time = 131 ms.
update statistics dbo.TransactionHistory(IDX_ProductId)
with resample on partitions(2);
--SQL Server Execution Times:
-- CPU time = 0 ms, elapsed time = 5 ms.
drop index IDX_ProductId On dbo.TransactionHistory;
CREATE NONCLUSTERED INDEX IDX_ProductId ON dbo.TransactionHistory (ProductId)
WITH (DATA_COMPRESSION = ROW)
ON [PRIMARY]
update statistics dbo.TransactionHistory(IDX_ProductId)
with fullscan;
--SQL Server Execution Times:
-- CPU time = 76 ms, elapsed time = 66 ms.
বর্ধিত পরিসংখ্যান সম্পর্কিত পূর্ণ স্ক্যান পরিসংখ্যান আপডেটের মূল্য 131 এমএস। নন পার্টিশন-অ্যালাইনড স্ট্যাটিস্টিকের জন্য সম্পূর্ণ স্ক্যান পরিসংখ্যান আপডেট update costs এমএস। অ্যালায়েন্সযুক্ত পরিসংখ্যানগুলি ওভারহেডের কারণে ব্যয় হওয়ায় সম্ভবত ধীর মূল-হিস্টোগ্রামে স্বতন্ত্র পরিসংখ্যান পৃষ্ঠাগুলি আবার মার্জ করে। যাইহোক, পার্টিশন-সারিবদ্ধ পরিসংখ্যান অবজেক্টটি ব্যবহার করে আমরা একটি পার্টিশন আপডেট করতে পারি এবং 5 এমএসে এটিকে আবার মূল হিস্টগ্রাম ব্লাবে রূপান্তর করতে পারি। সুতরাং এই মুহুর্তে বর্ধিত পরিসংখ্যান সহ প্রশাসক একটি সিদ্ধান্তের মুখোমুখি হন। তারা কেবলমাত্র পার্টিশনগুলি আপডেট করার মাধ্যমে তাদের সামগ্রিক পরিসংখ্যান রক্ষণাবেক্ষণের সময় হ্রাস করতে পারে traditionতিহ্যগতভাবে আপডেট করার প্রয়োজন হবে বা তারা উচ্চতর নমুনা হার নিয়ে পরীক্ষা করতে পারে যাতে তারা আগের রক্ষণাবেক্ষণের সময়সীমার একই সময়ের মধ্যে আরও সারি নমুনা পেতে পারে get প্রাক্তনটি রক্ষণাবেক্ষণ উইন্ডোতে শ্বাসকষ্টের অনুমতি দেয়, পরবর্তীটিহতে পারে খুব বড় টেবিলে এমন একটি স্থানে পরিসংখ্যান যেখানে কোয়েরি আরও সঠিক পরিসংখ্যানের ভিত্তিতে আরও ভাল পরিকল্পনা করে। এটি কোনও গ্যারান্টি নয় এবং আপনার মাইলেজটি আলাদা হতে পারে।
পাঠক দেখতে পাচ্ছেন যে এই টেবিলটিতে ms 66 এমএস একটি বেদনাদায়ক পরিসংখ্যান আপডেটের সময় নয় তাই আমি স্ট্যাকেক্সচেঞ্জের ডেটা সেটটিতে একটি পরীক্ষা করার চেষ্টা করেছি। আমি যে সাম্প্রতিক ডাম্প ডাউনলোড করেছি তাতে 6,418,608 টি পোস্ট রয়েছে (2012 সালের স্ট্যাকওভারফ্লো পোস্টগুলি এবং সমস্ত পোস্টগুলি - আমার পক্ষ থেকে একটি ডেটা ত্রুটি)।
আমি ডেটা ভাগ করেছি [CreationDate]
কারণ ... ডেমো।
কিছু চমত্কার স্ট্যান্ডার্ড দৃশ্যের জন্য এখানে কিছু সময় রয়েছে (100% - সূচি পুনর্নির্মাণ, ডিফল্ট - পরিসংখ্যান স্বতঃ-আপডেট বা UPDATE STATISTICS
নির্দিষ্ট নমুনা হার ছাড়াই:
- ফুলস্ক্যান সহ অ বর্ধিত পরিসংখ্যান তৈরি করুন: সিপিইউ সময় = 23500 এমএস, অতিবাহিত সময় = 22521 এমএস।
- পূর্ণ স্ক্যান সহ বর্ধিত পরিসংখ্যান তৈরি করুন: সিপিইউ সময় = 20406 এমএস, অতিবাহিত সময় = 15413 এমএস।
- ডিফল্ট নমুনা হারের সাথে অ বর্ধিত পরিসংখ্যান আপডেট করুন: সিপিইউ সময় = 406 এমএস, অতিবাহিত সময় = 408 এমএস।
- ডিফল্ট নমুনা হার সহ বর্ধিত পরিসংখ্যান আপডেট করুন: সিপিইউ সময় = 453 এমএস, অতিবাহিত সময় = 507 এমএস।
ধরা যাক আমরা এই পূর্বনির্ধারিত পরিস্থিতিতে তুলনায় আরও পরিশীলিত হয়েছি এবং সিদ্ধান্ত নিয়েছি যে 10% নমুনা হার হ'ল ন্যূনতম হার যা আমাদের প্রয়োজনমত পরিকল্পনা গ্রহণ করা উচিত যখন রক্ষণাবেক্ষণের সময়টি একটি যুক্তিসঙ্গত সময়সীমার সাথে রাখে।
- নমুনা 10 শতাংশ সহ অ-বর্ধিত পরিসংখ্যান আপডেট করুন: সিপিইউ সময় = 2344 এমএস, অতিবাহিত সময় = 2441 এমএস।
- নমুনা 10 শতাংশ সহ বর্ধিত পরিসংখ্যান আপডেট করুন: সিপিইউ সময় = 2344 মিমি, অতিবাহিত সময় = 2388 এমএস।
এখনও পর্যন্ত একটি বর্ধিত পরিসংখ্যান থাকার কোনও সুস্পষ্ট সুবিধা নেই benefit তবে, আমরা যদি অনিবন্ধিত sys.dm_db_stats_properties_internal()
ডিএমভি (নীচে) কে উত্তোলন করি তবে আপনি কোন বিভাজন (গুলি) আপডেট করতে চাইতে পারেন সে সম্পর্কে কিছুটা অন্তর্দৃষ্টি পেতে পারেন। ধরা যাক আমরা পার্টিশন 3-তে ডেটাতে পরিবর্তন করেছি এবং আমরা নিশ্চিত করতে চাই যে পরিসংখ্যানগুলি আগত জিজ্ঞাসার জন্য নতুন are আমাদের বিকল্পগুলি এখানে:
- ডিফল্ট অ বর্ধিত আপডেট করুন (অটো-স্ট্যাটাস আপডেটের ডিফল্ট আচরণও): 408 এমএস।
- 10%: 2441 এমএস এ অ-বর্ধিত আপডেট করুন।
- বর্ধিত পরিসংখ্যান আপডেট করুন, পুনরায় নমুনা সহ পার্টিশন 3 (10% - আমাদের সংজ্ঞায়িত নমুনার হার): সিপিইউ সময় = 63 এমএস, অতিবাহিত সময় = 63 এমএস।
আমাদের এখানে সিদ্ধান্ত নেওয়া দরকার। আমরা কি 63৩ এমএসের বিজয় নিই? পার্টিশন ভিত্তিক পরিসংখ্যান ভিত্তিক আপডেট, বা আমরা কি আরও বেশি নমুনা হার bump? ধরা যাক আমরা বর্ধিত পরিসংখ্যানের ভিত্তিতে নমুনা গ্রহণের প্রাথমিক হিট 50% এ নিতে ইচ্ছুক:
- 50% এ বর্ধিত পরিসংখ্যান আপডেট করুন: অতিবাহিত সময় = 16840 এমএস।
- বর্ধিত পরিসংখ্যান আপডেট করুন, পুনরায় নমুনা সহ পার্টিশন 3 (50% - আমাদের নতুন আপডেটের সময়): অতিবাহিত সময় = 295 এমএস।
আমরা আরও অনেক ডেটা নমুনা করতে সক্ষম হয়েছি, সম্ভবত আমাদের ডেটা সম্পর্কে আরও ভাল অনুমানের জন্য অপ্টিমাইজার স্থাপন করা (যদিও এটি পার্টিশন-স্তরের পরিসংখ্যানগুলি ব্যবহার করছে না, যদিও) এবং আমরা এখন এটি আরও দ্রুত করতে সক্ষম হয়েছি বর্ধিত পরিসংখ্যান।
যদিও শেষ একটি মজার জিনিস। সিঙ্ক্রোনাস স্ট্যাটাস আপডেট সম্পর্কে কী? অটোস্ট্যাটস কিক লাগানো অবস্থায়ও কি 50% নমুনা হার সংরক্ষণ করা যায়?
আমি পার্টিশন 3 থেকে ডেটা মুছলাম এবং ক্রিয়েশনডেটে একটি কোয়েরি চালিয়েছি এবং নীচে একই কোয়েরির সাথে রেটগুলি চেক করেছি checked 50% নমুনা হার সংরক্ষণ করা হয়েছিল।
সুতরাং, দীর্ঘ গল্প সংক্ষিপ্ত: বর্ধিত পরিসংখ্যান সঠিক পরিমাণে চিন্তাভাবনা এবং প্রাথমিক সেটআপ কাজের সাথে একটি দরকারী সরঞ্জাম হতে পারে। তবে, আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা অবশ্যই আপনার জানা উচিত এবং তারপরে আপনার যথাযথভাবে সমাধান করার প্রয়োজন। আপনি খারাপ cardinality অনুমান পেয়ে থাকেন, তাহলে আপনি পারে একটি কৌশলগত নমুনা হার এবং কিছু বিনিয়োগ হস্তক্ষেপের মাধ্যমে আরও ভাল পরিকল্পনা পেতে সক্ষম হবেন। তবে, আপনি কেবলমাত্র সুবিধার একটি অল্প অংশ পাচ্ছেন যেহেতু হিস্টোগ্রামটি ব্যবহৃত হচ্ছে একক, মার্জড পরিসংখ্যান পৃষ্ঠা এবং পার্টিশন-স্তরের তথ্য নয়। আপনি যদি আপনার রক্ষণাবেক্ষণ উইন্ডোতে ব্যথা অনুভব করেন তবে সম্ভবত বর্ধিত পরিসংখ্যান আপনাকে সহায়তা করতে পারে তবে সম্ভবত এটি আপনাকে উচ্চ-স্পর্শ রক্ষণাবেক্ষণের হস্তক্ষেপ প্রক্রিয়া সেটআপ করার প্রয়োজন হবে। নির্বিশেষে, মনে রাখবেন:
- সূচিগুলি দিয়ে তৈরি পরিসংখ্যানগুলি যা বেস টেবিলের সাথে পার্টিশন-প্রান্তিক নয়।
- সর্বদা পঠনযোগ্য মাধ্যমিক ডাটাবেসগুলিতে পরিসংখ্যান তৈরি হয়েছে।
- পরিসংখ্যানগুলি কেবল পঠনযোগ্য ডেটাবেজে তৈরি করা হয়েছে।
- ফিল্টার সূচকগুলিতে পরিসংখ্যান তৈরি।
- পরিসংখ্যান ভিউ তৈরি।
- অভ্যন্তরীণ টেবিলগুলিতে পরিসংখ্যান তৈরি হয়েছে।
- স্থানিক সূচকগুলি বা এক্সএমএল সূচী দিয়ে তৈরি পরিসংখ্যান।
আশাকরি এটা সাহায্য করবে
select
sysdatetime(),
schema_name = sh.name,
table_name = t.name,
stat_name = s.name,
index_name = i.name,
leading_column = index_col(quotename(sh.name)+'.'+quotename(t.name),s.stats_id,1),
s.stats_id,
parition_number = isnull(sp.partition_number,1),
s.has_filter,
s.is_incremental,
s.auto_created,
sp.last_updated,
sp.rows,
sp.rows_sampled,
sp.unfiltered_rows,
modification_counter = coalesce(sp.modification_counter, n1.modification_counter)
from sys.stats s
join sys.tables t
on s.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
left join sys.indexes i
on s.object_id = i.object_id
and s.name = i.name
cross apply sys.dm_db_stats_properties_internal(s.object_id, s.stats_id) sp
outer apply sys.dm_db_stats_properties_internal(s.object_id, s.stats_id) n1
where n1.node_id = 1
and (
(is_incremental = 0)
or
(is_incremental = 1 and sp.partition_number is not null)
)
and t.name = 'Posts'
and s.name like 'st_posts%'
order by s.stats_id,isnull(sp.partition_number,1)