এসকিউএল সার্ভার এনভারচর (সর্বাধিক) বনাম এনভারচচার (এন) কর্মক্ষমতা প্রভাবিত করে


16

এটি এসকিউএল সার্ভার 2008 আর 2 এসপি 2। আমার 2 টি টেবিল আছে উভয়ই অভিন্ন (তথ্য এবং সূচি), প্রথম টেবিলের মতো একটি VALUE কলাম রয়েছে nvarchar(max)এবং দ্বিতীয়টিতে একই কলাম রয়েছে nvarchar(800)। এই কলামটি একটি ক্লাস্টারযুক্ত সূচীতে অন্তর্ভুক্ত। আমি উভয় টেবিলে একটি ক্লাস্টার্ড সূচক তৈরি করেছি। আমি সূচিগুলিও আবার তৈরি করেছি। এই কলামে সর্বাধিক স্ট্রিংয়ের দৈর্ঘ্য 650।

যদি আমি উভয় nvarchar(800)টেবিলের বিপরীতে একই প্রশ্নটি চালিত করি তবে ধারাবাহিকভাবে দ্রুত হয়, বহুগুণ দ্বিগুণ দ্রুত। নিশ্চিত মনে হচ্ছে এটি "বারচর" এর উদ্দেশ্যকে পরাস্ত করছে। সারণীতে 800,000+ সারি রয়েছে। ক্যোয়ারীটি প্রায় 110,000 সারিগুলির দিকে লক্ষ্য করা উচিত (যা পরিকল্পনা অনুসারে অনুমান করে)।

আইও পরিসংখ্যান অনুসারে কোনও লব পঠিত নেই, তাই সমস্ত কিছু সারিতে উপস্থিত রয়েছে বলে মনে হয়। দুটি টেবিলের মধ্যে ব্যয় শতাংশের তুলনায় সামান্য পার্থক্য ছাড়া এবং এক্সিকিউশন প্ল্যানগুলি একই হয় nvarchar(max)( আনুমানিক সারির আকারের তুলনায় 63১ বাইট বনাম by৩ বাইট) is পঠনের সংখ্যাও বেশ একই রকম।

কেন পার্থক্য?

===== স্কিমা ======

 CREATE TABLE [dbo].[table1](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [ProductID] [bigint] NOT NULL,
        [ProductSkeletonID] [bigint] NOT NULL,
        [Value] [nvarchar](max) NOT NULL,
        [IsKeywordSearchable] [bit] NULL,
        [ValueInteger] [bigint] NULL,
        [ValueDecimal] [decimal](18, 2) NULL,
        [ValueDate] [datetime] NULL,
        [TypeOfData] [nvarchar](20) NOT NULL,
     CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    CREATE NONCLUSTERED INDEX [IX_table1_productskeletonid] ON [dbo].[table1] 
    (
        [ProductSkeletonID] ASC
    )
    INCLUDE ( [ProductID],
    [Value]) 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]

    CREATE TABLE [dbo].[table2](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [ProductID] [bigint] NOT NULL,
        [ProductSkeletonID] [bigint] NOT NULL,
        [Value] [nvarchar](800) NOT NULL,
        [IsKeywordSearchable] [bit] NULL,
        [ValueInteger] [bigint] NULL,
        [ValueDecimal] [decimal](18, 2) NULL,
        [ValueDate] [datetime] NULL,
        [TypeOfData] [nvarchar](20) NOT NULL,
     CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    CREATE NONCLUSTERED INDEX [IX_table2_productskeletonid] ON [dbo].[table2] 
    (
        [ProductSkeletonID] ASC
    )
    INCLUDE ( [ProductID],
    [Value]) 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]


CREATE TABLE [dbo].[table_results](
    [SearchID] [bigint] NOT NULL,
    [RowNbr] [int] NOT NULL,
    [ProductID] [bigint] NOT NULL,
    [PermissionList] [varchar](250) NULL,
    [SearchWeight] [int] NULL,
 CONSTRAINT [PK_table_results] PRIMARY KEY NONCLUSTERED 
(
    [SearchID] ASC,
    [RowNbr] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_table_results_SearchID] ON [dbo].[cart_product_searches_results] 
(
    [SearchID] ASC
)
INCLUDE ( [ProductID]) 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]

===== সারণি 1 ক্যোয়ারী ======

    SELECT cppev.ProductSkeletonID, cppev.Value, COUNT(*) AS Value FROM table1 cppev
    JOIN search_results cpsr ON cppev.ProductID = cpsr.ProductID AND cpsr.SearchID = 227568 
    WHERE cppev.ProductSkeletonID in (3191, 3160, 3158, 3201)
    GROUP BY cppev.ProductSkeletonID, cppev.Value

    Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'table1'. Scan count 4, logical reads 582, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'table_results'. Scan count 1, logical reads 82, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    SQL Server Execution Times:
       CPU time = 1373 ms,  elapsed time = 1576 ms.

 |--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(int,[Expr1008],0)))
       |--Stream Aggregate(GROUP BY:([cppev].[Value], [cppev].[ProductSkeletonID]) DEFINE:([Expr1008]=Count(*)))
            |--Sort(ORDER BY:([cppev].[Value] ASC, [cppev].[ProductSkeletonID] ASC))
                 |--Hash Match(Inner Join, HASH:([cpsr].[ProductID])=([cppev].[ProductID]), RESIDUAL:([dbo].[table1].[ProductID] as [cppev].[ProductID]=[dbo].[table_results].[ProductID] as [cpsr].[ProductID]))
                      |--Index Seek(OBJECT:([dbo].[table_results].[IX_table_results_SearchID] AS [cpsr]), SEEK:([cpsr].[SearchID]=(227568)) ORDERED FORWARD)
                      |--Index Seek(OBJECT:([dbo].[table1].[IX_table1_productskeletonid] AS [cppev]), SEEK:([cppev].[ProductSkeletonID]=(3158) OR [cppev].[ProductSkeletonID]=(3160) OR [cppev].[ProductSkeletonID]=(3191) OR [cppev].[ProductSkeletonID]=(3201)) ORDERED FORWARD)

