একটি টেবিল ভেরিয়েবলে একটি সূচক তৈরি করা


189

আপনি কি এসকিউএল সার্ভার 2000 এ টেবিলের ভেরিয়েবলের উপর একটি সূচক তৈরি করতে পারেন?

অর্থাত

DECLARE @TEMPTABLE TABLE (
     [ID] [int] NOT NULL PRIMARY KEY
    ,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL 
)

আমি কি একটি সূচক তৈরি করতে পারি Name?


3
উভয় ধরণের টেম্প টেবিল তৈরিতে ব্যয় হয়; এবং যদি আপনার এত বেশি ডেটা থাকে যাতে আপনার একটি সূচকের প্রয়োজন হয় তবে এটি আসল টেবিলটি ব্যবহার করার সময় হতে পারে; আপনি লেনদেন নিরাপদ হতে সেট আপ যে; স্পিড বা ব্যবহারকারীর আইডি দ্বারা ফিল্টার করুন এবং তারপরে এটি শেষে নিচে সাফ করুন। রিয়েল টেবিলগুলি ভি টেম্প টেবিলগুলির উভয়ই উত্থান এবং ডাউন রয়েছে তবে যদি পারফরম্যান্স সমস্যা হয়; একটি বাস্তব টেবিল দিয়ে এটি চেষ্টা করুন।
u07ch

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

@ বিলাওস্কি এটি একটি টেবিল পরিবর্তনশীল যা একটি টেম্প টেবিল নয়। সারণী ভেরিয়েবলগুলি সুস্পষ্টভাবে নামকরণের প্রতিবন্ধকতাগুলিকে অনুমতি দেয় না, সিস্টেম উত্পন্ন নামগুলি অনন্য হওয়ার গ্যারান্টি। তারা ২০১৪ সাল থেকে নামযুক্ত সূচীগুলিকে অনুমতি দেয় তবে এটি কোনও সমস্যা নয় কারণ সূচিগুলিকে কেবলমাত্র কোনও অবজেক্টের মধ্যে নয় এমন কোনও জিনিসের মধ্যে অনন্যরূপে নামকরণ করা দরকার।
মার্টিন স্মিথ

আমার পয়েন্ট ছিল 2 ভাজ। 1) লেনদেনের জাল এড়াতে কোনও ভেরিয়েবল ব্যবহার করা ছাড়া অন্য কোনও টেম্প টেবিল এবং টেবিল ভেরিয়েবলের মধ্যে কোনও উপাদানগত পার্থক্য নেই। ভি -2000 তে তবে কোনও পরিবর্তনকের সাথে সীমাবদ্ধতা, সূচকগুলি ... যুক্ত করার জন্য কোনও বাক্য গঠন নেই। ২) প্রদত্ত এক পরিবর্তে একটি টেম্প টেবিল ব্যবহার করতে পারে, তালিকাভুক্ত টেবিল সংযোজনগুলির সাথে সূচিগুলির মতো সংঘর্ষ হবে উইল সাথে একই এসপির অনুলিপি কার্যকর করতে যদি স্থির নাম ব্যবহার করা হয়! নীচের প্রক্রিয়াটি স্পষ্টভাবে বিকাশিত হয়েছিল কারণ এসপি ব্যর্থতাগুলিকে আমি এই সঠিক পরিস্থিতিতে সংঘর্ষের নামী সূচকগুলিতে সনাক্ত করেছি। এগুলি অবশ্যই অনন্য হতে হবে।
বিলাওস্কি

1
@ বিলাউসকি - কোনও সূচকের নাম বস্তুর মধ্যে স্বতন্ত্র হওয়ার দরকার নেই - কেবল সীমাবদ্ধতার নামেই । এটি পরীক্ষা করা তুচ্ছ। স্রেফ মৃত্যুদন্ড কার্যকর করুনCREATE TABLE #T1(X INT); CREATE TABLE #T2(X INT); CREATE INDEX IX ON #T1(X); CREATE INDEX IX ON #T2(X);
মার্টিন স্মিথ

উত্তর:


362

