এসকিউএল সার্ভার "খালি টেবিল" সমস্ত (12 মিলিয়ন) রেকর্ড মুছার পরে ধীর?


27

আমার কাছে প্রায় এসএসকিউএল সার্ভার ২০০৮ উদাহরণ রয়েছে যার প্রায় ১৫০ টি কলাম রয়েছে। আমি পূর্বে প্রায় 12 মিলিয়ন এন্ট্রি সহ এই টেবিলটি তৈরি করেছি, তবে নতুন ডেটা সেট প্রস্তুতির জন্য এই টেবিলটি সাফ করে দিয়েছি।

যাইহোক, কমান্ড যে একবার একটি খালি সারণী অবিলম্বে দৌড়ে যেমন count(*)এবং select top 1000মধ্যে SQL Management Studioএখন চালানোর জন্য eons নিতে।

SELECT COUNT(*) FROM TABLE_NAME 

0 ফিরে আসতে 11 মিনিটের বেশি সময় SELECT TOP 1000নিয়েছে এবং খালি টেবিলটি ফিরে আসতে 10 মিনিট সময় নিয়েছে।

আমি এটিও লক্ষ্য করেছি যে আমার হার্ড ড্রাইভে ফ্রি স্পেসটি আক্ষরিক অর্থে অদৃশ্য হয়ে গেছে (প্রায় 100 জি থেকে 20 জি পর্যন্ত)। এর মধ্যে যে ঘটনাটি ঘটেছিল তা হ'ল আমি একক জিজ্ঞাসা করলাম:

DELETE FROM TABLE_NAME

বিশ্বে কি হচ্ছে?!?


5
আপনার ডাটাবেসটি কী পুনরুদ্ধারের মডেল ব্যবহার করে? যদি এটি "পূর্ণ" হয় তবে আপনার এসকিউএল উদাহরণটি dele সমস্ত মুছে ফেলার রেকর্ড সংরক্ষণ করবে, যা আপনার ফ্রি স্পেসটি কোথায় গিয়েছিল। যদি পুরো পুনরুদ্ধারের প্রয়োজন হয় তবে আমি TRUNCATE TABLEপরিবর্তে ব্যবহার করার পরামর্শ দিই DELETE FROM
Tullo_x86

2
150 কলাম? এই টেবিলটি অতিমাত্রায় পূর্ণ হতে পারে - বেশিরভাগ টিপলগুলি আরও ছোট হওয়া উচিত। সম্পূর্ণ প্রসঙ্গ ছাড়া বলা অসম্ভব।
ক্লকওয়ার্ক-মিউজিক

উত্তর:


42

এর TRUNCATEচেয়ে বেশি দ্রুত / উন্নত / যৌনতর কেন হবে সে সম্পর্কে আপনাকে ইতিমধ্যে জানিয়ে দেওয়া হয়েছে DELETE, তবে এর সমাধান করার জন্য এখনও একটি প্রশ্ন বাকী রয়েছে:

কেন SELECTধীর পর DELETE সম্পন্ন ?

এটা এ কারণে যে হয় DELETEশুধুমাত্র হয়েছে ghosted সারি। সারণীটি 12M সারিগুলির মতো ঠিক তার চেয়ে বড়, যদিও এর কোনওটি নেই। সারিগুলি (0) গণনা করতে, 12 এম সারিগুলি গণনা করতে এটি ঠিক তত সময় নেয়। সময়ের সাথে সাথে গোস্ট ক্লিনআপ প্রক্রিয়া আবর্জনা এই ভুতুড়ে রেকর্ডগুলি সংগ্রহ করবে এবং কেবলমাত্র ভূত রয়েছে এমন পৃষ্ঠাগুলি সরিয়ে ফেলবে এবং আপনার SELECT গুলি গতি বাড়িয়ে দেবে। তবে এখনই আপনি Skipped Ghosted Records/secযদি পারফোন চেক করেন তবে সম্ভবত সম্ভবত আকাশ ছোঁয়া আছে SELECT COUNT(*)। এছাড়াও আপনি টেবিল পুনঃ নির্মাণের দ্বারা গতিমান পারে: ALTER TABLE ... REBUILD

TRUNCATE এই সমস্যাটিরও যত্ন নেওয়া হত, কারণ এটি কোনও ভূতকে পেছনে ফেলে না।

স্টোরেজ ইঞ্জিনের অভ্যন্তরেও দেখুন : গভীরতার সাথে ভূত পরিষ্কার করুন


13

