এসকিউএল সার্ভারে সূচী দর্শন


11

আমার এটির মতো একটি টেবিল এবং একটি সূচিযুক্ত ভিউ রয়েছে

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

এখন যদি আমি নিম্নলিখিত কোয়েরিটি চালাই

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

এটি আমার সূচকিত দর্শনটি ব্যবহার করে না। এসকিউএল সার্ভারকে পরিবর্তে সূচকযুক্ত ভিউ ব্যবহার করতে বাধ্য করার কোনও ইঙ্গিত (বা অন্য কোনও উপায়) আছে কি?

আমার একটি বড় ব্যবস্থা আছে এবং এটি অনুকূলকরণ করা দরকার। টেবিলের পরিবর্তে ভিউ থেকে নির্বাচন করতে আমি আমার সমস্ত এসকিউএল স্ক্রিপ্ট পরিবর্তন করতে পারি না। আমি ইনডেক্সড ভিউ তৈরি করতে চাই এবং এসকিউএল সার্ভারকে টেবিলের পরিবর্তে এগুলি থেকে ডেটা পেতে বাধ্য করি।

আমি এসকিউএল সার্ভার 2014 এন্টারপ্রাইজ সংস্করণ ব্যবহার করছি।


আমার একটি বড় ব্যবস্থা আছে এবং এটি অনুকূলকরণ করা দরকার। আমি টেবিলের পরিবর্তে ভিউ থেকে নির্বাচন করতে আমার সমস্ত এসকিএল স্ক্রিপ্ট পরিবর্তন করতে পারি না। আমি ইনডেক্সেড ভিউ তৈরি করতে এবং সারণী পরিবর্তে তাদের থেকে ডেটা পেতে এসকিএল সার্ভারকে বাধ্য করতে চাই।
আরতাশেস খাছাত্রিয়ান

উত্তর:


23

বিদ্যমান পণ্যগুলিকে টিউন করার জন্য আমি এসকিউএল সার্ভারে সারাক্ষণ সূচিযুক্ত ভিউ তৈরি করি। আপনি যদি যথাযথ কলামগুলি ব্যবহার করেন তবে অপ্টিমাইজারটি সূচকটি ব্যবহার করতে যথেষ্ট স্মার্ট is

আপনার উদাহরণটি ব্যবহার করে, দেখে মনে হচ্ছে আপনি দৃশ্যটি তৈরি করেছেন তবে বাস্তবে এটি কোনও সূচক তৈরি করেন নি।

if object_id(N'mytable1') is not null 
drop table mytable1
if object_id(N'mytable2') is not null 
drop table mytable2
go

Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO

insert into mytable1 values ('steve')
insert into mytable1 values ('jack') 
insert into mytable1 values ('mike') 
insert into mytable1 values ('ralph') 
insert into mytable1 values ('simon')

insert into mytable2 values ('smith')
insert into mytable2 values ('jackson') 
insert into mytable2 values ('mikaelson') 
insert into mytable2 values ('montalvo') 
insert into mytable2 values ('singer')
go

if object_id(N'myview') is not null
drop view myview
go

Create view myview 
with schemabinding 
as 
select a.id, a.name1, b.name2
from dbo.mytable1 a 
join dbo.mytable2 b on a.Id = b.Id
GO

select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO

যেহেতু এই দৃশ্যে কোনও সূচক নেই, তাই আমরা বেস টেবিলগুলিতে স্ক্যান করি: এখানে চিত্র বর্ণনা লিখুন

তবে একবার আমরা একটি সূচক যুক্ত করলে, অপ্টিমাইজারটি এটি ব্যবহার করতে পারে:

CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
    [name1] ASC,
    [name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

এটি দৃশ্যের যথাযথ ব্যবহার করেছে: এখানে চিত্র বর্ণনা লিখুন

টেবিলের পরিবর্তে ভিউ থেকে নির্বাচন করতে আমি আমার সমস্ত এসকিউএল স্ক্রিপ্ট পরিবর্তন করতে পারি না। আমি ইনডেক্সড ভিউ তৈরি করতে চাই এবং এসকিউএল সার্ভারকে টেবিলের পরিবর্তে এগুলি থেকে ডেটা পেতে বাধ্য করি।

কোয়েরিতে রেফারেন্স না দেওয়া অবস্থায় এসকিউএল সার্ভারকে একটি সূচক দৃষ্টিভঙ্গি প্রয়োগ করতে বাধ্য করার কোনও ইঙ্গিত বা অন্য পদ্ধতি নেই।

অতিরিক্ত তথ্য ( জিওফ প্যাটারসন থেকে )

একটি অতিরিক্ত বিষয় হ'ল অপ্টিমাইজারটি কেবলমাত্র এন্টারপ্রাইজ সংস্করণে এই ক্ষেত্রে সূচী দৃষ্টিভঙ্গিটি ব্যবহার NOEXPANDকরতে পারে, তবে আপনার যদি সূচকটি ব্যবহারের 100% নিশ্চিত হওয়ার প্রয়োজন হয় তবে আপনার ইঙ্গিতটি ব্যবহার করে সরাসরি ভিউটি উল্লেখ করা অর্থ হতে পারে বা আপনি যদি কখনও এটি স্ট্যান্ডার্ড সংস্করণে ব্যবহার করতে চান।

এমনকি প্রায়শই আমি এন্টারপ্রাইজ সংস্করণে কোয়েরি দেখেছি যেখানে অপ্টিমাইজারটি এই সত্যটি গ্রহণ করে না যে ভিউ সূচকটি ব্যবহার না NOEXPANDকরা হলে ব্যবহার করা যেতে পারে । জটিল প্রশ্নের সাথে এটি আরও সাধারণ, তবে সাধারণ প্রশ্নের সাথেও ঘটতে পারে।

পল হোয়াইটের আরও ভাল নিবন্ধগুলির মধ্যে আমি পড়লাম এর ঘনত্বগুলি অন্বেষণ করে NOEXPAND; কেবলমাত্র দেখার সূচকের ব্যবহারের বাইরে, ইঙ্গিতটি এমন কিছুর উপরও প্রভাব ফেলতে পারে যেমন পরিকল্পনার জন্য সূচিযুক্ত ভিউ এবং কার্ডিনালটির প্রাক্কলনের উপর পরিসংখ্যান স্বয়ংক্রিয়ভাবে তৈরি করা হয়।

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


-5

আপনি যদি নিজের অ্যাপ্লিকেশন কোডটি নতুন অবজেক্টনেমে পরিবর্তন করতে না পারেন, তবে আপনি নিজের অ্যাপ্লিকেশন ব্যবহারকারীকে একটি নতুন ডিফল্ট স্কিমা ব্যবহার করতে এবং অন্য একটি স্কিমা ইউএনএস একই বস্তুটির নাম অনুসারে সূচিযুক্ত দর্শন তৈরি করতে পারেন? এই ক্ষেত্রে:

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

অবশ্যই যদি আপনি অ্যাপ্লিকেশন কোডটিতে স্কিমা নাম ব্যবহার না করেন তবে এটি কাজ করবে।

আপনার যদি থাকে তবে আপনি সমস্ত বস্তুকে একটি নতুন স্কিমাতে স্থানান্তরিত করার চেষ্টা করতে পারেন এবং পরিবর্তে পুরানো স্কিমাতে দর্শনগুলি প্রবর্তন করতে পারেন।

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