ডাটাবেস_স্কেপড_ কনফিগারেশনে বাগ


9

আমি ফলাফলটি সেট থেকে sertোকানোর চেষ্টা করছি:

SELECT * FROM sys.database_scoped_configurations

একটি টেম্প টেবিলের মধ্যে, কারণ আমি আমার সার্ভারে সমস্ত ডাটাবেসের জন্য সেটিংস পরীক্ষা করতে চাই। সুতরাং আমি এই কোড লিখেছি:

DROP TABLE IF EXISTS #h
CREATE TABLE #h(dbname sysname, configuration_id INT, name sysname,     value SQL_VARIANT,  value_for_secondary SQL_VARIANT)
EXEC sys.sp_MSforeachdb 'USE ?; insert into #h(dbname, configuration_id, name, value,value_for_secondary)  SELECT ''?'' as dbname, * FROM sys.database_scoped_configurations  D'
SELECT * FROM #h H

তবে তখন প্রতি ডাটাবেসটিতে কেবল একটি সারি থাকবে, চারটি সারি নয় যা আমি প্রত্যাশা করি প্রতিটি ডাটাবেজে একটি সরল নির্বাচন চালানোর মাধ্যমে।

আমি জানি যে এসপিএসএসএমএসএফডিবি ব্যবহার করার চেয়ে কোড করার আরও ভাল উপায় আছে এবং আমি বেশ কয়েকটি চেষ্টা করেছি। তবে আমি এখনও ডাটাবেস অনুযায়ী কেবল একটি সারি পাই। আমি এটি এসকিউএল সার্ভার 2016 আরটিএম এবং এসপি 1 উভয়ই দিয়ে দেখেছি

এটি কি এসকিউএল সার্ভার 2016 এর সাথে একটি বাগ, বা আমি কিছু ভুল করছি?


কমপক্ষে মাইক্রোসফ্ট এসকিউএল সার্ভার 2017 (আরটিএম-সিইউ 15-জিডিআর)
হেনরিক

উত্তর:


8

এটি কি এসকিউএল সার্ভার 2016 এর সাথে একটি বাগ আছে?

হ্যাঁ. অবশ্যই এটি সঠিক আচরণ নয়। আমি এখানে রিপোর্ট করেছেন এবং হয় SQL সার্ভার 2016 জন্য SP2 CU9 সংশোধন

হিসাবে Mikael এরিকসন মন্তব্য বলছেন sys.database_scoped_configurationsএবং sys.dm_exec_sessionsবিন্যাসে মতামত হিসাবে প্রয়োগ করা হয়

SELECT ...  
FROM OpenRowset(TABLE xxxx)  

তবে নীচে দুটি পরিকল্পনার তুলনা করলে সুস্পষ্ট পার্থক্য রয়েছে।

DBCC TRACEON(3604);

DECLARE @database_scoped_configurations TABLE(x INT);

INSERT INTO @database_scoped_configurations
SELECT configuration_id
FROM   sys.database_scoped_configurations
OPTION (QUERYTRACEON 8608, QUERYTRACEON 8615, QUERYTRACEON 8619, QUERYTRACEON 8620 );


DECLARE @dm_exec_sessions TABLE(x INT);

INSERT INTO @dm_exec_sessions
SELECT session_id
FROM   sys.dm_exec_sessions
OPTION (QUERYTRACEON 8608, QUERYTRACEON 8615, QUERYTRACEON 8619, QUERYTRACEON 8620 );

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

এই উভয় কোয়েরি শোতে ফ্ল্যাগ 8619 আউটপুট

বিধি প্রয়োগ করুন: এনফোর্সএইচপ্যান্ডএসিসিকার্ড - x0-> স্পুল বা শীর্ষ (x0)

এসকিউএল সার্ভার দৃশ্যত এটি নির্ধারণ করতে সক্ষম হয় না যে টিভিএফের উত্সটিও সন্নিবেশ লক্ষ্য নয় তাই এর জন্য হ্যালোইন সুরক্ষা প্রয়োজন।

সেশনের ক্ষেত্রে এটি একটি স্পুল হিসাবে প্রয়োগ করা হয়েছিল যা প্রথমে সমস্ত সারিগুলিকে ক্যাপচার করে। ইন database_scoped_configurationsএকটি যোগ করে TOP 1পরিকল্পনা। এই নিবন্ধেTOP হ্যালোইন সুরক্ষার জন্য ব্যবহার সম্পর্কে আলোচনা করা হয়েছেTOPপ্রত্যাশার পরিবর্তে স্পুলকে চাপ প্রয়োগ করার জন্য একটি অনিবন্ধিত ট্রেস পতাকা উল্লেখ করা হয়েছে ।

DECLARE @database_scoped_configurations TABLE(x INT);

INSERT INTO @database_scoped_configurations
SELECT configuration_id
FROM   sys.database_scoped_configurations
OPTION (QUERYTRACEON 8692)

TOP 1স্পুলের পরিবর্তে ব্যবহার করার ক্ষেত্রে একটি স্পষ্ট সমস্যা হ'ল এটি নির্বিচারে সন্নিবেশ করা সারিগুলির সংখ্যা সীমাবদ্ধ করবে। সুতরাং এটি কেবলমাত্র বৈধ হবে যদি ফাংশনটি দিয়ে ফিরে আসা সারির সংখ্যা <= 1 হয়।

প্রাথমিক মেমো এটির মতো দেখাচ্ছে

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

কোয়েরি 2 এর জন্য প্রাথমিক মেমোটির সাথে এটি তুলনা করুন

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

