স্পষ্টতই, আমার সিএলআর বিধানসভা কার্য অচল করে দিচ্ছে?


9

আমাদের অ্যাপ্লিকেশনটির একটি ওরাকল ডাটাবেস বা একটি মাইক্রোসফ্ট এসকিউএল সার্ভার ডাটাবেসের সাথে সমানভাবে ভাল কাজ করা দরকার। এটির সুবিধার্থে, আমরা আমাদের ক্যোয়ারী সিনট্যাক্সকে একত্রিত করার জন্য একটি মুষ্টিমেয় ইউডিএফ তৈরি করেছি। উদাহরণস্বরূপ, এসকিউএল সার্ভারের GETDATE () রয়েছে এবং ওরাকল এর SYSDATE রয়েছে। তারা একই ফাংশন সম্পাদন করে তবে তারা বিভিন্ন শব্দ। আমরা উভয় প্ল্যাটফর্মের জন্য NOW () নামে একটি মোড়ক লিখেছিলাম যা একটি সাধারণ ফাংশনের নামে প্রাসঙ্গিক প্ল্যাটফর্মের নির্দিষ্ট সিনট্যাক্সকে মোড়ায় ps আমাদের অন্যান্য অন্যান্য ক্রিয়াকলাপ রয়েছে, যার মধ্যে কয়েকটি মূলত হোমোজনাইজেশনের জন্য কেবলমাত্র অস্তিত্বহীন। দুর্ভাগ্যক্রমে, এসকিউএল সার্ভারের জন্য এটির একটি ব্যয় রয়েছে। ইনলাইন স্কেলার ইউডিএফগুলি পারফরম্যান্সের জন্য সর্বনাশ করে এবং সমান্তরালতা সম্পূর্ণ অক্ষম করে। বিকল্প হিসাবে, আমরা একই লক্ষ্য অর্জনে সিএলআর অ্যাসেম্বলি ফাংশন লিখেছি। আমরা যখন এটি কোনও ক্লায়েন্টের কাছে নিযুক্ত করি তখন তারা ঘন ঘন অচলাবস্থা অনুভব করতে শুরু করে। এই নির্দিষ্ট ক্লায়েন্টটি প্রতিলিপি এবং উচ্চ প্রাপ্যতা কৌশলগুলি ব্যবহার করছে এবং আমি ভাবছি যে এখানে কোনও রকম মিথস্ক্রিয়া চলছে। আমি কেবল বুঝতে পারি না যে কীভাবে একটি সিএলআর ফাংশন প্রবর্তন করলে এই জাতীয় সমস্যার সৃষ্টি হবে। রেফারেন্সের জন্য, আমি আসল স্কেলার ইউডিএফ সংজ্ঞা পাশাপাশি প্রতিস্থাপন সিএলআর সংজ্ঞা সি # এবং এর জন্য এসকিউএল ঘোষণার অন্তর্ভুক্ত করেছি। আমার কাছে ডেডলক এক্সএমএলও রয়েছে যা আমি যদি সরবরাহ করতে পারি তবে তা যদি সহায়তা করে।

আসল ইউডিএফ

CREATE FUNCTION [fn].[APAD]
(
    @Value VARCHAR(4000)
    , @tablename VARCHAR(4000) = NULL
    , @columnname VARCHAR(4000) = NULL
)

RETURNS VARCHAR(4000)
WITH SCHEMABINDING
AS

BEGIN
    RETURN LTRIM(RTRIM(@Value))
END
GO

সিএলআর বিধানসভা ফাংশন

[SqlFunction(IsDeterministic = true)]
public static string APAD(string value, string tableName, string columnName)
{
    return value?.Trim();
}

সিএলআর ফাংশনের জন্য এসকিউএল সার্ভারের ঘোষণা

CREATE FUNCTION [fn].[APAD]
(
    @Value NVARCHAR(4000),
    @TableName NVARCHAR(4000),
    @ColumnName NVARCHAR(4000)
) RETURNS NVARCHAR(4000)
AS
EXTERNAL NAME ASI.fn.APAD
GO

9
নির্ধারিত স্কেলার সিএলআর ফাংশনগুলি ডেডলকগুলিতে অবদান রাখবে না। অবশ্যই সিএলআর ফাংশন যা ডাটাবেস পড়তে পারে। আপনার প্রশ্নের ডেডলক এক্সএমএল অন্তর্ভুক্ত করা উচিত।
ডেভিড ব্রাউন - মাইক্রোসফ্ট

উত্তর:


7

আপনি এসকিউএল সার্ভারের কোন সংস্করণ (গুলি) ব্যবহার করছেন?

