سؤال

يمكنك إنشاء index على متغير الجدول في SQL Server 2000?

بمعنى آخر

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

هل يمكنني إنشاء فهرس على الاسم؟

هل كانت مفيدة؟

المحلول

يتم تمييز السؤال SQL Server 2000 SQL Server 2000 ولكن لصالح الأشخاص المتطورين في أحدث إصدار، سأعالج ذلك أولا.

SQL Server 2014.

بالإضافة إلى طرق إضافة الفهارس القائمة على قيد القيد ناقش أدناه SQL Server 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*/
);

لا يمكن الإعلان حاليا الإعلان عن الفهارس والمفهوت مع الأعمدة المضمنة مع بناء الجملة هذا SQL Server 2016. يرتاح هذا أكثر قليلا. من CTP 3.1 أصبح من الممكن الآن إعلان الفهارس المصفاة لمتغيرات الجدول. بواسطة RTM ذلك مايو كن الحال المسموح به الأعمدة المضمنة ولكن الوضع الحالي هو أنهم "من المحتمل ألا يجعلها على الأرجح SQL16 بسبب قيود الموارد"

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

SQL Server 2000 - 2012

هل يمكنني إنشاء فهرس على الاسم؟

إجابة قصيرة: نعم.

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

إجابة أكثر تفصيلا أدناه.

الجداول التقليدية في SQL Server يمكن أن يكون إما فهرس متفاوت المسافات أو هي منظم أكوام.

يمكن الإعلان عن فهارس متفاوت المسافات فريدة من نوعها لعدم السماح بالقيم الرئيسية المكررة أو الافتراضي إلى غير فريدة من نوعها. إذا لم تكن فريدة من نوعها ثم يضيف SQL Server بصمت onlaceifier. إلى أي مفاتيح مكررة لجعلها فريدة من نوعها.

يمكن أيضا الإعلان عن المؤشرات غير المتراكبة بشكل صريح. خلاف ذلك بالنسبة للحالة غير الفريدة SQL Server يضيف محدد الصف (مفتاح الفهرس المسافات أو يتخلص للحصول على كومة) لجميع مفاتيح الفهرس (ليس فقط التكرارات) يضمن ذلك مرة أخرى أنها فريدة من نوعها.

في SQL Server 2000 - 2012 Versions على متغيرات الجدول يمكن إنشاء فقط ضمنيا عن طريق إنشاء UNIQUE أو PRIMARY KEY قيد. الفرق بين أنواع القيد هذه هي أن المفتاح الأساسي يجب أن يكون على عمود (أعمدة) غير مطلقة. قد تكون الأعمدة المشاركة في قيد فريد. (على الرغم من تنفيذ SQL Server للقيود الفريدة في وجود NULLS ليس حسب المحدد في معيار SQL). أيضا يمكن أن يكون للجدول مفتاح أساسي واحد فقط ولكن قيود فريدة متعددة.

يتم تنفيذه كل من هذه القيود المنطقية جسديا بمؤشر فريد من نوعه. إذا لم ينص على خلاف ذلك بشكل صريح PRIMARY KEY سوف تصبح الفهرس المتراكب والقيود الفريدة غير المتراكبة ولكن يمكن تجاوز هذا السلوك من خلال تحديد CLUSTERED أو NONCLUSTERED صراحة مع إعلان القيد (مثال بناء الجملة)

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

نتيجة لما ذكر أعلاه، يمكن إنشاء الفهارس التالية ضمنا على متغيرات الجدول في SQL Server 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 (أذكر أن SQL Server سيقوم بصمت بإضافة مفتاح الفهرس متفاوت المسافات إلى مفتاح NCI غير الفريد على أي حال).

كما يمكن تحقيق مؤشر متفاوت المسافات غير الفريد من خلال إضافة يدويا IDENTITY عمود للعمل كمسؤولين.

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

ولكن هذه ليست محاكاة دقيقة لكيفية تنفيذ مؤشر مفكك غير فريد من نوعه عادة في SQL Server لأن هذا يضيف "onconsionifier" لجميع الصفوف. ليس فقط تلك التي تتطلب ذلك.

نصائح أخرى

يجب أن يكون مفهوما أنه من وجهة نظر الأداء لا توجد اختلافات بين جداول Temp وجداول #TEMP التي تفضل المتغيرات. إنهم يقيمون في نفس المكان (tempdb) ويتم تنفيذه بنفس الطريقة. تظهر جميع الاختلافات في ميزات إضافية. راجع هذا كتابة كاملة بشكل مثير للدهشة: https://dba.stackexchange.com/questions/16385/Whats-tifference-between--temp-table-table-table-table-varable-varable-sql-server/16386#16386.

على الرغم من وجود حالات حيث لا يمكن استخدام جدول مؤقت، لا يمكن استخدام جدول TEMP مثل الجدول أو الوظائف العددية، لأن معظم الحالات الأخرى قبل V2016 (حيث يمكن إضافة الفهارس الموجودة حتى إلى متغير جدول) يمكنك ببساطة استخدام جدول #temp.

العيب لاستخدام الفهارس المسماة (أو القيود) في tempdb هو أن الأسماء يمكن أن تصطدم بعد ذلك. ليس من الناحية النظرية فقط مع الإجراءات الأخرى ولكن في كثير من الأحيان بسهولة مع مثيلات أخرى للإجراءات نفسها والتي ستحاول وضع نفس الفهرس على نسختها من جدول #TEMP.

لتجنب اشتباكات الاسم، شيء مثل هذا يعمل عادة:

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

هذا يؤمن أن الاسم هو دائما فريد من نوعه بين الإعدام المتزامن لنفس الإجراء.

إذا كان متغير الجدول يحتوي على بيانات كبيرة، ثم بدلا من متغير الجدول (@ Lable) إنشاء جدول TEMP (#table). لا يسمح المتغير القابل للحياة بإنشاء فهرس بعد إدراجه.

 CREATE TABLE #Table(C1 int,       
  C2 NVarchar(100) , C3 varchar(100)
  UNIQUE CLUSTERED (c1) 
 ); 
  1. إنشاء جدول مع فهرس متفاوت المسافات الفريدة

  2. أدخل البيانات في جدول TEMP "#Table"

  3. إنشاء فهارس غير متفاوت المسافات.

     CREATE NONCLUSTERED INDEX IX1  ON #Table (C2,C3);
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top