প্রশ্নটি এসকিউএল সার্ভার 2000-এ ট্যাগ করা হয়েছে তবে সর্বশেষ সংস্করণে বিকাশমান মানুষের সুবিধার জন্য আমি প্রথমে এটি সম্বোধন করব।

এসকিউএল সার্ভার 2014

এসকিউএল সার্ভার ২০১৪-এর নীচে আলোচিত সীমাবদ্ধতা ভিত্তিক সূচকগুলি যুক্ত করার পদ্ধতিগুলি ছাড়াও অনন্য অনন্য সূচকগুলিকে সরাসরি টেবিলের পরিবর্তনশীল ঘোষণায় ইনলাইন সিনট্যাক্সের সাথে নির্দিষ্ট করার অনুমতি দেয়।

উদাহরণস্বরূপ সিনট্যাক্স নীচে।

/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
       INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);

অন্তর্ভুক্ত কলামগুলির সাথে ফিল্টার করা সূচি এবং সূচকগুলি বর্তমানে এই সিনট্যাক্সের সাহায্যে ঘোষণা করা যাবে না তবে এসকিউএল সার্ভার 2016 এটিকে আরও কিছুটা শিথিল করে। সিটিপি ৩.১ থেকে এখন টেবিল ভেরিয়েবলের জন্য ফিল্টারড সূচকগুলি ঘোষণা করা সম্ভব। আরটিএম দ্বারা এটি এমন ক্ষেত্রে হতে পারে যা অন্তর্ভুক্ত কলামগুলিও অনুমোদিত হয় তবে বর্তমান অবস্থানটি হ'ল তারা "সংস্থানীয় সংস্থাগুলির কারণে সম্ভবত এটি এসকিউএল 16 তে পরিণত করবে না"

/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)

এসকিউএল সার্ভার 2000 - 2012

আমি কি নামের উপর একটি সূচক তৈরি করতে পারি?

সংক্ষিপ্ত উত্তর: হ্যাঁ

DECLARE @TEMPTABLE TABLE (
  [ID]   [INT] NOT NULL PRIMARY KEY,
  [Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
  UNIQUE NONCLUSTERED ([Name], [ID]) 
  ) 

আরও বিস্তারিত উত্তর নীচে।

SQL সার্ভার ঐতিহ্যগত টেবিল হয় একটি ক্লাস্টার সূচক থাকতে পারে বা হিসাবে গঠিত হয় গাদা

ক্লাস্টারড ইনডেক্সগুলি হ'ল ডুপ্লিকেট কী মানগুলি অস্বীকার করার জন্য অনন্য হিসাবে ঘোষণা করা যেতে পারে বা অনন্যকে অনন্য হিসাবে নির্ধারণ করা যেতে পারে। যদি অনন্য না হয় তবে এসকিউএল সার্ভার নীরবে কোনও অনুলিপি কীগুলিকে অনন্য করে তুলতে একটি অনন্যতা যুক্ত করে।

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

এসকিউএল সার্ভারে 2000 - 2012 সারণী ভেরিয়েবলগুলিতে সূচকগুলি কেবল UNIQUEবা PRIMARY KEYবাধা তৈরি করেই স্পষ্টত তৈরি করা যায় । এই সীমাবদ্ধতার ধরণের মধ্যে পার্থক্য হ'ল প্রাথমিক কীটি অবশ্যই ননীয় কলামে থাকা উচিত। একটি অনন্য সীমাবদ্ধতায় অংশ নেওয়া কলামগুলি শুল্কযুক্ত হতে পারে। (যদিও এসকিউএল সার্ভারের উপস্থিতিতে অনন্য প্রতিবন্ধকতার প্রয়োগ NULLএসকিউএল স্ট্যান্ডার্ডে উল্লিখিত অনুযায়ী নেই)। এছাড়াও একটি সারণীতে কেবলমাত্র একটি প্রাথমিক কী থাকতে পারে তবে একাধিক অনন্য বাধা থাকতে পারে।

এই উভয় যৌক্তিক প্রতিবন্ধকতা একটি অনন্য সূচক সহ শারীরিকভাবে প্রয়োগ করা হয়। যদি স্পষ্টভাবে নির্দিষ্ট না করা হয় অন্যথায় এটি PRIMARY KEYক্লাস্টারড ইনডেক্সে পরিণত হবে এবং অযৌক্তিক বাঁধাগুলি অ ক্লাস্টারযুক্ত নয় তবে এই আচরণটি সীমাবদ্ধতার ঘোষণার (উদাহরণ বাক্য সংশ্লেষ) দ্বারা নির্দিষ্ট CLUSTEREDবা NONCLUSTEREDস্পষ্ট করেই এই আচরণটি ওভাররাইড করা যেতে পারে

DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)

