ডিবিসিসি CHECKDB অনুপযুক্ত দুর্নীতি: সূচী দর্শনতে এমন সারি রয়েছে যা দর্শন সংজ্ঞা দ্বারা উত্পাদিত হয়নি


14

টিএল; ডিআর: আমি একটি সূচিযুক্ত দৃশ্যে একটি অব্যর্থ দুর্নীতি পেয়েছি। বিশদটি এখানে:


চলমান

DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS

আমার ডাটাবেসের একটিতে নিম্নলিখিত ত্রুটি তৈরি করে:

এমএসজি 8907, স্তর 16, রাজ্য 1, লাইন 1 স্থানিক সূচক, এক্সএমএল সূচক বা সূচিযুক্ত ভিউ 'ভিউনাম' (অবজেক্ট আইডি 784109934) এ সারি রয়েছে যা দর্শন সংজ্ঞা দ্বারা উত্পাদিত হয়নি। এটি অগত্যা এই ডেটাবেজে ডেটা সহ কোনও সততার ইস্যু উপস্থাপন করে না। (...)

'ভিউনাম' সারণীতে CHECKDB 0 টি বরাদ্দ ত্রুটি এবং 1 ধারাবাহিক ত্রুটি খুঁজে পেয়েছে।

মেরামত_পরিচালনা সর্বনিম্ন মেরামতের স্তর (...)।

আমি বুঝতে পারি যে এই বার্তাটি সূচিত ভিউ 'ভিউনাম' এর বস্তুগত ডেটা অন্তর্নিহিত ক্যোয়ারী যা তৈরি করে তার সাথে এক নয় indicates তবে, ম্যানুয়ালি ডেটা যাচাই করা কোনও তাত্পর্যপূর্ণ করে না:

SELECT * FROM ViewName WITH (NOEXPAND)
EXCEPT
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...

SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
EXCEPT
SELECT * FROM ViewName WITH (NOEXPAND)

NOEXPANDউপর (শুধুমাত্র) সূচকটি জোর করে ব্যবহার করতে ব্যবহৃত হয়েছিল ViewNameFORCESCANইনডেক্সড ভিউয়ের ম্যাচটি ঘটতে বাধা দিতে ব্যবহৃত হয়েছিল। কার্যকর করার পরিকল্পনা উভয় পদক্ষেপের কাজ করার বিষয়টি নিশ্চিত করে।

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

দৃশ্যে সূচি পুনরায় তৈরি করে বা চালিয়ে ত্রুটি ঠিক করা যায় নাDBCC CHECKDB REPAIR_ALLOW_DATA_LOSS । ফিক্সগুলি পুনরাবৃত্তি করাও কোনও লাভ হয়নি। কেন DBCC CHECKDBএই ত্রুটিটি রিপোর্ট করে ? কীভাবে এ থেকে মুক্তি পাবেন?

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


আপডেট: কিছু রিলিজে বাগটি ঠিক করা হয়েছে। আমি আর SQL সার্ভার এটা প্রজনন করতে পারে 2014 জন্য SP2 চবি 5. 2014 জন্য SP2 কিলোবাইট কিলোবাইট আর্টিকেল ব্যতিরেখে একটি ফিক্স রয়েছে: Creating non-clustered index causes DBCC CheckDB With Extended_Logical_Checks to raise corruption error। এটি সম্পর্কে দুটি সংযুক্ত বাগ বন্ধ করা হয়েছে:


1
আপনি কি বলছেন যে আপনি ভিউতে সূচিটি বাদ দিয়ে আবার তৈরি করেছেন এবং ডিবিসিসি CHECKDB এখনও একই ত্রুটিটি রিপোর্ট করে? স্ক্র্যাচ থেকে ভিউ বাদ দেওয়ার এবং এটিকে তৈরি করার বিষয়ে কী?
অ্যারন বারট্র্যান্ড

বিওএল থেকে : সূচীিত ভিউগুলিতে ডিবিসিসির ত্রুটিগুলির সমস্যা সমাধানের জন্যIf the indexed view does not contain an aggregate over values of type float or real and you receive errors 8907 or 8708, drop the index on the view and re-create it. Do not use ALTER INDEX REBUILD to try to remove the differences between the stored and the computed view, because ALTER INDEX REBUILD does not recalculate the view before rebuilding the index. Then run DBCC CHECKTABLE on the View to verify no differences remain.
কিন শাহ

