এসআরজি কার্ডিনালিটির অনুমান, কেন পুরো স্ক্যান নয়?


11

কেন কোনও পূর্ণ স্ক্যান নেই (এসকিউএল ২০০৮ আর ২ এবং ২০১২ এ)?

পরীক্ষার ডেটা:

DROP TABLE dbo.TestTable
GO  
CREATE TABLE dbo.TestTable
(
   TestTableID INT IDENTITY PRIMARY KEY,
   VeryRandomText VarChar(50),
   VeryRandomText2 VarChar(50)
)
Go
Set NoCount ON
Declare @i int
Set @i = 0
While @i < 10000
Begin
   Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2)
      Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50)));
   Set @i = @i + 1;
End
Go
CREATE Index IX_VeryRandomText On dbo.TestTable
(
    VeryRandomText
)
Go

কোয়েরি কার্যকর করার সময়:

Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad

সতর্কতা পান (আশানুরূপ হিসাবে, কারণ এনসিআর ডেটা ভের্চর কলামের সাথে তুলনা করা):

<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />

তবে আমি বাস্তবায়ন পরিকল্পনাটি দেখতে পাচ্ছি এবং আমি দেখতে পাচ্ছি যে এটি আমার প্রত্যাশা মতো পূর্ণ স্ক্যান ব্যবহার করছে না, পরিবর্তে সূচক অনুসন্ধান করবে seek

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

অবশ্যই, এটি এক ধরণের ভাল, কারণ এই বিশেষ ক্ষেত্রে কার্যকর স্ক্যান হওয়ার চেয়ে দ্রুত কার্যকর করা কার্যকর হয়।

তবে আমি বুঝতে পারি না এসকিউএল সার্ভার কীভাবে এই পরিকল্পনাটি করার সিদ্ধান্ত নিয়েছে।

এছাড়াও- যদি সার্ভার স্তরটি সার্ভার স্তর এবং এসকিউএল সার্ভার কোলিশান ডাটাবেস স্তরে উইন্ডোজ কোলিশান হয়, তবে এটি একই ক্যোয়ারীতে সম্পূর্ণ স্ক্যানের কারণ হতে পারে।

উত্তর:


8

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

এসকিউএল সার্ভার তবে আপনাকে আপনার ভুল থেকে রক্ষা করার পক্ষে সর্বোত্তমভাবে কাজ করে তাই এটি ব্লগ পোস্টে ডাইনামিক সিক্স এবং লুক্কায়িত ইমপ্রিল রূপান্তরগুলি ব্লগ পোস্টে বর্ণিত একটি কৌশল ব্যবহার করে বিভিন্ন মানের মূল্য অনুসন্ধান করার জন্য এবং তারপরে চূড়ান্ত তুলনা করে, কোনও মিথ্যা ধনাত্মককে ফিল্টার করার জন্য একটি অবশিষ্টাংশের পূর্বাভাসে কলামের মানকে Nvarchar এ রূপান্তর।

যেমনটি আপনি উল্লেখ করেছেন, কলামের কলেজটি যখন এসকিউএল কোলেশন হয় তখন এটি কাজ করে না। আমি বিশ্বাস করি যে এর কারণটি উইন্ডোজ কোলিশনের সাথে এসকিউএল কোলিশেশন তুলনা করে নিবন্ধে পাওয়া যাবে

মূলত, একটি উইন্ডোজ কোলিশন ভার্চর এবং এনভারচারের জন্য একই অ্যালগরিদম ব্যবহার করে যেখানে একটি এসকিউএল কোলিশন ভারচারের ডেটার জন্য একটি পৃথক অ্যালগরিদম এবং এনভারচার ডেটার জন্য উইন্ডোজ কোলিশনের একই অ্যালগরিদম ব্যবহার করে।

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


হালনাগাদ:

উইন্ডো এবং এসকিউএল কোলেশন ব্যবহার করে ভারচর কলামগুলির জন্য বিভিন্ন ধরণের অর্ডারগুলির একটি প্রদর্শনী।

এসকিউএল ফিডল

এমএস এসকিউএল সার্ভার 2014 স্কিমা সেটআপ :

create table T(C varchar(10));