আমি যদি উপরেরটি সঠিকভাবে বুঝতে পারি তবে এটি মনে করে যে প্রথম টিভিএফ সর্বাধিক এক সারিতে ফিরিয়ে দিতে পারে এবং তাই একটি ভুল অনুকূলকরণ প্রয়োগ করে। দ্বিতীয় ক্যোয়ারির জন্য সর্বোচ্চটি সেট করা হয়েছে 1.34078E+154( 2^512)।

এই সর্বাধিক সারি গণনাটি কোথা থেকে এসেছে তা আমার কোনও ধারণা নেই। সম্ভবত মেটাডাটা সরবরাহ করেছেন ডিএমভির লেখক? এটিও আজব যে, TOP(50)কাজটি আবার লিখিত হয় না TOP(1)কারণ TOP(50)হ্যালোইন সমস্যাটি ঘটতে বাধা দেয় না (যদিও এটি অনির্দিষ্টকালের জন্য অব্যাহত রাখবে)


6

দয়া করে ব্যবহার বন্ধ করুন sp_MSForEachDB। এটি অসমর্থিত, অপ্রকাশিত এবং এটি বগি - যা এখানে সমস্যা হতে পারে। আমার প্রতিস্থাপনটি এখানে একই সমস্যাটি দেখায় তবে সাধারণভাবে এটি ব্যবহার করা নিরাপদ।

এই জাতীয় জিনিসের জন্য আমি একাধিক বার কার্যকর করার জন্য একটি পদ্ধতিতে একক কমান্ড দেওয়ার চেয়ে গতিশীল এসকিউএল উত্সাহিত করতে পছন্দ করি (এমনকি আমার পদ্ধতি, যা আমি আরও অনেক বেশি বিশ্বাস করি), এইভাবে আমি কমান্ডগুলি কার্যকর করার পরিবর্তে প্রিন্ট করতে পারি এবং তারা সকলেই যা বলে তা নিশ্চিত করে নিন।

সিস্টেম ভিউয়ের অন্তর্নিহিত কোডটি একটি প্রয়োগ করে এমন পর্যবেক্ষণ থেকে ধার করে TOP (1)আমরা এইভাবে চেষ্টা করতে পারি:

DROP TABLE IF EXISTS #h;

CREATE TABLE #h(dbname sysname, configuration_id INT, name sysname, 
  value SQL_VARIANT,  value_for_secondary SQL_VARIANT);

DECLARE @sql nvarchar(max) = N'', @base nvarchar(max) = N'insert into #h
  (dbname, configuration_id, name, value,value_for_secondary)  SELECT TOP ($c$) 
  $db$ as dbname, * FROM $qdb$.sys.database_scoped_configurations;';

SELECT @sql += REPLACE(REPLACE(REPLACE(@base, N'$qdb$', QUOTENAME(name)), 
  N'$db$', CHAR(39) + name + CHAR(39)), N'$c$', RTRIM(COUNT(*) OVER()))
FROM sys.databases WHERE state = 0;

PRINT @sql;
EXEC sys.sp_executesql @sql;
SELECT * FROM #h;

লক্ষ্য করুন যে আমি USEএখানে ব্যবহার করি না , বরং sysডাটাবেসের নামের সাথে ক্যাটালগ ভিউ উপসর্গ করে ।

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


আমি চেষ্টা করা কয়েকটি পদ্ধতির মধ্যে এটিই প্রথম ছিল, তবে আমি মনে করি না যে উদাহরণটিতে আমি সেই স্প্রোকটি ব্যবহার করতে পারি।
হেনরিক স্টাউন পুলসন

6

এই সমস্যাটি রিপোর্ট করার জন্য আপনাকে ধন্যবাদ!

ক্যোরি অপ্টিমাইজার sys.database_scoped_configurationsক্যাটালগ দর্শনটির জন্য যে পরিকল্পনা তৈরি করে তাতে এটি অবশ্যই একটি বাগ । আমরা এসকিউএল সার্ভার ২০১ of এর পরবর্তী আপডেটগুলির একটিতে এবং অ্যাজুরে এসকিউএল ডেটাবেসগুলিতে এটিকে সম্বোধন করব।

কাজের পরিকল্পনা হিসাবে, আপনি সঠিক পরিকল্পনাটি পেতে আপনার sertোকানোর অংশে একটি TOPধারা যুক্ত করতে পারেন SELECT, যেমন:

DECLARE @database_scoped_configurations TABLE(x INT); 
INSERT INTO @database_scoped_configurations 
SELECT **TOP 100** configuration_id 
FROM sys.database_scoped_configurations 

3

আমি সম্মতি দিচ্ছি যে এটি খুব অদ্ভুত এবং সম্ভাব্য বাগ, তবে একটি টপ (50) যুক্ত করে উদাহরণস্বরূপ, আপনার নির্বাচিতটিতে আসলে সমস্ত সারি ফিরে আসে, যাতে কমপক্ষে আপনাকে যেতে দেওয়া হয়। ফলাফলটি কোনও সিস্টেমের সারণী মান ফাংশন ([DB_SCOPED_CONFIG]) থেকে আসছে বলে মনে হচ্ছে, তাই কী হচ্ছে তা আমি সত্যিই বলতে পারছি না।

'চৌকস' লোকেরা জানে যে এটি কেন ঘটছে তা দেখার জন্য আমি এই থ্রেডটিতে নজর রাখব।


আপনি কি প্রতিটি ডাটাবেসের জন্য কেবল ম্যাক্সডপ সারিটি পান?
ড্যান গুজম্যান

@ ডানগুজম্যান - হ্যাঁ নির্বাচিতরা নিজেই ঠিক কাজ করে (সমস্ত ফোরচ স্টাফ ছাড়াই, কেবল একটি ডাটাবেসে)। এটি যখন আপনি সন্নিবেশ যুক্ত করেন যা অদ্ভুত আচরণ তৈরি করে
স্কট হজগিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.