@ কিন আমি আপনার মন্তব্য সম্পাদনা করেছি। [1]স্বরলিপি মন্তব্য চিহ্ন-ডাউন মধ্যে কাজ করে না।
অ্যারন বার্ট্র্যান্ড

আমি সবকিছু পুনরায় তৈরি। আমি ডিবিসিসি CHECKDB কে REPAIR_ALLOW_DATA_LOSS চালাতে দিই। এটি বলেছে যে এটি দর্শনটি পুনর্নির্মাণ করেছে, কিন্তু তারপরে এটি একই ত্রুটির কথা জানিয়েছে।
usr ডিরেক্টরির

আপনি কি ভিউ সংজ্ঞাটি প্রদর্শন করতে পারেন (যদি এখানে খুব দীর্ঘ হয় তবে কোনও পেস্টবিনে থাকে)?
অ্যারন বার্ট্র্যান্ড

উত্তর:


14

কোয়েরি প্রসেসরটি ডিবিসিসি দ্বারা উত্পাদিত (সঠিক) কোয়েরির জন্য একটি অবৈধ নির্বাহের পরিকল্পনা তৈরি করতে পারে যা দেখার সূচকটি অন্তর্নিহিত ভিউ ক্যোয়ারির মতো একই সারিগুলি উত্পাদন করে।

ক্যোয়ারী প্রসেসর দ্বারা উত্পাদিত পরিকল্পনাটি কলামটির NULLsজন্য ভুলভাবে পরিচালনা করে ImageObjectID। এটি ভুলভাবে কারণ দেয় যে ভিউ কোয়েরিটি NULLsএই কলামটির জন্য প্রত্যাখ্যান করে , যখন এটি না করে। NULLsবাদ দেওয়া হয়েছে এমন ভেবে , এটি Usersযে ফিল্টারটি ফিল্টার করে তাতে টেবিলে ফিল্টার করা নন-ক্ল্লাস্টার্ড সূচকটি মেলাতে সক্ষম ImageObjectID IS NOT NULL

একটি পরিকল্পনা এই ফিল্টার সূচক ব্যবহার করে উৎপাদন, এটি সঙ্গে যে সারি নিশ্চিত NULLমধ্যে ImageObjectIDসম্মুখীন করা হয় না। এই সারিগুলি ভিউ সূচক থেকে (সঠিকভাবে) ফেরত দেওয়া হয়েছে, সুতরাং যখন এটি না থাকে তখন দুর্নীতি দেখা দেয়।

দর্শন সংজ্ঞাটি হ'ল:

SELECT
    dbo.Universities.ID AS Universities_ID, 
    dbo.Users.ImageObjectID AS Users_ImageObjectID
FROM dbo.Universities
JOIN dbo.Users
    ON dbo.Universities.AdminUserID = dbo.Users.ID

এই কলামগুলিতে ONক্লজ সমতা তুলনা AdminUserIDএবং IDপ্রত্যাখ্যান করে NULLs, কিন্তু ImageObjectIDকলাম থেকে নয় ।

ডিবিসিসি উত্পাদিত ক্যোয়ারির অংশটি হ'ল:

SELECT [Universities_ID], [Users_ImageObjectID], 0 as 'SOURCE'
FROM [dbo].[mv_Universities_Users_ID] tOuter WITH (NOEXPAND) 
WHERE NOT EXISTS
( 
    SELECT 1 
    FROM   [dbo].[mv_Universities_Users_ID] tInner
    WHERE 
    (
        (
            (
                [tInner].[Universities_ID] = [tOuter].[Universities_ID]
            ) 
            OR 
            (
                [tInner].[Universities_ID] IS NULL
                AND [tOuter].[Universities_ID] IS NULL
            )
        )
        AND
        (
            (
                [tInner].[Users_ImageObjectID] = [tOuter].[Users_ImageObjectID]
            ) 
            OR 
            (
                [tInner].[Users_ImageObjectID] IS NULL 
                AND [tOuter].[Users_ImageObjectID] IS NULL
            )
        )
    )
)
OPTION (EXPAND VIEWS);