DELETEবিবৃতিগুলি একবারে একটি সারণি থেকে সারি মুছে দেয়, প্রতিটি সারি লগ ইন করে transaction logপাশাপাশি log sequence number (LSN)তথ্য বজায় রাখে । যেহেতু আপনি উল্লেখ করেছেন যে আপনার টেবিলটিতে বিশাল ডেটা রয়েছে (12 মিলিয়ন রেকর্ডস), মুছে ফেলার পরে যা আপনার হার্ডডিস্কের অভাব রয়েছে, তাই আপনার ডাটাবেস লগ ফাইলের আকার পরীক্ষা করে দেখুন। এটি সম্ভবত সবচেয়ে বড় হতে পারে।

একটি ভাল উপায় হতে পারে:

TRUNCATE TABLE_NAME

2
+1, ওরাকল ডিবি-তে ঠিক একই সত্য। আপনি যদি বিবৃতি ব্যবহার করে যা লগ হওয়ার রেকর্ড সৃষ্টি করে এটি সময়ের সাথে সাথে ডাটাবেসকে ধীর করে দেবে।
পেট্রো Semeniuk

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

3

(এটি মূলত @ ডেভির উত্তরের মন্তব্য ছিল, তবে আমি এটির নিজের উত্তরে রেখেছি কারণ এটি দীর্ঘ হয়ে গেছে)

TRUNCATE হয় একটি লগ অপারেশন। এটি অন্যথায় এটি এসিডি-কমপ্লায়েন্ট নয়। তবে TRUNCATEএবং এর মধ্যে পার্থক্য DELETE:

  • লগ স্পেসের ব্যবহার: TRUNCATEকেবলমাত্র লগগুলি পৃষ্ঠা / এক্সটেনটগুলি * মুক্ত করা হয়, তবে DELETEপৃথক সারিগুলিকে লগ করে।
  • লক ব্যবহার: TRUNCATEসাধারণত কম লক ব্যবহার করা হবে, যেহেতু এটি একটি টেবিল লক এবং পৃষ্ঠা লক নেয়, DELETEযার বিপরীতে সারি লকগুলি ** ব্যবহৃত হয়।
  • IDENTITYসিকোয়েন্সগুলি: TRUNCATEউপস্থিত থাকলে কোনও টেবিলে পরিচয় ক্রমটি পুনরায় সেট করে।

(* একটি মাত্রা = 8 পৃষ্ঠাগুলি। TRUNCATEতারা যদি সমস্ত এক টেবিল থেকে থাকে তবে লগগুলি লগ / সরিয়ে ফেলবে, অন্যথায় এটি মিশ্র এক্সটেন্টগুলি থেকে পৃষ্ঠাগুলি লগ / সরিয়ে ফেলবে।

** এর এক পার্শ্ব প্রতিক্রিয়া হ'ল DELETE FROM TABLEঅপারেশনটি একচেটিয়া টেবিল লক পেতে পারে কি না তার উপর নির্ভর করে টেবিলের জন্য বরাদ্দ করা খালি পৃষ্ঠাগুলি সম্ভাব্যভাবে ছেড়ে দিতে পারে))

সুতরাং (মূল প্রশ্নের কাছে ফিরে যান), আপনি যদি টেবিলটি ফাঁকা করে রাখেন তবে কাঠামোটি রাখতে চান (এনবি: অন্য টেবিলে বিদেশী কী দ্বারা উল্লেখ করা টেবিলে ব্যবহার করা যাবে না ) TRUNCATE TABLEতার চেয়ে শেষ পর্যন্ত ভাল ।DELETE FROM TABLETRUNCATE

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

অবশেষে, আরেকটি বিষয় সম্পর্কে সচেতন হতে হবে - সারণী পরিসংখ্যান। চালানোর UPDATE STATISTICS <TABLENAME>' aftertruncate /DELETE` তাই ক্যোয়ারী অপ্টিমাইজার পুরাতন পরিসংখ্যান দ্বারা আপ হোঁচট খেয়েছি না হয়ে যায়।


2

(দ্রষ্টব্য: আমি ডিবিএ নই) ডিলিট একটি লগড অপারেশন, এবং এটি ব্যবহৃত স্থানটি মুক্ত করে না। আপনার কাছে সম্ভবত একটি বৃহত্তর লেনদেন লগ রয়েছে যা ফাঁকা এবং টেবিল স্ক্যানগুলি 'খালি' টেবিলের জায়গাতে চলছে। আমি অনুমান করব যে আপনার লেনদেনের লগ সাফ করা এবং আপনার ডাটাবেস সঙ্কুচিত করা দরকার। এই স্ট্যাকওভারফ্লো নিবন্ধটি আপনাকে শুরু করা উচিত।

আপনি যখন ভবিষ্যতে এটি করতে চান তখন ট্র্যাঙ্কেট টেবিলটি ব্যবহার করুন।

সম্পাদনা: লগ করা হচ্ছে না ট্রানসেট সম্পর্কে আমার বিবৃতি ভুল ছিল। সরানো হয়েছে।

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