এসকিউএল সার্ভার - নেস্টেড নন-ডিস্ট্রিমেন্টিক ভিউ স্ট্যাকগুলিতে স্ট্রিংগুলির স্থানীয়করণ পরিচালনা করছে


20

একটি ডাটাবেস প্রোফাইল করার সময় আমি এমন একটি দৃষ্টিভঙ্গি দেখতে পেয়েছি যা এই অ্যাপ্লিকেশনটির পুলের প্রতিটি সংযোগের জন্য প্রতি মিনিটে 1000-2500 বার অ্যাক্সেস পাওয়া কিছু অ- নিরোধক ফাংশনগুলিকে উল্লেখ করছে । ভিউ থেকে একটি সাধারণ নিম্নলিখিত সম্পাদন পরিকল্পনা ফলন করে:SELECT

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

এটি এমন এক দৃশ্যের জটিল পরিকল্পনার মতো বলে মনে হচ্ছে যাতে এক হাজারেরও কম সারি রয়েছে যা প্রতি কয়েক মাসে এক সারি বা দুটি পরিবর্তন দেখতে পারে। তবে নিম্নলিখিত অন্যান্য পালনগুলির সাথে এটি আরও খারাপ হয়:

  1. নেস্টেড মতামতগুলি অ-নিরস্তাত্মক, তাই আমরা সেগুলি সূচী করতে পারি না
  2. প্রতিটি ভিউ UDFস্ট্রিংগুলি তৈরি করতে একাধিক গুলি উল্লেখ করে
  3. প্রতিটি ইউডিএফ UDFস্থানীয় ভাষাগুলির জন্য আইএসও কোড পেতে নেস্টেড এস থাকে
  4. স্ট্যাকের দৃশ্যগুলি অতিরিক্ত স্ট্রিং বিল্ডারকে পূর্বাভাস হিসাবে ব্যবহার করেছেUDFJOIN
  5. প্রতিটি দর্শন স্ট্যাককে একটি টেবিল হিসাবে বিবেচনা করা হয়, যার অর্থ অন্তর্নিহিত টেবিলগুলিতে লেখার জন্য প্রত্যেকে INSERT/ UPDATE/ DELETEট্রিগার রয়েছে
  6. এই ভিউগুলিতে এই ট্রিগারগুলি স্টোরেজ পদ্ধতি ব্যবহার CURSORSকরে EXECযা এই স্ট্রিং বিল্ডিংয়ের আরও উল্লেখ করে UDF

এটি আমার কাছে বেশ পচা বলে মনে হচ্ছে তবে টিএসকিউএল নিয়ে আমার কেবল কয়েক বছরের অভিজ্ঞতা আছে। এটা আরও ভাল হয়!

এটি এমন বিকাশকারী হিসাবে উপস্থিত হয়েছে যা সিদ্ধান্ত নিয়েছিল যে এটি একটি দুর্দান্ত ধারণা, এটি এই সমস্ত কাজটি করেছিল যাতে কয়েকটি কয়েকশ স্ট্রিং সঞ্চিত থাকে UDFযা স্কিমা-নির্দিষ্ট একটি স্ট্রিংয়ের উপর ভিত্তি করে অনুবাদ করতে পারে sche

এখানে স্ট্যাকের একটি দর্শন, তবে সেগুলি সমস্তই সমানভাবে খারাপ:

CREATE VIEW [UserWKStringI18N]
AS
SELECT b.WKType, b.WKIndex
    , CASE
       WHEN ISNULL(il.I18NID, N'') = N''
       THEN id.I18NString
       ELSE il.I18nString
       END AS WKString
    ,CASE
       WHEN ISNULL(il.I18NID, N'') = N''
       THEN id.IETFLangCode
       ELSE il.IETFLangCode
       END AS IETFLangCode
    ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS') AS I18NID
    ,dbo.UserI18N_Session_Locale_Key()  AS IETFSessionLangCode
    ,dbo.UserI18N_Database_Locale_Key() AS IETFDatabaseLangCode
FROM   UserWKStringBASE b
LEFT OUTER JOIN User3StringI18N il
ON    (
il.I18NID       = dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS')
AND il.IETFLangCode = dbo.UserI18N_Session_Locale_Key()
)
LEFT OUTER JOIN User3StringI18N id
ON    (
id.I18NID       = dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex,N'WKS')
AND id.IETFLangCode = dbo.UserI18N_Database_Locale_Key()
)
GO

এখানে কেন পূর্বাভাস UDFহিসাবে ব্যবহার করা হচ্ছে JOINI18NIDকলাম concatenating দ্বারা গঠিত হয়:STRING + [ + ID + | + ID + ]

এগুলির পরীক্ষার সময়, SELECTভিউ থেকে একটি সরল ~ 309 সারি দেয় এবং সম্পাদন করতে 900-1400ms লাগে takes যদি আমি স্ট্রিংগুলিকে অন্য টেবিলের মধ্যে ফেলে দিই এবং তার উপর একটি সূচককে চড় মারি তবে একই নির্বাচনটি 20-75ms এ ফিরে আসে।

সুতরাং, দীর্ঘ গল্পের সংক্ষিপ্ত বিবরণ (এবং আমি আশা করি আপনি এই নির্লিপ্ততার কিছু প্রশংসা করেছেন) আমি একটি ভাল শমরীয় হতে চাই এবং এই পণ্যটি পরিচালনা করে এমন 99% ক্লায়েন্ট যারা এই ক্ষেত্রে কোনও স্থানীয়করণ ব্যবহার করে না তাদের পুনরায় ডিজাইন করে আবার লিখতে চাই - [en-US]ইংরাজির দ্বিতীয় / তৃতীয় ভাষা হওয়া সত্ত্বেও ব্যবহারকারীরা লোকেলটি ব্যবহার করবেন বলে আশা করা হচ্ছে ।