এটি জেনেরিক কোড যা NULLআওয়ারে ফ্যাশনে মানগুলির তুলনা করে । এটি অবশ্যই ভার্বোজ, তবে যুক্তি ঠিক আছে।

ক্যোয়ারী প্রসেসরের যুক্তিযুক্ত বাগের অর্থ হল যে কোনও ক্যোয়ারী প্ল্যান যা ভুলভাবে ফিল্টারড সূচক ব্যবহার করে তা উত্পাদিত হতে পারে, উদাহরণস্বরূপ নীচের পরিকল্পনার অংশটি যেমন:

ভ্রান্ত পরিকল্পনা

ডিবিসিসি কোয়েরি ব্যবহারকারীর ক্যোয়ারী থেকে ক্যোয়ারী প্রসেসরের মাধ্যমে একটি আলাদা কোডের পথ নেয়। এই কোড পাথটিতে বাগ রয়েছে। যখন ফিল্টারড সূচক ব্যবহার করে কোনও পরিকল্পনা তৈরি করা হয়, তখন USE PLANকোনও ব্যবহারকারী ডাটাবেস সংযোগ থেকে জমা হওয়া একই ক্যোয়ারী পাঠ্যের সাহায্যে সেই পরিকল্পনার আকারটি জোর করার ইঙ্গিত দিয়ে এটি ব্যবহার করা যায় না ।

প্রধান অপ্টিমাইজার কোড পাথ (ব্যবহারকারীর প্রশ্নের জন্য) এই বাগটি ধারণ করে না, সুতরাং এটি ডিবিসিসি দ্বারা উত্পাদিত অভ্যন্তরীণ প্রশ্নের সাথে সুনির্দিষ্ট।


আমি এসকিউএল প্রোফাইলার শোপ্ল্যান এক্সএমএল ইভেন্টে ত্রুটিপূর্ণ পরিকল্পনাটি দেখতে পাচ্ছি। আমি উত্তর হিসাবে চিহ্নিত করব।; কেন ডিবিসিসি সাধারণ ক্যোয়ারী প্রসেসরের চেয়ে আলাদাভাবে ক্যোয়ারী তৈরি করে ?; আমি এই উত্তরের সাথে সংযোগ আইটেমটিতে একটি লিঙ্ক যুক্ত করব।
usr ডিরেক্টরির

2
@ ইউএসআর ডিবিসিসি এমন সব ধরণের কাজ করে যা কোনও ব্যবহারকারী সংযোগ থেকে সম্ভব হয় না। আমি ভাবছি এটি এটি এইভাবে কাজ করে কারণ এটি রয়েছে তবে আপনি পল রান্ডালের মতো কাউকে অবশ্যই এর সঠিক বিবরণ পেতে চাইতে হবে। অবশ্যই তিনি বলার মতো স্বাধীনতা বোধ করবেন না। আমি জানি যে ডিবিসিসির বাইরে প্রচুর জিনিস রয়েছে যা এমনকি অদ্ভুত জিনিসগুলি করে; কেউ কেউ একেবারে অপ্টিমাইজারের মাধ্যমে না গিয়ে একটি কার্যকরকরণ পরিকল্পনাও তৈরি করে!
পল হোয়াইট 9

6

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

ডাটাবেস স্কিমা দিয়ে খেললে বাগটি আড়াল করা যায়। কোনও সম্পর্কযুক্ত ফিল্টারড সূচক মুছে ফেলা বা ফিল্টার অপসারণ করে বাগটি লুকিয়ে রাখে। বিশদ জন্য দয়া করে সংযোগ আইটেম দেখুন।

সংযুক্ত আইটেমটিতে অভ্যন্তরীণ কোয়েরিও রয়েছে যা DBCC CHECKDB দেখার বিষয়বস্তু যাচাই করতে ব্যবহার করে। এটি কোনও ত্রুটিযুক্ত দেখায় কোনও ফলাফল দেয় না।

কিছু রিলিজে বাগ ঠিক করা হয়েছে। আমি আর এটি এসকিউএল সার্ভার 2014 এসপি 2 সিইউ 5 তে পুনরুত্পাদন করতে পারি না।