insert into T values('a-b'),('aa'),('ac');

প্রশ্ন 1 :

select C
from T
order by C collate SQL_Latin1_General_CP1_CI_AS;

ফলাফল :

|   C |
|-----|
| a-b |
|  aa |
|  ac |

প্রশ্ন 2 :

select C
from T
order by C collate Latin1_General_100_CI_AS;

ফলাফল :

|   C |
|-----|
|  aa |
| a-b |
|  ac |

0

আপনাকে মনে রাখতে হবে যে ননক্লাস্টারড ইনডেক্সের লিফ নোডগুলিতে সূচি পৃষ্ঠা রয়েছে যা ক্লাস্টারিং কী বা ডেটা সারি সনাক্ত করতে RID ধারণ করে।

আপনার যেখানে শর্ত রয়েছে আপনি বলেছেন VeryRandomText = N'111'যেহেতু ওয়েলর্যান্ডম টেক্সটে একটি নন ক্লাস্টারড ইনডেক্স রয়েছে (সূচক তৈরি করুন নন ক্লাস্টারড ইনডেক্স তৈরি করবে আপনি যদি তা পরিষ্কারভাবে একটি ক্লাস্টার তৈরি করতে না বলেন) ডেটা সন্ধান করার সস্তারতম উপায়টি সারিটি সন্ধান করার জন্য সূচকটি স্ক্যান করা এবং তারপরে সারিটির জন্য ডেটা আনুন।

আপনি যদি একটি ক্লাস্টারড সূচক তৈরি করেন

CREATE clustered Index IX_VeryRandomText On dbo.TestTable (VeryRandomText)

অথবা ভেরার্যান্ডম টেক্সটে একটি প্রাথমিক কী আপনি সেই সূচকের স্ক্যান পাবেন scan

বই অনলাইন বা এখানে দেখুন: http://www.sqlforge.com/w/Clustered_index,_nonclustered_index,_or_heap


হ্যাঁ, আপনি কী লিখছেন তা সম্পর্কে আমি অবগত। আপনি দেখতে পাচ্ছেন, টেস্ট টেবিলআইডি-তে ইতিমধ্যে ক্লাস্টারড ইনডেক্স রয়েছে। তবে কথাটি হ'ল- যদি এসকিউএল সার্ভার কলাম ডেটা বিতরণের পরিসংখ্যান দেখতে না পারে (যেমন এই ক্ষেত্রে ডেটা টাইপের অমিলের জন্য সমস্ত সারি মানের ডেটা ধরণের রূপান্তরকরণের প্রয়োজন হওয়া উচিত), তবে এই ক্ষেত্রে ক্লাস্টারড ইনডেক্স স্ক্যান নির্বাচন করা উচিত, সূচী অনুসন্ধান নয় ।
জনিস

এবং নন-ক্লাস্টারড ইনডেক্স সন্ধান / স্ক্যান করা সর্বদা সস্তার নয় - যখন মানগুলি যথাযথভাবে স্বতন্ত্র বা কভারিং সূচক নয় তবে ক্লাস্টারড সূচক স্ক্যান করা সস্তার চেয়ে ভাল হতে পারে।
জুনিস

@ জোনিস আপনার স্ক্রিপ্ট তৈরি সূচকে হিসাব না করে এমন একটি ক্লাস্টারড সূচক তৈরি করবে না যা আপনাকে স্পষ্টভাবে বলতে হবে - একইভাবে যদি আপনি ক্যোয়ারী পরিকল্পনাটি পড়ে থাকেন, সূচী সন্ধান করুন (অবিচ্ছিন্ন)
স্প্ররি

"আপনি যখন প্রাথমিক কী সীমাবদ্ধতা তৈরি করেন, কলাম বা কলামগুলিতে একটি অনন্য ক্লাস্টারড সূচক স্বয়ংক্রিয়ভাবে তৈরি হয় যদি টেবিলের একটি ক্লাস্টারড সূচক ইতিমধ্যে উপস্থিত না থাকে এবং আপনি কোনও অনন্য অবিচ্ছিন্ন সূচক নির্দিষ্ট না করেন।" msdn.microsoft.com/en-us/library/ms186342.aspx
Janis
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.