উপরের ফলাফল হিসাবে নিম্নলিখিত সূচীগুলি স্পষ্টতই এসকিউএল সার্ভার 2000 - 2012-এ সারণি ভেরিয়েবলগুলিতে তৈরি করা যেতে পারে।

+-------------------------------------+-------------------------------------+
|             Index Type              | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index              | Yes                                 |
| Nonunique Clustered Index           |                                     |
| Unique NCI on a heap                | Yes                                 |
| Non Unique NCI on a heap            |                                     |
| Unique NCI on a clustered index     | Yes                                 |
| Non Unique NCI on a clustered index | Yes                                 |
+-------------------------------------+-------------------------------------+

শেষটির কিছুটা ব্যাখ্যা দরকার। এই উত্তরটির শুরুতে টেবিলের পরিবর্তনশীল সংজ্ঞাটিতে অনন্য অনন্য ক্লাস্টারযুক্ত সূচকটি অনন্য সূচক Nameদ্বারা সিমুলেটেড করা হয়েছে (মনে রাখবেন যে এসকিউএল সার্ভার নিঃশব্দে ক্লাস্টারড ইনডেক্স কীটি কোনওভাবেই অদ্বিতীয় এনসিআই কীতে যুক্ত করবে)।Name,Id

কোনও অনন্য ক্লাস্টারড সূচকটি ম্যানুয়ালি IDENTITYএকটি কালিমা যুক্ত করে একটি স্বতন্ত্রকরণ হিসাবে কাজ করার জন্যও অর্জন করা যেতে পারে ।

DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)

তবে এটি কোনও অনন্য ক্লাস্টারড সূচক সাধারণত কীভাবে এসকিউএল সার্ভারে বাস্তবায়িত হবে তার সঠিক সিমুলেশন নয় কারণ এটি সমস্ত সারিতে "ইউনিকফায়ার" যুক্ত করে। যেগুলি কেবল এটির প্রয়োজন তা নয়।


1
দ্রষ্টব্য: 2000-2012 সমাধান কেবল টেক্সট কলাম <= 900 বাইট হলেই কাজ করে। অর্থাত। বর্ণচর (900), এনভারচর (450)
আন্দ্রে

1
@ আন্ড্রেফিগুইরেডো হ্যাঁ, সেই সংস্করণগুলিতে স্থায়ী টেবিলগুলিতে একটি সূচক কীটির সর্বাধিক আকার।
মার্টিন স্মিথ

1
আমি কেবল লক্ষ করতে চেয়েছিলাম যে এসকিউএল ২০১৪ উত্তর অ্যাজুরেতে ভাল কাজ করে। ধন্যবাদ মার্টিন!
জ্যাক্সিডিয়ান

13

এটি বোঝা উচিত যে পারফরম্যান্সের দৃষ্টিকোণ থেকে @temp টেবিল এবং # টিম্প টেবিলগুলির মধ্যে কোনও পার্থক্য নেই যা ভেরিয়েবলের পক্ষে হয়। তারা একই জায়গায় থাকে (টেম্পডবি) এবং একইভাবে প্রয়োগ করা হয়। সমস্ত বৈশিষ্ট্য অতিরিক্ত বৈশিষ্ট্যগুলিতে প্রদর্শিত হবে। এই আশ্চর্যজনকভাবে সম্পূর্ণ লিখনআপ দেখুন: /dba/16385/whats-the-differences-between-a-temp-table-and-table-variable-in-sql-server/16386#16386