যেহেতু এটি একটি অনানুষ্ঠানিক হ্যাক, আমি নিম্নলিখিতগুলি নিয়ে ভাবছি:

  1. মূল বেস টেবিলগুলি থেকে পরিষ্কারভাবে যোগদানের ডেটার সেট সহ পপুলেটেড নতুন স্ট্রিং টেবিল তৈরি করুন
  2. টেবিল সূচী।
  3. স্ট্যাকের মধ্যে টপ লেভেল মতামত অন্তর্ভুক্ত যে একটি প্রতিস্থাপন সেট তৈরি NVARCHARএবং INTজন্য কলাম WKTypeএবং WKIndexকলাম।
  4. থাবা সংশোধন UDFগুলি যে কিছু predicates যোগদানের এড়ানোর টাইপ ধর্মান্তর এইসব মতামত উল্লেখ (আমাদের বৃহত্তম নিরীক্ষা টেবিল 500-2,000M সারি এবং দোকানে একটি হল INTএকটি NVARCHAR(4000)কলামে বিরুদ্ধে যোগদানের জন্য ব্যবহার করা হয় WKIndex(কলাম INT)।)
  5. স্কিমাবাইন্ড দর্শনগুলি
  6. ভিউগুলিতে কয়েকটি সূচক যুক্ত করুন
  7. কার্সারের পরিবর্তে সেট যুক্তি ব্যবহার করে দর্শনে ট্রিগারগুলি পুনর্নির্মাণ করুন

এখন, আমার আসল প্রশ্নগুলি:

  1. কোনও দৃশ্যের মাধ্যমে স্থানীয় স্ট্রিংগুলি পরিচালনা করার জন্য কি সর্বোত্তম অনুশীলন পদ্ধতি আছে?
  2. UDFস্টাব হিসাবে ব্যবহারের জন্য কোন বিকল্প বিদ্যমান ? (আমি VIEWবিভিন্ন স্কাবের উপর নির্ভর না করে প্রতিটি স্কিমা মালিকের জন্য ভাষা এবং হার্ড-কোডের জন্য একটি নির্দিষ্ট লিখতে পারি UDF))
  3. এই মতামতগুলি কেবল UDFনেস্টেডদের সম্পূর্ণরূপে যোগ্যতার দ্বারা এবং তারপরে ভিউ স্ট্যাকগুলিকে স্কাইমাইন্ডিং করে নির্দোষ করা যায়?


এটি কি কোনও উপায়ে আপনাকে সহায়তা করে? stackoverflow.com/questions/316780/...
stacylaray

উত্তর:


1

প্রদত্ত কোডটি দেখে আমরা বলতে পারি,

  • প্রথমত, এটি দর্শন হওয়া উচিত নয় তবে এটি একটি সঞ্চিত পদ্ধতি হওয়া উচিত, কারণ এটি কেবল কোনও টেবিল থেকে পড়া হয় না, তবে এটি ইউডিএফ ব্যবহার করে।
  • দ্বিতীয়ত, ইউডিএফ একই কলামের জন্য ঘন ঘন কল করা উচিত নয়। এখানে, এটি নির্বাচিত একবার বলা হয়

    ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS') AS I18NID 

    এবং দ্বিতীয় বার যোগদানের জন্য

    .IETFLangCode = dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS')

একটি অস্থায়ী সারণীতে মান উত্পন্ন করতে পারে বা যোগদানের আগে এই মানগুলি প্রথম স্থানে পেতে CTE (প্রচলিত সারণী এক্সপ্রেশন) ব্যবহার করতে পারে।

আমি একটি নমুনা ইউএসপি তৈরি করেছি যা কিছু উন্নতি প্রদান করবে:

CREATE PROCEDURE usp_UserWKStringI18N
AS
BEGIN
    -- Do operation using UDF 
    SELECT b.WKType
        ,b.WKIndex
        ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS') AS I18NID
        ,dbo.UserI18N_Session_Locale_Key() AS IETFSessionLangCode
        ,dbo.UserI18N_Database_Locale_Key() AS IETFDatabaseLangCode
    INTO #tempTable
    FROM UserWKStringBASE b;

    -- Now final Select
    SELECT b.WKType
        ,b.WKIndex
        ,CASE 
            WHEN ISNULL(il.I18NID, N'') = N''
                THEN id.I18NString
            ELSE il.I18nString
            END AS WKString
        ,CASE 
            WHEN ISNULL(il.I18NID, N'') = N''
                THEN id.IETFLangCode
            ELSE il.IETFLangCode
            END AS IETFLangCode
        ,b.I18NID
        ,b.IETFSessionLangCode
        ,b.IETFDatabaseLangCode
    FROM #tempTable b
    LEFT OUTER JOIN User3StringI18N il
        ON il.I18NID = b.I18NID
            AND il.IETFLangCode = b.IETFSessionLangCode
    LEFT OUTER JOIN User3StringI18N id
        ON id.I18NID = b.I18NID
            AND id.IETFLangCode = b.IETFDatabaseLangCode
END

এটি চেষ্টা করুন


হ্যালো মার্মিক, এই পোস্টটি একবার দেখার জন্য সময় দেওয়ার জন্য ধন্যবাদ। এটি দুর্ভাগ্যক্রমে একটি দর্শন (নেস্টেড ভিউগুলির একটি সিরিজের মধ্যে) তাই এটি একটি সঞ্চিত পদ্ধতিতে স্থানান্তর করা প্রশ্নের বাইরে ছিল।
মৌমাছি

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