ত্রুটিটি পুনরুত্পাদন করার জন্য প্রচুর (উত্পাদন) ডেটা প্রয়োজন ছিল (যা আরও প্রমাণ হিসাবে পরিকল্পনা পরিবর্তনের কারণ হতে পারে)। আমি প্রতিটি টেবিল থেকে দুটি কলাম বাদে সমস্ত মুছতে সক্ষম হয়েছি যদিও আমি ডেটা প্রকাশ করতে স্বাচ্ছন্দ্য বোধ করি না। আপনি যে ইস্যুটির সাথে সংযুক্ত হয়েছেন তার জন্য দৃষ্টিতে দুর্নীতির কারণ প্রয়োজন। আমি এই দৃশ্যটি পুনরায় তৈরি করেছি যাতে ডিএমএলের কারণে কোনও দুর্নীতির কারণ হতে পারে না; আপনি যদি এমন কোনও বিষয় সম্পর্কে সচেতন হন যা ডিবিসিসি CHECKDB এর অধীনে সাধারণ ক্যোয়ারী উইন্ডোর পরিবর্তে কোয়েরিটি চালিত হচ্ছে তবে ভিন্ন পরিকল্পনা তৈরি হতে পারে?
usr ডিরেক্টরির

একটি বেনামে ডাটাবেস সবেমাত্র আপলোড করা হয়েছে। এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা সমস্ত সূচি পুনর্নির্মাণ করে এবং দৃশ্যটি পুনরায় তৈরি করে: পেস্টবিন.com / জেপিএলইউ (সমস্ত কিছু পুনরায় সেট করতে এবং শারীরিক কাঠামো ঠিক আছে কিনা তা নিশ্চিত করার জন্য দরকারী)। অন্যান্য সহায়ক স্ক্রিপ্টগুলি: পেস্টবিন .com/ কেএক্সএনএসএমএম 2 জ স্ক্রিপ্টগুলি কেবল চালানো উচিত এবং সমস্যাটি অবিলম্বে তিরস্কার করা উচিত।
usr ডিরেক্টরির


-T272,4199,3604 সহ 11.0.3349 এ। 4199 সক্রিয় ক্যোয়ারী প্রসেসর ফিক্স। আমি এই টিএফ সরিয়েছি ;; হতে পারে আমাদের সঠিক জিজ্ঞাসা পরিকল্পনা প্ররোচিত করতে হবে। আমি এখন 1 জিবি র‌্যাম সেট করেছি এবং ইনস্ট্যান্সটি পুনরায় চালু করেছি (এটি ছিল 8 জিবি)। এটি এনএলজে-তে দেখা হয়ে যাওয়া দুটি সংযুক্তির মধ্যে একটির পরিবর্তিত হয়েছিল। এখনও তিরস্কার; কিছু পরিকল্পনার বৈচিত্রগুলি চেষ্টা করার জন্য আমি সারিগুলি যুক্ত এবং সরিয়ে দিয়েছি: পেস্টবিন. com/y972 এসএক্স 4 ডি কোয়ের অংশটির "বাম বিরোধী আধা সেমিন যোগ" অংশে যদি আমি একটি মার্জ জয়েন বা হ্যাশ পেয়েছি তবে বাগটি ট্রিগার বলে মনে হচ্ছে। এটি ব্যবহার করে দেখুন: ব্যবহারকারীদের সাথে 100k সারি যুক্ত করুন। এটি নির্ভরযোগ্যভাবে আমার জন্য একটি (সমান্তরাল) হ্যাশ যোগ দেয়।
usr ডিরেক্টরির

আমি কেবলমাত্র সংযুক্ত আইটেমটিতে "পরিকল্পনা.zip" আপলোড করেছি যাতে ডিবিসিসি CHECKDB ক্যোয়ারির জন্য বিভিন্ন মৃত্যুদণ্ডের পরিকল্পনা রয়েছে। বিশ্ববিদ্যালয়গুলিতে বিভিন্ন সারি গণনা সহ আমি কমপক্ষে তিনটি পৃথক পরিকল্পনা উত্পাদন করতে পারি। শুধুমাত্র লুপের সাথে পরিকল্পনার সাথেই সমস্যাটি ঘটে না। মার্জ এবং হ্যাশের সাথে বাগটি পুনরায় উত্পাদনযোগ্য o
usr ডিরেক্টরির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.