যদিও এমন কিছু ক্ষেত্রে রয়েছে যখন কোনও টেম্প টেবিল ব্যবহার করা যায় না যেমন টেবিল বা স্কেলার ফাংশনগুলিতে, v2016 এর আগে বেশিরভাগ অন্যান্য ক্ষেত্রে (এমনকি ফিল্টারড সূচীগুলি কোনও টেবিলের পরিবর্তনশীলতে যোগ করা যায়) আপনি কেবল # টেম্প টেবিলটি ব্যবহার করতে পারেন।

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

নামের সংঘর্ষ এড়াতে, এর মতো কিছু সাধারণত কাজ করে:

declare @cmd varchar(500)='CREATE NONCLUSTERED INDEX [ix_temp'+cast(newid() as varchar(40))+'] ON #temp (NonUniqueIndexNeeded);';
exec (@cmd);

এটি একই পদ্ধতির একযোগে মৃত্যুদন্ডের মধ্যেও নাম সর্বদা অনন্য ins



1
নামযুক্ত সূচকগুলিতে কোনও সমস্যা নেই - সূচিগুলির কেবলমাত্র একটি টেবিলের মধ্যে অনন্যরূপে নাম রাখতে হবে। সমস্যাটি নামযুক্ত প্রতিবন্ধকতাগুলির সাথে এবং সর্বোত্তম সমাধানটি সাধারণত টেম্প টেবিলগুলিতে তাদের নাম না রাখাই - নামযুক্ত প্রতিবন্ধকতাগুলি টেম্প টেবিল অবজেক্ট ক্যাচিং প্রতিরোধ করে।
মার্টিন স্মিথ

1
এটি অবশ্যই কিছু নির্দিষ্ট সংস্করণের জন্য সত্য হতে হবে (এটি যদি কোনও সংস্করণের ক্ষেত্রে সত্য হয়)। আমাকে এই কাজের সাথে বিশেষভাবে আসতে হয়েছিল কারণ আমি এক সাথে মৃত্যুদন্ড কার্যকর করার সময় নামকরণের সূচকের সংঘর্ষে এসপি ব্যর্থতা খুঁজে পেয়েছি।
বিলাওস্কি

@ বিলাওসকি আপনি কি 2016 ব্যবহার করছেন? টেম্প টেবিলগুলিতে নামযুক্ত সূচকগুলি সমবর্তী পরিবেশের জন্য ঝুঁকি কিনা তা সম্পর্কে আমি খুব আগ্রহী am
এলাস্কানেটর 21

1
@ এলাসকানোটার হ্যাঁ, তারা হ'ল আমরা ভারী থাকা অবস্থায় এসকিউএল মেটা ডেটা টেবিলগুলিতে তর্ক খুঁজে পেয়েছি, সূচকের নাম মুছে ফেলা সমস্যার সমাধান করেছে। এটি ছিল এসকিউএল 2016.
ড্যান Def

0

টেবিল ভেরিয়েবলের যদি বড় ডেটা থাকে তবে টেবিল ভেরিয়েবলের পরিবর্তে (@ টেবিল) টেম্প টেবিল (# টেবিল) তৈরি করুন t টেবিল ভেরিয়েবল সন্নিবেশের পরে সূচি তৈরি করতে দেয় না।

 CREATE TABLE #Table(C1 int,       
  C2 NVarchar(100) , C3 varchar(100)
  UNIQUE CLUSTERED (c1) 
 ); 
  1. অনন্য ক্লাস্টার ইনডেক্স সহ টেবিল তৈরি করুন

  2. টেম্প "# টেবিল" সারণিতে ডেটা .োকান

  3. ক্লাস্টারযুক্ত নীতিমালা তৈরি করুন।

     CREATE NONCLUSTERED INDEX IX1  ON #Table (C2,C3);

অপ্রয়োজনীয় বাছাই এড়াতে সন্নিবেশ বিবৃতি দেওয়ার পরে সূচি তৈরি করুন
বুপাঠি।ইন্ডোটনেট

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