আমি কীভাবে এসকিউএল সার্ভারকে আমার ইনডেক্সড ভিউ কলামটি নাল-সক্ষম নয় তা সনাক্ত করতে সহায়তা করতে পারি?


9

আমার এসকিউএল সার্ভার ২০০৮-এ নিম্নলিখিত সূচকযুক্ত সংজ্ঞাটি সংজ্ঞায়িত করা হয়েছে ( পরীক্ষার উদ্দেশ্যে আপনি জিস্ট থেকে একটি ওয়ার্কিং স্কিমা ডাউনলোড করতে পারেন ):

CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
      user_id
    , currency_id

    , SUM(transaction_amount)   AS balance_amount
    , COUNT_BIG(*)              AS transaction_count
FROM dbo.transactions
GROUP BY
      user_id
    , currency_id
;
GO

CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
      user_id
    , currency_id
);
GO

user_id, currency_idএবং transaction_amountসমস্ত NOT NULLকলাম হিসাবে সংজ্ঞায়িত করা হয় dbo.transactions। যাইহোক, আমি যখন ম্যানেজমেন্ট স্টুডিওর অবজেক্ট এক্সপ্লোরারে ভিউ সংজ্ঞাটি দেখি, তখন এটি ভিউটিতে উভয় balance_amountএবং transaction_countহিসাবে উপযুক্ত NULLকলাম চিহ্নিত করে ।

আমি বিভিন্ন আলোচনা কটাক্ষপাত গ্রহণ করেছি, এই এক তাদের অধিকাংশই প্রাসঙ্গিক হচ্ছে, যে ফাংশন কিছু প্রকাশের shuffling সুপারিশ সাহায্য করতে পারে SQL সার্ভার স্বীকার করি যে একটি দৃশ্য কলাম সর্বদা NOT NULL। আমার ক্ষেত্রে এ জাতীয় কোনও বদলানো সম্ভব নয়, যদিও সামগ্রিক ফাংশনগুলিতে (যেমন একটি ISNULL()ওভার SUM()) ইন্ডেক্সড ভিউগুলিতে অনুমোদিত নয়

  1. কোনো উপায় আছে আমি সাহায্য করতে SQL সার্ভার যে চিনতে হয় balance_amountএবং transaction_countহয় NOT NULL-able?

  2. যদি তা না হয় তবে এই কলামগুলি ভুলভাবে কার্যকর হিসাবে চিহ্নিত হওয়ার বিষয়ে আমার কি কোনও উদ্বেগ থাকতে হবে NULL?

    যে দুটি উদ্বেগ আমি ভাবতে পারি তা হ'ল:

    • ব্যালান্স ভিউতে ম্যাপযুক্ত কোনও অ্যাপ্লিকেশন অবজেক্ট একটি ভারসাম্যের একটি ভুল সংজ্ঞা পাচ্ছে।
    • খুব সীমাবদ্ধ ক্ষেত্রে, ক্যোরি অপটিমাইজারের কাছে নির্দিষ্ট কিছু অপ্টিমাইজেশন উপলব্ধ নয় কারণ এই দুটি কলামের দৃষ্টিভঙ্গির কোনও গ্যারান্টি নেই NOT NULL

    এই উদ্বেগগুলির মধ্যে একটিই কি বড় কথা? আমার মনে রাখা উচিত অন্য কোন উদ্বেগ আছে?


হ্যাঁ উদ্বেগ রয়েছে, উদাহরণস্বরূপ আপনার ওআরএম অপ্রয়োজনীয় প্রকারগুলি তৈরি করবে, এগুলি ব্যবহার করার সময় কোডে অতিরিক্ত যত্নের প্রয়োজন হবে যা আপনার ক্ষেত্রে অকেজো (বা এমনকি বিভ্রান্তিমূলক) is
মার্সেল

এটি একটি অ-পুনঃসারণযোগ্য ক্ষেত্রের (যখন কোনও সমষ্টিগত নয়) পুনরাবৃত্তি করার সময় পুনরাবৃত্তমান সিটি-তে একটি সমস্যা হিসাবে দেখা যায় যদিও শেষে ইসনুল (..., 0) নিরাময় করতে পারে।
ক্রোকুসেক

উত্তর:


10

user_id, currency_idএবং transaction_amountসমস্ত NOT NULLকলাম হিসাবে সংজ্ঞায়িত করা হয়dbo.transactions

এটি দেখে মনে হচ্ছে যে এসকিউএল সার্ভারের একটি কম্বল অনুমান রয়েছে যে nullএটি দ্বারা পরিচালিত ক্ষেত্র (গুলি) থাকলেও একটি সামগ্রিক একটি উত্পাদন করতে পারে not null। এটি কিছু ক্ষেত্রে স্পষ্টতই সত্য:

create table foo(bar integer not null);
select sum(bar) from foo
-- returns 1 row with `null` field

এবং group byপছন্দ মতো সাধারণ সংস্করণেও এটি সত্যcube

এই সহজ পরীক্ষার কেসটি বিন্দুটিকে ব্যাখ্যা করে যে কোনও সংখ্যককে হ্রাসযোগ্য হিসাবে ব্যাখ্যা করা হয়:

CREATE VIEW dbo.balances
with schemabinding
AS
SELECT
      user_id
    , sum(1)   AS balance_amount
FROM dbo.transactions
GROUP BY
      user_id
;
GO

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


যদি কলামটির শূন্যতাটি গুরুত্বপূর্ণ হয়, সম্ভবত কোনও ওআরএম ব্যবহারের জন্য, সূচী দৃষ্টিভঙ্গিটিকে অন্য দৃশ্যে মোড়ানো বিবেচনা করুন যা কেবলমাত্র নন-অযোগ্যতার গ্যারান্টি ব্যবহার করে ISNULL:

CREATE VIEW dbo.balancesORM
WITH SCHEMABINDING
AS
SELECT 
    B.[user_id],
    B.currency_id,
    balance_amount = ISNULL(B.balance_amount, 0),
    transaction_count = ISNULL(B.transaction_count, 0)
FROM dbo.balances AS B;

এসএসএমএস অবজেক্ট এক্সপ্লোরার বিশদ


5

আমি মনে করি না যে কোনও উপায়ে এসকিউএল সার্ভারকে এই কলামগুলিকে স্পষ্টভাবে অযোগ্য না হলেও সনাক্তযোগ্য নয় হিসাবে সনাক্ত করতে বাধ্য করতে পারেন। আপনি কীভাবে অভ্যন্তরের অভিব্যক্তিটিকে ISNULL/ এর COALESCEআশেপাশে সংজ্ঞায়িত করার ক্রমটি পরিবর্তন করার চেষ্টা করতে পারেন , উদাহরণস্বরূপ, তবে এটি কোনও সাহায্য করবে না। SUM()

আপনি যে কোনও অপ্টিমাইজেশন মিস করতে চলেছেন সেগুলিও আমি বিশ্বাস করি না - সেগুলি কলামগুলি বর্তমানে সূচিযুক্ত নয়, সুতরাং এটি অপটিমাইজারের মতো নয় যে সমস্ত balance_amountমান> 10000 নির্ধারণ করতে, আলাদা এক্সেস পদ্ধতি বেছে নিতে পারে There সেখানে এমন একটি পরিস্থিতি হতে পারে যেখানে আপনি যদি এই কলামগুলির মধ্যে একটিতে একটি ক্লাস্টারযুক্ত সূচক তৈরি করেন তবে সূচকটি না থাকলে আপনি কিছুটা ভাল অনুমান করতে পারেন, তবে এর নূন্যতার সাথে কিছুই করার নেই।

পারফরম্যান্সের দৃষ্টিকোণ থেকে আমি এ নিয়ে খুব বেশি চিন্তিত হব না। আমি পিছনে ফিরে গিয়েছিলাম এবং কয়েক বছর ধরে তৈরি হওয়া সূচী দর্শনগুলির একগুচ্ছ দিকে লক্ষ্য করেছি এবং এই সমষ্টি কলামগুলি সমস্ত নাকাল। তারা ঠিক সূক্ষ্ম পারফরম্যান্স।

অবজেক্ট ম্যাপিং যতদূর যায় আবার, আমি এটি সম্পর্কে খুব বেশি চিন্তিত হব না। যেহেতু অ্যাপ্লিকেশনটি সূচিবদ্ধ ভিউ আপডেট করতে পারে না, তাই এটি এটি balance_amountহতে পারে বলে মনে করে তা বিবেচ্য নয় null। এটি কখনই একটি গ্রহণ nullকরবে না, এবং এটি একটি লেখার চেষ্টা করতে পারে না null, তাই <shrug>



অ্যারোন, অবজেক্ট ম্যাপিং সম্পর্কে: আমি এটি দেখার মতো বিবেচনা করি, যেহেতু একটি ম্যাপার সম্ভবত অযোগ্য প্রকারের সাথে অকেজো / বিভ্রান্তিকর বস্তু উত্পন্ন করবে যা সত্যই কখনও ব্যবহৃত হবে না।
মার্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.