سؤال

إذا قمت بإنشاء طريقة عرض مفهرسة (في SQL Server 2008) ، فهل هذا يعني أنني نسخ جميع البيانات من جداول المصدر إلى جدول جديد منفصل؟ أم أن بعض المؤشرات/الفهارس الصغيرة المحفوظة ، لتمثيل هذا الرأي؟

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

المحلول

نعم ، يتم نسخ البيانات وتخزينها بشكل منفصل ، لذلك إذا قمت بتعديل الجدول الأساسي ، فسيتم تحديث العرض المفهرس الخاص بك تلقائيًا. هذا يسبب الكثير من خلاف القفل. كما قد تنمو العرض المفهرس أكبر من الجداول الأساسية وتصبح نتائج عكسية.

نصائح أخرى

نعم ، يتم نسخ البيانات. تشير منصات قاعدة بيانات أخرى مثل Oracle إلى هذا وجهة نظر تجسد لأن البيانات سوف تتحقق في شكل مادي.

عند إنشاء فهرس مجموعات فريد من نوعه ، يتم تخزين مجموعة النتائج في قاعدة البيانات تمامًا مثل الجدول الذي يحتوي على فهرس متجمع.

نظرًا لأن التعديلات يتم على البيانات في الجداول الأساسية ، تنعكس تعديلات البيانات في البيانات المخزنة في العرض المفهرس

~ من MSDN

يمكنك استخدام (غير موثق ولكن يستخدم على نطاق واسع) DBCC PAGE أمر لرؤية بالضبط ما يتم تخزينه. سيقوم ما يلي بإنشاء طريقة عرض مفهرسة وطباعة محتويات صفحة البيانات الأولى.

SET NOCOUNT ON
IF OBJECT_ID('tempdb..#dbcc_ind') IS NOT NULL
    TRUNCATE TABLE #dbcc_ind
ELSE
    CREATE TABLE #dbcc_ind
    (PageFID  TINYINT, 
    PagePID INT,   
    IAMFID   TINYINT, 
    IAMPID  INT, 
    ObjectID  INT,
    IndexID  TINYINT,
    PartitionNumber TINYINT,
    PartitionID BIGINT,
    iam_chain_type  VARCHAR(30),    
    PageType  TINYINT, 
    IndexLevel  TINYINT,
    NextPageFID  TINYINT,
    NextPagePID  INT,
    PrevPageFID  TINYINT,
    PrevPagePID INT, 
    PRIMARY KEY (PageFID, PagePID));

IF OBJECT_ID('dbo.vtest') IS NULL
CREATE TABLE dbo.vtest (
i INT IDENTITY(1,1)  NOT NULL PRIMARY KEY,
c1 CHAR(500) NOT NULL DEFAULT REPLICATE('x',500), 
c2 CHAR(500) NOT NULL DEFAULT REPLICATE('y',500) 
)
GO

INSERT INTO dbo.vtest DEFAULT VALUES
GO 10

IF OBJECT_ID('dbo.ixViewTest') IS NULL
BEGIN
EXEC('CREATE VIEW dbo.ixViewTest
WITH SCHEMABINDING
AS
SELECT i,c1,c2
FROM dbo.vtest;')
EXEC('CREATE UNIQUE CLUSTERED INDEX [cix] ON [dbo].[ixViewTest] ([i] ASC)')
END
GO


DECLARE @command VARCHAR(1000)
SET @command = 'DBCC IND(' + QUOTENAME(DB_NAME()) + ', ixViewTest,1) WITH NO_INFOMSGS;'

INSERT INTO #dbcc_ind
    EXEC ( @command );


SELECT @command= 'DBCC PAGE (' + QUOTENAME(DB_NAME()) + ',' + CAST(PageFID AS VARCHAR(5)) + ',' + CAST(PagePID AS VARCHAR(10)) + ',1) ;'
FROM #dbcc_ind
WHERE PageType=1
 AND PrevPagePID=0


DBCC TRACEON(3604)
EXEC ( @command )
DBCC TRACEOFF(3604)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top