একটি ডাটাবেস প্রোফাইল করার সময় আমি এমন একটি দৃষ্টিভঙ্গি দেখতে পেয়েছি যা এই অ্যাপ্লিকেশনটির পুলের প্রতিটি সংযোগের জন্য প্রতি মিনিটে 1000-2500 বার অ্যাক্সেস পাওয়া কিছু অ- নিরোধক ফাংশনগুলিকে উল্লেখ করছে । ভিউ থেকে একটি সাধারণ নিম্নলিখিত সম্পাদন পরিকল্পনা ফলন করে:SELECT
এটি এমন এক দৃশ্যের জটিল পরিকল্পনার মতো বলে মনে হচ্ছে যাতে এক হাজারেরও কম সারি রয়েছে যা প্রতি কয়েক মাসে এক সারি বা দুটি পরিবর্তন দেখতে পারে। তবে নিম্নলিখিত অন্যান্য পালনগুলির সাথে এটি আরও খারাপ হয়:
- নেস্টেড মতামতগুলি অ-নিরস্তাত্মক, তাই আমরা সেগুলি সূচী করতে পারি না
- প্রতিটি ভিউ
UDF
স্ট্রিংগুলি তৈরি করতে একাধিক গুলি উল্লেখ করে - প্রতিটি ইউডিএফ
UDF
স্থানীয় ভাষাগুলির জন্য আইএসও কোড পেতে নেস্টেড এস থাকে - স্ট্যাকের দৃশ্যগুলি অতিরিক্ত স্ট্রিং বিল্ডারকে পূর্বাভাস হিসাবে ব্যবহার করেছে
UDF
JOIN
- প্রতিটি দর্শন স্ট্যাককে একটি টেবিল হিসাবে বিবেচনা করা হয়, যার অর্থ অন্তর্নিহিত টেবিলগুলিতে লেখার জন্য প্রত্যেকে
INSERT
/UPDATE
/DELETE
ট্রিগার রয়েছে - এই ভিউগুলিতে এই ট্রিগারগুলি স্টোরেজ পদ্ধতি ব্যবহার
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
হিসাবে ব্যবহার করা হচ্ছে JOIN
। I18NID
কলাম concatenating দ্বারা গঠিত হয়:STRING + [ + ID + | + ID + ]
এগুলির পরীক্ষার সময়, SELECT
ভিউ থেকে একটি সরল ~ 309 সারি দেয় এবং সম্পাদন করতে 900-1400ms লাগে takes যদি আমি স্ট্রিংগুলিকে অন্য টেবিলের মধ্যে ফেলে দিই এবং তার উপর একটি সূচককে চড় মারি তবে একই নির্বাচনটি 20-75ms এ ফিরে আসে।
সুতরাং, দীর্ঘ গল্পের সংক্ষিপ্ত বিবরণ (এবং আমি আশা করি আপনি এই নির্লিপ্ততার কিছু প্রশংসা করেছেন) আমি একটি ভাল শমরীয় হতে চাই এবং এই পণ্যটি পরিচালনা করে এমন 99% ক্লায়েন্ট যারা এই ক্ষেত্রে কোনও স্থানীয়করণ ব্যবহার করে না তাদের পুনরায় ডিজাইন করে আবার লিখতে চাই - [en-US]
ইংরাজির দ্বিতীয় / তৃতীয় ভাষা হওয়া সত্ত্বেও ব্যবহারকারীরা লোকেলটি ব্যবহার করবেন বলে আশা করা হচ্ছে ।
যেহেতু এটি একটি অনানুষ্ঠানিক হ্যাক, আমি নিম্নলিখিতগুলি নিয়ে ভাবছি:
- মূল বেস টেবিলগুলি থেকে পরিষ্কারভাবে যোগদানের ডেটার সেট সহ পপুলেটেড নতুন স্ট্রিং টেবিল তৈরি করুন
- টেবিল সূচী।
- স্ট্যাকের মধ্যে টপ লেভেল মতামত অন্তর্ভুক্ত যে একটি প্রতিস্থাপন সেট তৈরি
NVARCHAR
এবংINT
জন্য কলামWKType
এবংWKIndex
কলাম। - থাবা সংশোধন
UDF
গুলি যে কিছু predicates যোগদানের এড়ানোর টাইপ ধর্মান্তর এইসব মতামত উল্লেখ (আমাদের বৃহত্তম নিরীক্ষা টেবিল 500-2,000M সারি এবং দোকানে একটি হলINT
একটিNVARCHAR(4000)
কলামে বিরুদ্ধে যোগদানের জন্য ব্যবহার করা হয়WKIndex
(কলামINT
)।) - স্কিমাবাইন্ড দর্শনগুলি
- ভিউগুলিতে কয়েকটি সূচক যুক্ত করুন
- কার্সারের পরিবর্তে সেট যুক্তি ব্যবহার করে দর্শনে ট্রিগারগুলি পুনর্নির্মাণ করুন
এখন, আমার আসল প্রশ্নগুলি:
- কোনও দৃশ্যের মাধ্যমে স্থানীয় স্ট্রিংগুলি পরিচালনা করার জন্য কি সর্বোত্তম অনুশীলন পদ্ধতি আছে?
UDF
স্টাব হিসাবে ব্যবহারের জন্য কোন বিকল্প বিদ্যমান ? (আমিVIEW
বিভিন্ন স্কাবের উপর নির্ভর না করে প্রতিটি স্কিমা মালিকের জন্য ভাষা এবং হার্ড-কোডের জন্য একটি নির্দিষ্ট লিখতে পারিUDF
))- এই মতামতগুলি কেবল
UDF
নেস্টেডদের সম্পূর্ণরূপে যোগ্যতার দ্বারা এবং তারপরে ভিউ স্ট্যাকগুলিকে স্কাইমাইন্ডিং করে নির্দোষ করা যায়?
UDF
সংজ্ঞা পোস্ট করুন । এছাড়াও, টি-এসকিউএল ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি দেখুন: ভাল, খারাপ এবং কুশ্রী