সেটআপ:
create table dbo.T
(
ID int identity primary key,
XMLDoc xml not null
);
insert into dbo.T(XMLDoc)
select (
select N.Number
for xml path(''), type
)
from (
select top(10000) row_number() over(order by (select null)) as Number
from sys.columns as c1, sys.columns as c2
) as N;
প্রতিটি সারির জন্য এক্সএমএল নমুনা:
<Number>314</Number>
ক্যোয়ারির কাজটি হ'ল T
একটি নির্দিষ্ট মান সহ সারিগুলির সংখ্যা গণনা করা <Number>
।
এটি করার দুটি সুস্পষ্ট উপায় রয়েছে:
select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;
select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = 1;
এটি প্রমাণিত করে value()
এবং exists()
নির্বাচিত এক্সএমএল সূচককে কাজ করতে দুটি পৃথক পথ সংজ্ঞা প্রয়োজন।
create selective xml index SIX_T on dbo.T(XMLDoc) for
(
pathSQL = '/Number' as sql int singleton,
pathXQUERY = '/Number' as xquery 'xs:double' singleton
);
sql
সংস্করণ জন্য value()
এবং xquery
সংস্করণের জন্য হয় exist()
।
আপনি ভাবতে পারেন যে এর মতো একটি সূচক আপনাকে একটি ভাল সন্ধানের সাথে একটি পরিকল্পনা দেবে তবে নির্বাচনী এক্সএমএল সূচিগুলি সিস্টেম টেবিলের T
ক্লাস্টার কীটির মূল কী হিসাবে প্রাথমিক কী সহ সিস্টেম টেবিল হিসাবে প্রয়োগ করা হবে । উল্লিখিত পাথগুলি সেই সারণীতে বিরল কলাম। আপনি যদি সংজ্ঞায়িত পাথগুলির আসল মানগুলির একটি সূচক চান তবে আপনাকে একটি গৌণ নির্বাচনী সূচী তৈরি করতে হবে, প্রতিটি পাথের অভিব্যক্তির জন্য একটি।
create xml index SIX_T_pathSQL on dbo.T(XMLDoc)
using xml index SIX_T for (pathSQL);
create xml index SIX_T_pathXQUERY on dbo.T(XMLDoc)
using xml index SIX_T for (pathXQUERY);
এর জন্য ক্যোয়ারী প্ল্যানটি exist()
সেকেন্ডারি এক্সএমএল সূচকে সন্ধানকারী এক্সএমএল সূচকের জন্য সিস্টেম টেবিলের একটি মূল অনুসন্ধান (যা প্রয়োজন তা কেন জানি না) এবং চূড়ান্তভাবে এটি অনুসন্ধানের T
চেষ্টা করে যাতে এটি আছে কিনা তা নিশ্চিত করে সেখানে সারি। শেষ অংশটি প্রয়োজনীয় কারণ সিস্টেম সারণী এবং এর মধ্যে কোনও বিদেশী কী বাধা নেই T
।
value()
ক্যোয়ারির পরিকল্পনাটি এত সুন্দর নয়। এটি T
বিরল কলাম থেকে মান পেতে অভ্যন্তরীণ টেবিলের অন্বেষণের বিরুদ্ধে নেস্টেড লুপগুলির সাথে একটি ক্লাস্টারড ইনডেক্স স্ক্যান করে এবং পরিশেষে মানটিতে ফিল্টার করে।
যদি একটি নির্বাচনী সূচক ব্যবহার করা উচিত বা না করা উচিত তবে অপ্টিমাইজেশনের আগে সিদ্ধান্ত নেওয়া হয় তবে যদি কোনও মাধ্যমিক নির্বাচক সূচক ব্যবহার করা উচিত বা না হয় তবে এটি অপ্টিমাইজারের দ্বারা ব্যয় ভিত্তিক সিদ্ধান্ত।
যেখানে ক্লজ ফিল্টার করা হয় তখন কেন সেকেন্ডারি সিলেক্টিক ইনডেক্স ব্যবহার করা হয় না value()
?
হালনাগাদ:
প্রশ্নগুলি শব্দার্থগতভাবে পৃথক। যদি আপনি মান সহ একটি সারি যোগ করেন
<Number>313</Number>
<Number>314</Number>`
exist()
সংস্করণ 2 সারি গণনা হবে এবং values()
কোয়েরি 1 টি সারি গণনা করবে। singleton
নির্দেশিকা এসকিউএল সার্ভার ব্যবহার করে সূচী সংজ্ঞা হিসাবে যেমন এখানে নির্দিষ্ট করা হয়েছে সেগুলি আপনাকে একাধিক <Number>
উপাদানগুলির সাথে একটি সারি যুক্ত করা থেকে বিরত করবে ।
এটি তবে আমাদের কেবলমাত্র একটি একক মান পাব তা সংক্ষেপককে গ্যারান্টি দিয়ে values()
নির্দিষ্ট করে ফাংশনটি ব্যবহার [1]
করতে দেয় না। সেই [1]
কারণেই আমাদের value()
পরিকল্পনায় একটি শীর্ষ এন বাছাই করা রয়েছে ।
দেখে মনে হচ্ছে আমি এখানে একটি উত্তর বন্ধ করছি ...