আমি খুব বেশিদিন আগে এসকিউএল সার্ভার 2017 এ আচরণে সামান্য পরিবর্তন দেখে মনে করি। আমাকে ফিরে যেতে হবে এবং এটির একটি নোট আমি কোথায় পেয়েছি তা দেখতে পাবো কিনা, তবে আমি মনে করি যে এসকিউএলসিআরআর অবজেক্টটি অ্যাক্সেস করার সময় এটি একটি স্কিমা লকটি শুরু করা হয়েছিল।

আমি এটি সন্ধান করার সময়, আমি আপনার পদ্ধতির বিষয়ে নিম্নলিখিতটি বলব:

  1. অনুগ্রহ করে Sql*ইনপুট পরামিতিগুলির জন্য প্রকারগুলি ব্যবহার করুন return এর SqlStringপরিবর্তে আপনার ব্যবহার করা উচিত stringSqlStringএকেবারে নালাযুক্ত স্ট্রিংয়ের সাথে অনুরূপ (আপনার value?, তবে এটির মধ্যে অন্য কার্যকারিতা রয়েছে যা এসকিউএল সার্ভার-নির্দিষ্ট। সমস্ত Sql*প্রকারেরই এমন একটি Valueসম্পত্তি রয়েছে যা প্রত্যাশিত। নেট টাইপ (যেমন SqlString.Valueরিটার্ন string, SqlInt32রিটার্ন int, SqlDateTimeরিটার্ন DateTimeইত্যাদি) প্রদান করে।
  2. ডেডলকগুলি সম্পর্কিত কিনা তা আমি এই সম্পূর্ণ পদ্ধতির বিরুদ্ধে শুরু করার পরামর্শ দেব। আমি এটি বলছি কারণ:

    1. এমনকি নির্বাহী এসকিউএলসিআর ইউডিএফগুলি সমান্তরাল পরিকল্পনায় অংশ নিতে সক্ষম হয়েও আপনি সম্ভবত সরল বিল্ট-ইন ফাংশনগুলি অনুকরণের জন্য পারফরম্যান্স হিট পেতে চলেছেন।
    2. এসকিউএলসিএলআর এপিআই এর জন্য অনুমতি দেয় না VARCHAR। আপনি কি স্পষ্টভাবে সবকিছুতে রূপান্তরিত করার NVARCHARপরে ঠিকঠাক এবং আবার VARCHARসাধারণ ক্রিয়াকলাপের জন্য আবার ফিরে যান ?
    3. এসকিউএলসিএলআর এপিআই ওভারলোডিংয়ের অনুমতি দেয় না, সুতরাং আপনার টিউন-এসকিউএল এবং / অথবা পিএল / এসকিউএলে বিভিন্ন স্বাক্ষরের জন্য অনুমতি দেয় এমন ফাংশনের একাধিক সংস্করণ প্রয়োজন হতে পারে।
    4. ওভারলোডিংকে অনুমতি না দেওয়ার অনুরূপ, NVARCHAR(4000)এবং এর মধ্যে একটি বড় পার্থক্য রয়েছে NVARCHAR(MAX): MAXপ্রকার (স্বাক্ষরে তাদের মধ্যে একটিও থাকা) এসকিউএলসিআরআর কল MAXস্বাক্ষরের কোনও প্রকার না হওয়ার দ্বিগুণ দীর্ঘ সময় নিতে পারে (আমি বিশ্বাস করি এটি হোল্ড করে VARBINARY(MAX)বনাম VARBINARY(4000)হিসাবে সত্য )। সুতরাং, আপনার মধ্যে সিদ্ধান্ত নেওয়া দরকার:
      • কেবল NVARCHAR(MAX)একটি সরলীকরণযোগ্য এপিআই ব্যবহার করতে ব্যবহার করুন , তবে আপনি যখন 8000 বাইট বা তার বেশি স্ট্রিং ডেটা ব্যবহার করছেন তখন বা পারফরম্যান্স হিট করুন বা
      • সমস্ত / সর্বাধিক / বহু স্ট্রিং ফাংশনগুলির জন্য দুটি বৈকল্পিকতা তৈরি করা: একটি MAXপ্রকারের সাথে এবং একটি ছাড়া (যখন আপনি কখনই 8000 বাইটের স্ট্রিং ডেটা ভিতরে বা বাইরে যেতে পারবেন না তার নিশ্চয়তা দেওয়া হয়)। এটি আমার এসকিউএল # লাইব্রেরির বেশিরভাগ ফাংশনের জন্য আমি বেছে নিয়েছি : এমন একটি Trim()ফাংশন রয়েছে যার সম্ভবত এক বা একাধিক MAXপ্রকার রয়েছে এবং এমন Trim4k()সংস্করণ যা MAXসই বা ফলাফল সেট স্কিমায় কখনও কোনও ধরণের থাকে না । "4 কে" সংস্করণগুলি একেবারে আরও দক্ষ।
    5. প্রশ্নের উদাহরণের ভিত্তিতে আপনি কার্যকারিতা অনুকরণ করতে সাবধান হন না। LTRIMএবং RTRIMকেবল ফাঁকা স্থানগুলি ট্রিম করুন, যখন .NET String.Trim()শ্বেত স্থান (কমপক্ষে স্থান, ট্যাব এবং নিউলাইনগুলি) ছাঁটাই করে । উদাহরণ স্বরূপ:

        PRINT LTRIM(RTRIM(N'      a       '));
    6. এছাড়াও, আমি কেবল লক্ষ্য করেছি যে আপনার ফাংশন টি-এসকিউএল এবং সি # তে উভয়ই 3 ইনপুট পরামিতিগুলির মধ্যে 1 ব্যবহার করে। এটি কি কেবল ধারণার প্রমাণ, বা কোডের সাথে যোগাযোগ করা?

1. এসকিউএল প্রকারগুলি ব্যবহারের বিষয়ে পরামর্শ দেওয়ার জন্য ধন্যবাদ। আমি এখন এই পরিবর্তন করব। ২. এখানে কাজের বাহ্যিক শক্তি রয়েছে যা তাদের ব্যবহারের প্রয়োজন। আমি এটি নিয়ে শিহরিত হই না তবে আমার উপর বিশ্বাস রাখি, এটি বিকল্পের চেয়ে ভাল। আমার মূল প্রশ্নটিতে একটি আপাতদৃষ্টিতে এ্যাসিনাইন কার্যকারিতা কেন বিদ্যমান এবং এটি ব্যবহৃত হচ্ছে সে সম্পর্কে কিছুটা ব্যাখ্যা রয়েছে।
রাশি স্যটার

টুইটারে আমি কেবল এমন কিছু সমস্যাগুলি দেখছিলাম যেগুলি যখন সিদ্ধান্ত নেওয়া হয়েছিল তখন হয়ত জানা ছিল না। যে কোনও উপায়ে, আমি আমার নোটগুলি খুঁজে পেতে বা আমার মনে পড়ার কয়েকটি বিবরণ থেকে দৃশ্যের পুনঃ উত্পাদন করতে অক্ষম। আমি কেবলমাত্র 2017 এর মধ্যে লেনদেনের বিষয়ে এবং কোনও সমাবেশ থেকে কোড কল করার ক্ষেত্রে অবশ্যই কিছুটা পরিবর্তনের কথা মনে করেছি এবং এটির জন্য খুব বিরক্ত হচ্ছিল কারণ এটি খারাপের জন্য অপ্রয়োজনীয় পরিবর্তনের মতো মনে হয়েছিল এবং আমি যা পরীক্ষা করেছিলাম তার জন্য আমাকে এটিকে ঘিরে কাজ করতে হয়েছিল পূর্ববর্তী সংস্করণে জরিমানা। সুতরাং, দয়া করে ডেডলক এক্সএমএলে প্রশ্নের একটি লিঙ্ক পোস্ট করুন।
সলোমন রুটজকি

অতিরিক্ত তথ্য জন্য ধন্যবাদ। এখানে এক্সএমএলটির একটি লিঙ্ক রয়েছে: ড্রপবক্স
রাশ

@ রুসসুটার আপনি কি টি-এসকিউএল ইনলাইন করে এটি চেষ্টা করেছেন? অচলিত এক্সএমএলটির দিকে তাকানো (এটি কোনও একক লাইন হিসাবে সহজ নয় - সমস্ত নিউলাইনগুলি কোনওভাবে সরিয়ে দেওয়া হয়েছে) এটি 60 এবং 78 সেশনের মধ্যবর্তী পৃষ্ঠাগুলির লকগুলির একটি সিরিজ বলে মনে হয় both উভয় সেশনের মধ্যে 8 পৃষ্ঠাগুলি লক রয়েছে: একটির জন্য 3 অন্যটির জন্য এসপিআইডি এবং 5। প্রতিটি পৃথক প্রক্রিয়া আইডি সহ প্রতিটি, সুতরাং এটি সমান্তরালতার বিষয়। এটি যদি এসকিউএলসিএলআরের সাথে সম্পর্কিত হয় তবে এটি ব্যঙ্গাত্মকভাবে হতে পারে যে এসকিউএলসিআরআর সমান্তরালতা রোধ করছে না। এই কারণেই আমি জিজ্ঞাসা করেছি আপনি যদি সাধারণ ফাংশনটি ইনলাইন রাখার চেষ্টা করেছেন তবে এটি অচলাবস্থাও দেখাতে পারে।
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.