===== টেবিল 2 ক্যোয়ারী ======

    SELECT cppev.ProductSkeletonID, cppev.Value, COUNT(*) AS Value FROM table2 cppev
    JOIN table_results cpsr ON cppev.ProductID = cpsr.ProductID AND cpsr.SearchID = 227568 
    WHERE cppev.ProductSkeletonID in (3191, 3160, 3158, 3201)
    GROUP BY cppev.ProductSkeletonID, cppev.Value

    Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'table2'. Scan count 4, logical reads 584, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'table_results'. Scan count 1, logical reads 82, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    SQL Server Execution Times:
       CPU time = 484 ms,  elapsed time = 796 ms.

  |--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(int,[Expr1008],0)))
       |--Stream Aggregate(GROUP BY:([cppev].[Value], [cppev].[ProductSkeletonID]) DEFINE:([Expr1008]=Count(*)))
            |--Sort(ORDER BY:([cppev].[Value] ASC, [cppev].[ProductSkeletonID] ASC))
                 |--Hash Match(Inner Join, HASH:([cpsr].[ProductID])=([cppev].[ProductID]), RESIDUAL:([auctori_core_v40_D].[dbo].[table2].[ProductID] as [cppev].[ProductID]= [dbo].[table2].[ProductID] as [cpsr].[ProductID]))
                      |--Index Seek(OBJECT:([dbo].[table_results].[IX_table_results_SearchID] AS [cpsr]), SEEK:([cpsr].[SearchID]=(227568)) ORDERED FORWARD)
                      |--Index Seek(OBJECT:([dbo].[table2].[IX_table2_productskeletonid] AS [cppev]), SEEK:([cppev].[ProductSkeletonID]=(3158) OR [cppev].[ProductSkeletonID]=(3160) OR [cppev].[ProductSkeletonID]=(3191) OR [cppev].[ProductSkeletonID]=(3201)) ORDERED FORWARD)

4
প্রশ্ন, টেবিল স্কিমা, নমুনা বা সূচক ডেটা এবং প্রতিটি প্রশ্নের জন্য কার্যকর করার পরিকল্পনা করুন। "আমি মনে করি না ..." "সেখানে অবশ্যই নেই ..." এর মতো নয় isn't
মার্ক স্টোরি-স্মিথ

আপনার কাছে এসকিউএল সার্ভারের কোন সংস্করণ রয়েছে?
ম্যাক্স ভার্নন

এনভারচর (সর্বাধিক) ক্ষেত্রগুলির জন্য ইন-সারি স্টোরেজ সম্পর্কে বিশদ জানতে টেকনিক.মাইক্রোসফট.com/en -us/library/ms189087(v=SQL.105).aspx দেখুন। এই ক্ষেত্রগুলির প্রকৃত ডেটা কত বড়?
ম্যাক্স ভার্নন

আমি উপরের প্রতিক্রিয়া সম্বোধন করতে পোস্টটি আপডেট করেছি।
ব্রায়ান বোহল

উত্তর:


14

আপনি MAXধরণের ব্যবহারের ব্যয় ওভারহেড দেখছেন ।

যদিও NVARCHAR(MAX)অভিন্ন NVARCHAR(n)TSQL এবং ইন-সারি সংরক্ষণ করা যেতে পারে, এটা স্টোরেজ ইঞ্জিন দ্বারা আলাদাভাবে ঘাঁটা কারণ এটি বন্ধ-সারি ধাক্কা করা যাবে। অফ-সারিতে এটি LOB_DATAবরাদ্দ ইউনিটের পরিবর্তে ROW_OVERFLOW_DATAবরাদ্দ ইউনিট এবং আমরা আপনার পর্যবেক্ষণ থেকে ধরে নিতে পারি যে এটি একটি ওভারহেড বহন করে।

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

আমরা সম্ভবত এটা অনুমান করতে পারেন GROUP BYউপর MAXকলাম যে আপনার ক্ষেত্রে কর্মক্ষমতা পার্থক্য ঘটায়। আমি অন্য MAXধরণের অপারেশনগুলিতে কোনও ধরণের পরীক্ষা করিনি তবে এটি করা আকর্ষণীয় হতে পারে এবং একইরকম ফলাফল দেখা যায় কিনা তা দেখুন।


সুতরাং আপনি বলছেন যে একটি [বিএলওবি ইনলাইন ডেটা] বনাম একটি সরল 'ওল বারচার পড়ার অতিরিক্ত প্রক্রিয়াজাতকরণ রয়েছে? আমি উল্লেখযোগ্য ওভারহেডের প্রত্যাশা করছিলাম যদি এটি সারি বন্ধ হয়ে যায় তবে এই সমস্ত ডেটা ইনলাইন (ব্যবহৃত ডিবিসিসি ইনড)। এবং আপনি কেন মনে করেন যে এই গোষ্ঠীটি এটিকে সামনে এনেছে?
ব্রায়ান বোহল

এটি পড়ার জন্য একটি সামান্য ওভারহেড, এটিতে কোনও গণনার জন্য প্রচুর উদাহরণ GROUP BY। @ রেমুস রুসানু সম্ভবত কিছু অন্তর্দৃষ্টি দিতে পারে (তিনি আশা করি পিংটি দেখবেন)।
মার্ক স্টোরি-স্মিথ

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