বড় টেবিলগুলিতে এসকিউএল সার্ভার কোয়েরি কার্যকারিতা উন্নত করুন


85

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

সর্বাধিক আপডেট হওয়া 100 টি রেকর্ড ফেরত দিতে একটি সাধারণ ক্যোয়ারী চালানো:

select top 100 * from ER101_ACCT_ORDER_DTL order by er101_upd_date_iso desc

কয়েক মিনিট সময় নেয়। নীচে বাস্তবায়ন পরিকল্পনা দেখুন:

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

টেবিল স্ক্যান থেকে অতিরিক্ত বিশদ:

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

SQL Server Execution Times:
  CPU time = 3945 ms,  elapsed time = 148524 ms.

সার্ভারটি বেশ শক্তিশালী (মেমরির 48 গিগাবাইট র‌্যাম, 24 কোর প্রসেসর থেকে) এসকিএল সার্ভারে চালিত 2008 আর 2 এক্স 64।

হালনাগাদ

আমি এই কোডটি 1,000,000 রেকর্ড সহ একটি টেবিল তৈরি করতে পেয়েছি। আমি ভেবেছিলাম যে SELECT TOP 100 * FROM testEnvironment ORDER BY mailAddress DESCসার্ভারে আমার ডিস্ক অ্যাক্সেসের গতি খুব কম কিনা তা জানতে আমি কয়েকটি আলাদা সার্ভারে চালিত করতে পারি ।

WITH t1(N) AS (SELECT 1 UNION ALL SELECT 1),
t2(N) AS (SELECT 1 FROM t1 x, t1 y),
t3(N) AS (SELECT 1 FROM t2 x, t2 y),
Tally(N) AS (SELECT TOP 98 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM t3 x, t3 y),
Tally2(N) AS (SELECT TOP 5 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM t3 x, t3 y),
Combinations(N) AS (SELECT DISTINCT LTRIM(RTRIM(RTRIM(SUBSTRING(poss,a.N,2)) + SUBSTRING(vowels,b.N,1)))
                    FROM Tally a
                    CROSS JOIN Tally2 b
                    CROSS APPLY (SELECT 'B C D F G H J K L M N P R S T V W Z SCSKKNSNSPSTBLCLFLGLPLSLBRCRDRFRGRPRTRVRSHSMGHCHPHRHWHBWCWSWTW') d(poss)
                    CROSS APPLY (SELECT 'AEIOU') e(vowels))
SELECT IDENTITY(INT,1,1) AS ID, a.N + b.N AS N
INTO #testNames
FROM Combinations a 
CROSS JOIN Combinations b;

SELECT IDENTITY(INT,1,1) AS ID, firstName, secondName
INTO #testNames2
FROM (SELECT firstName, secondName
      FROM (SELECT TOP 1000 --1000 * 1000 = 1,000,000 rows
            N AS firstName
            FROM #testNames
            ORDER BY NEWID()) a
      CROSS JOIN (SELECT TOP 1000 --1000 * 1000 = 1,000,000 rows
                  N AS secondName
                  FROM #testNames
                  ORDER BY NEWID()) b) innerQ;

SELECT firstName, secondName,
firstName + '.' + secondName + '@fake.com' AS eMail,
CAST((ABS(CHECKSUM(NEWID())) % 250) + 1 AS VARCHAR(3)) + ' ' AS mailAddress,
(ABS(CHECKSUM(NEWID())) % 152100) + 1 AS jID,
IDENTITY(INT,1,1) AS ID
INTO #testNames3
FROM #testNames2

SELECT IDENTITY(INT,1,1) AS ID, firstName, secondName, eMail, 
mailAddress + b.N + b.N AS mailAddress
INTO testEnvironment
FROM #testNames3 a
INNER JOIN #testNames b ON a.jID = b.ID;

--CLEAN UP USELESS TABLES
DROP TABLE #testNames;
DROP TABLE #testNames2;
DROP TABLE #testNames3;

তবে তিনটি পরীক্ষার সার্ভারে ক্যোয়ারী প্রায় তাত্ক্ষণিকভাবে চলেছিল। কেউ কি এই ব্যাখ্যা করতে পারেন?

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

আপডেট 2

মন্তব্যের জন্য আপনাকে ধন্যবাদ - দয়া করে তাদের আগত রাখুন ... তারা আমাকে ক্লাস্টারবিহীন থেকে ক্লাস্টার না করে বরং আকর্ষণীয় (এবং অপ্রত্যাশিত?) ফলাফলের সাথে প্রাথমিক কী সূচকটি পরিবর্তন করার চেষ্টা করেছিল।

ক্লাস্টারবিহীন:

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

SQL Server Execution Times:
  CPU time = 3634 ms,  elapsed time = 154179 ms.

ক্লাস্টার্ড:

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

SQL Server Execution Times:
  CPU time = 2650 ms,  elapsed time = 52177 ms.

এটা কিভাবে সম্ভব? Er101_upd_date_iso কলামে একটি সূচি ছাড়া একটি ক্লাস্টারড ইনডেক্স স্ক্যানটি কীভাবে ব্যবহার করা যেতে পারে?

আপডেট 3

অনুরোধ হিসাবে- এটি তৈরি টেবিল স্ক্রিপ্ট:

CREATE TABLE [dbo].[ER101_ACCT_ORDER_DTL](
    [ER101_ORG_CODE] [varchar](2) NOT NULL,
    [ER101_ORD_NBR] [int] NOT NULL,
    [ER101_ORD_LINE] [int] NOT NULL,
    [ER101_EVT_ID] [int] NULL,
    [ER101_FUNC_ID] [int] NULL,
    [ER101_STATUS_CDE] [varchar](2) NULL,
    [ER101_SETUP_ID] [varchar](8) NULL,
    [ER101_DEPT] [varchar](6) NULL,
    [ER101_ORD_TYPE] [varchar](2) NULL,
    [ER101_STATUS] [char](1) NULL,
    [ER101_PRT_STS] [char](1) NULL,
    [ER101_STS_AT_PRT] [char](1) NULL,
    [ER101_CHG_COMMENT] [varchar](255) NULL,
    [ER101_ENT_DATE_ISO] [datetime] NULL,
    [ER101_ENT_USER_ID] [varchar](10) NULL,
    [ER101_UPD_DATE_ISO] [datetime] NULL,
    [ER101_UPD_USER_ID] [varchar](10) NULL,
    [ER101_LIN_NBR] [int] NULL,
    [ER101_PHASE] [char](1) NULL,
    [ER101_RES_CLASS] [char](1) NULL,
    [ER101_NEW_RES_TYPE] [varchar](6) NULL,
    [ER101_RES_CODE] [varchar](12) NULL,
    [ER101_RES_QTY] [numeric](11, 2) NULL,
    [ER101_UNIT_CHRG] [numeric](13, 4) NULL,
    [ER101_UNIT_COST] [numeric](13, 4) NULL,
    [ER101_EXT_COST] [numeric](11, 2) NULL,
    [ER101_EXT_CHRG] [numeric](11, 2) NULL,
    [ER101_UOM] [varchar](3) NULL,
    [ER101_MIN_CHRG] [numeric](11, 2) NULL,
    [ER101_PER_UOM] [varchar](3) NULL,
    [ER101_MAX_CHRG] [numeric](11, 2) NULL,
    [ER101_BILLABLE] [char](1) NULL,
    [ER101_OVERRIDE_FLAG] [char](1) NULL,
    [ER101_RES_TEXT_YN] [char](1) NULL,
    [ER101_DB_CR_FLAG] [char](1) NULL,
    [ER101_INTERNAL] [char](1) NULL,
    [ER101_REF_FIELD] [varchar](255) NULL,
    [ER101_SERIAL_NBR] [varchar](50) NULL,
    [ER101_RES_PER_UNITS] [int] NULL,
    [ER101_SETUP_BILLABLE] [char](1) NULL,
    [ER101_START_DATE_ISO] [datetime] NULL,
    [ER101_END_DATE_ISO] [datetime] NULL,
    [ER101_START_TIME_ISO] [datetime] NULL,
    [ER101_END_TIME_ISO] [datetime] NULL,
    [ER101_COMPL_STS] [char](1) NULL,
    [ER101_CANCEL_DATE_ISO] [datetime] NULL,
    [ER101_BLOCK_CODE] [varchar](6) NULL,
    [ER101_PROP_CODE] [varchar](8) NULL,
    [ER101_RM_TYPE] [varchar](12) NULL,
    [ER101_WO_COMPL_DATE] [datetime] NULL,
    [ER101_WO_BATCH_ID] [varchar](10) NULL,
    [ER101_WO_SCHED_DATE_ISO] [datetime] NULL,
    [ER101_GL_REF_TRANS] [char](1) NULL,
    [ER101_GL_COS_TRANS] [char](1) NULL,
    [ER101_INVOICE_NBR] [int] NULL,
    [ER101_RES_CLOSED] [char](1) NULL,
    [ER101_LEAD_DAYS] [int] NULL,
    [ER101_LEAD_HHMM] [int] NULL,
    [ER101_STRIKE_DAYS] [int] NULL,
    [ER101_STRIKE_HHMM] [int] NULL,
    [ER101_LEAD_FLAG] [char](1) NULL,
    [ER101_STRIKE_FLAG] [char](1) NULL,
    [ER101_RANGE_FLAG] [char](1) NULL,
    [ER101_REQ_LEAD_STDATE] [datetime] NULL,
    [ER101_REQ_LEAD_ENDATE] [datetime] NULL,
    [ER101_REQ_STRK_STDATE] [datetime] NULL,
    [ER101_REQ_STRK_ENDATE] [datetime] NULL,
    [ER101_LEAD_STDATE] [datetime] NULL,
    [ER101_LEAD_ENDATE] [datetime] NULL,
    [ER101_STRK_STDATE] [datetime] NULL,
    [ER101_STRK_ENDATE] [datetime] NULL,
    [ER101_DEL_MARK] [char](1) NULL,
    [ER101_USER_FLD1_02X] [varchar](2) NULL,
    [ER101_USER_FLD1_04X] [varchar](4) NULL,
    [ER101_USER_FLD1_06X] [varchar](6) NULL,
    [ER101_USER_NBR_060P] [int] NULL,
    [ER101_USER_NBR_092P] [numeric](9, 2) NULL,
    [ER101_PR_LIST_DTL] [numeric](11, 2) NULL,
    [ER101_EXT_ACCT_CODE] [varchar](8) NULL,
    [ER101_AO_STS_1] [char](1) NULL,
    [ER101_PLAN_PHASE] [char](1) NULL,
    [ER101_PLAN_SEQ] [int] NULL,
    [ER101_ACT_PHASE] [char](1) NULL,
    [ER101_ACT_SEQ] [int] NULL,
    [ER101_REV_PHASE] [char](1) NULL,
    [ER101_REV_SEQ] [int] NULL,
    [ER101_FORE_PHASE] [char](1) NULL,
    [ER101_FORE_SEQ] [int] NULL,
    [ER101_EXTRA1_PHASE] [char](1) NULL,
    [ER101_EXTRA1_SEQ] [int] NULL,
    [ER101_EXTRA2_PHASE] [char](1) NULL,
    [ER101_EXTRA2_SEQ] [int] NULL,
    [ER101_SETUP_MSTR_SEQ] [int] NULL,
    [ER101_SETUP_ALTERED] [char](1) NULL,
    [ER101_RES_LOCKED] [char](1) NULL,
    [ER101_PRICE_LIST] [varchar](10) NULL,
    [ER101_SO_SEARCH] [varchar](9) NULL,
    [ER101_SSB_NBR] [int] NULL,
    [ER101_MIN_QTY] [numeric](11, 2) NULL,
    [ER101_MAX_QTY] [numeric](11, 2) NULL,
    [ER101_START_SIGN] [char](1) NULL,
    [ER101_END_SIGN] [char](1) NULL,
    [ER101_START_DAYS] [int] NULL,
    [ER101_END_DAYS] [int] NULL,
    [ER101_TEMPLATE] [char](1) NULL,
    [ER101_TIME_OFFSET] [char](1) NULL,
    [ER101_ASSIGN_CODE] [varchar](10) NULL,
    [ER101_FC_UNIT_CHRG] [numeric](13, 4) NULL,
    [ER101_FC_EXT_CHRG] [numeric](11, 2) NULL,
    [ER101_CURRENCY] [varchar](3) NULL,
    [ER101_FC_RATE] [numeric](12, 5) NULL,
    [ER101_FC_DATE] [datetime] NULL,
    [ER101_FC_MIN_CHRG] [numeric](11, 2) NULL,
    [ER101_FC_MAX_CHRG] [numeric](11, 2) NULL,
    [ER101_FC_FOREIGN] [numeric](12, 5) NULL,
    [ER101_STAT_ORD_NBR] [int] NULL,
    [ER101_STAT_ORD_LINE] [int] NULL,
    [ER101_DESC] [varchar](255) NULL
) ON [PRIMARY]
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PRT_SEQ_1] [varchar](12) NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PRT_SEQ_2] [varchar](120) NULL
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TAX_BASIS] [char](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_RES_CATEGORY] [char](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_DECIMALS] [char](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TAX_SEQ] [varchar](7) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MANUAL] [char](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_LC_RATE] [numeric](12, 5) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_FC_RATE] [numeric](12, 5) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_PL_RATE] [numeric](12, 5) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_DIFF] [char](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_UNIT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_EXT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_MIN_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TR_MAX_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_UNIT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_EXT_CHRG] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_MIN_CHRG] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_MAX_CHRG] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TAX_RATE_TYPE] [char](1) NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ORDER_FORM] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_FACTOR] [int] NULL
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MGMT_RPT_CODE] [varchar](6) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ROUND_CHRG] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_WHOLE_QTY] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SET_QTY] [numeric](15, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SET_UNITS] [numeric](15, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SET_ROUNDING] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SET_SUB] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TIME_QTY] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_GL_DISTR_PCT] [numeric](7, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_REG_SEQ] [int] NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ALT_DESC] [varchar](255) NULL
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_REG_ACCT] [varchar](8) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_DAILY] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_AVG_UNIT_CHRG] [varchar](1) NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ALT_DESC2] [varchar](255) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_CONTRACT_SEQ] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ORIG_RATE] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_DISC_PCT] [decimal](17, 10) NULL
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_DTL_EXIST] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ORDERED_ONLY] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_STDATE] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_STTIME] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_ENDATE] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_ENTIME] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_RATE] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_UNITS] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_BASE_RATE] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_COMMIT_QTY] [numeric](11, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MM_QTY_USED] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MM_CHRG_USED] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_TEXT_1] [varchar](50) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_1] [numeric](13, 3) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_2] [numeric](13, 3) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_3] [numeric](13, 3) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_BASE_RATE] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_REV_DIST] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_COVER] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_RATE_TYPE] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_USE_SEASONAL] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TAX_EI] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TAXES] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_FC_TAXES] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PL_TAXES] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_FC_QTY] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_LEAD_HRS] [numeric](6, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_STRIKE_HRS] [numeric](6, 2) NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_CANCEL_USER_ID] [varchar](10) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ST_OFFSET_HRS] [numeric](7, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_EN_OFFSET_HRS] [numeric](7, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MEMO_FLAG] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MEMO_EXT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MEMO_EXT_CHRG_PL] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MEMO_EXT_CHRG_TR] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MEMO_EXT_CHRG_FC] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TIME_QTY_EDIT] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SURCHARGE_PCT] [decimal](17, 10) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_INCL_EXT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_INCL_EXT_CHRG_FC] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_CARRIER] [varchar](6) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SETUP_ID2] [varchar](8) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHIPPABLE] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_CHARGEABLE] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_ALLOW] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_START] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_NBR_END] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_SUPPLIER] [varchar](8) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_TRACK_ID] [varchar](40) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_REF_INV_NBR] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_NEW_ITEM_STS] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MSTR_REG_ACCT_CODE] [varchar](8) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ALT_DESC3] [varchar](255) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ALT_DESC4] [varchar](255) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ALT_DESC5] [varchar](255) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SETUP_ROLLUP] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MM_COST_USED] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_AUTO_SHIP_RCD] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_FIXED] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ITEM_EST_TBD] [varchar](3) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ROLLUP_PL_UNIT_CHRG] [numeric](13, 4) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ROLLUP_PL_EXT_CHRG] [numeric](13, 2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_GL_ORD_REV_TRANS] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_DISCOUNT_FLAG] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SETUP_RES_TYPE] [varchar](6) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SETUP_RES_CODE] [varchar](12) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PERS_SCHED_FLAG] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PRINT_STAMP] [datetime] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SHOW_EXT_CHRG] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PRINT_SEQ_NBR] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_PAY_LOCATION] [varchar](3) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_MAX_RM_NIGHTS] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_USE_TIER_COST] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_UNITS_SCHEME_CODE] [varchar](6) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_ROUND_TIME] [varchar](2) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_LEVEL] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_SETUP_PARENT_ORD_LINE] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_BADGE_PRT_STS] [varchar](1) NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_EVT_PROMO_SEQ] [int] NULL
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD [ER101_REG_TYPE] [varchar](12) NULL
/****** Object:  Index [PK__ER101_ACCT_ORDER]    Script Date: 04/15/2012 20:24:37 ******/
ALTER TABLE [dbo].[ER101_ACCT_ORDER_DTL] ADD  CONSTRAINT [PK__ER101_ACCT_ORDER] PRIMARY KEY CLUSTERED 
(
    [ER101_ORD_NBR] ASC,
    [ER101_ORD_LINE] ASC,
    [ER101_ORG_CODE] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 50) ON [PRIMARY]

টেবিলটি আকারের ২.৮ জিবি এবং সূচক আকারে দাঁড়িয়েছে ৩.৯ জিবি।


4
আপনি যখন পরিকল্পনা আইটেমের উপর মাউস কার্সার নিয়ে যান তখন খুব কম ইঙ্গিত পাওয়া যায়। তারা আনুমানিক I / O এবং CPU ব্যয় দেখায়। আমি প্রথমে I / O খরচ সম্পর্কে যত্ন নেব।
গ্রজেগোর্জ গিয়েরিলিক

4
Table Scanএকটি গাদা নির্দেশ দেয় (কোনও ক্লাস্টারড ইনডেক্স নেই) - সুতরাং প্রথম পদক্ষেপটি আপনার টেবিলটিতে একটি ভাল, দ্রুত ক্লাস্টারড সূচক যুক্ত করা হবে। দ্বিতীয় পদক্ষেপটি যদি কোনও অবিবাহিত সূচক er101_upd_date_isoসাহায্য করে (এবং অন্যান্য পারফরম্যান্সের অসুবিধা সৃষ্টি করে না)
মারক_স

4
@ মার্কস_স এর জন্য ধন্যবাদ- আমি পিকে সূচককে ক্লাস্টার করে ফেলেছি এবং এটি একটি বৈদেশিক পার্থক্য করেছে - আপনি কি আরও ব্যাখ্যা করতে পারবেন? (আপডেট 2 দেখুন)
লি টিকেট

4
ওয়েল, ক্লাস্টারড ইনডেক্স কেবল সারণির স্টোরেজ বিন্যাস পরিবর্তন করে। ক্লাস্টারড ইনডেক্সে তার লিফ লেভেল নোডগুলিতে প্রকৃত টেবিল ডেটা রয়েছে - এটি: পুরো টেবিলটি পড়ার জন্য, এসকিউএল সার্ভার এখন একটি ক্লাস্টারড ইনডেক্স স্ক্যান করছে (মূলত একটি ক্লাস্টারড ইনডেক্স সহ একটি টেবিলের উপরে "টেবিল স্ক্যান")। এটি প্রায় সর্বদা গাদা (ক্লাস্টার ইনডেক্স ছাড়াই) একটি টেবিল স্ক্যান করার চেয়ে কিছুটা দ্রুত গতিতে চলেছে। আপনি যদি এখন er101_upd_date_isoকলামে একটি অবিবাহিত সূচক যুক্ত করেছেন , আপনি সম্ভবত আপনার সম্পাদন পরিকল্পনার "সাজান" অপারেশন থেকে মুক্তি পেতে পারেন এবং আরও গতি বাড়িয়ে দিতে পারেন
marc_s

4
@ লিটিক্যেট, দয়া করে আপনার সারণী এবং সূচী সংজ্ঞাটি দেখান। অনেকগুলি বিষয় বিবেচনা করতে হবে এবং কেউ তাদের জন্য জিজ্ঞাসা করছে না বলে মনে হচ্ছে (যা আমাকে অবাক করে তবে সম্ভবত এটি করা উচিত নয়)। আমি আপনাকে বলতে পারি যে 2 মিলিয়ন সারিগুলি বড় নয় এবং 200 মিলিয়ন + সারি সহ সূচিযুক্ত সারণীগুলি এর চেয়ে দ্রুত ফিরে আসে। সম্ভবত ক্লাস্টারড ইনডেক্স (এখন আপনারা মার্কসকে একটি ধন্যবাদ জানিয়েছেন) একটি নিখরচায় পছন্দ তবে স্পেসিফিকেশন না দেখে বলা শক্ত without বিভাজন ব্যবহার করবেন না তবে বার্তা ট্যাবটিতে লজিকাল রিডগুলি পরীক্ষা করুন এবং পরিসংখ্যানগুলি সেট করুন DO কোনও পরিবর্তন যদি লজিকাল রিডস হ্রাস করে তবে আপনি নিকটবর্তী হচ্ছেন।
সলোমন রুটজকি

উত্তর:


59

সহজ উত্তর: না। আপনি ক্লাস্টারড ইনডেক্সে 50% ভরা ফ্যাক্টর সহ 238 কলামের টেবিলের উপর এইডক প্রশ্নগুলিতে সহায়তা করতে পারবেন না।

বিস্তারিত উত্তর:

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

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

প্রথমত, যদি টেবিলের সংজ্ঞাটি সঠিক হয় (২৩৮ কলাম, ৫০% পূরণের ফ্যাক্টর) তবে আপনি এখানে উত্তর / পরামর্শের বাকি অংশগুলিকে উপেক্ষা করতে পারেন ;-)। এখানে রাজনৈতিক-চেয়ে কম রাজনৈতিক হওয়ার জন্য দুঃখিত, তবে গম্ভীরভাবে, নির্দিষ্টকরণগুলি না জেনে এটি একটি বুনো হাঁস তাড়া। এবং এখন যখন আমরা টেবিলের সংজ্ঞাটি দেখতে পেয়েছি এটি কিছুটা পরিষ্কার হয়ে যায় যে কেন একটি সাধারণ ক্যোয়ারী এত দীর্ঘ সময় নেয়, এমনকি যখন পরীক্ষার প্রশ্নাগুলি (আপডেট # 1) এত তাড়াতাড়ি চলেছিল।

এখানে প্রধান সমস্যা (এবং অনেকগুলি খারাপ-পারফরম্যান্সের পরিস্থিতিতে) খারাপ ডেটা মডেলিং। ২৯৮ টি কলাম যেমন 999 সূচক থাকা নিষিদ্ধ নয়, তবে এটি সাধারণত খুব বুদ্ধিমানও নয়।

প্রস্তাবনাগুলি:

  1. প্রথমত, এই টেবিলটি সত্যই পুনরায় তৈরি করা দরকার। এটি যদি কোনও ডেটা গুদামের টেবিল হয় তবে হতে পারে তবে তা না হলে এই ক্ষেত্রগুলিকে সত্যিকার অর্থে কয়েকটি টেবিল বিভক্ত করা দরকার যা সকলের কাছে একই পিকে থাকতে পারে। আপনার কাছে একটি মাস্টার রেকর্ড টেবিল থাকবে এবং চাইল্ড টেবিলগুলি সাধারণভাবে সম্পর্কিত বৈশিষ্ট্যের উপর ভিত্তি করে কেবল নির্ভরশীল তথ্য এবং সেই টেবিলগুলির পিকে মাস্টার সারণীর পিকে হিসাবে সমান এবং তাই এফকে মাস্টার সারণীতেও থাকে। মাস্টার এবং সমস্ত শিশু টেবিলের মধ্যে 1-থেকে -1 সম্পর্ক থাকবে।
  2. ANSI_PADDING OFFসময়ের সাথে সাথে বিভিন্ন কলাম সংযোজনের কারণে টেবিলের মধ্যে অসামঞ্জস্যের উল্লেখ না করা ব্যবহারের ব্যাঘাত ঘটাচ্ছে। আপনি এখনই এটি ঠিক করতে পারেন কিনা তা নিশ্চিত নন, তবে আদর্শভাবে আপনার সবসময় থাকত ANSI_PADDING ONবা খুব কমপক্ষে সমস্ত ALTER TABLEবিবৃতিতে একই সেটিংস থাকত ।
  3. 2 টি অতিরিক্ত ফাইল গোষ্ঠী তৈরি করার কথা বিবেচনা করুন: সারণী এবং সূচী। আপনার PRIMARYস্টাফগুলিকে সেভাবে না রাখাই ভাল তবে যেখানে এসকিউএল সার্ভার তার সমস্ত ডেটা এবং মেটা ডেটা আপনার অবজেক্ট সম্পর্কে সঞ্চয় করে। আপনি আপনার টেবিল এবং ক্লাস্টার ইনডেক্স (যেমন টেবিলের ডেটা হিসাবে) [Tables]এবং সমস্ত নন-ক্লাস্টারড ইনডেক্স তৈরি করেন[Indexes]
  4. ফিল ফ্যাক্টরটি 50% থেকে বাড়ান। এই কম সংখ্যার কারণেই আপনার সূচী স্থানটি আপনার ডেটা স্পেসের চেয়ে বেশি। ইনডেক্স পুনর্নির্মাণটি করা আপনার ডেটা ব্যবহারের জন্য সর্বোচ্চ 4k (মোট 8 কে পৃষ্ঠার আকারের মধ্যে) দিয়ে ডেটা পৃষ্ঠাগুলি পুনরায় তৈরি করবে যাতে আপনার টেবিলটি বিস্তৃত অঞ্চল জুড়ে ছড়িয়ে পড়ে।
  5. যদি বেশিরভাগ বা সমস্ত প্রশ্নের WHEREশর্তে "ER101_ORG_CODE" থাকে , তবে এটি ক্লাস্টারড সূচকের শীর্ষ কলামে নিয়ে যাওয়া বিবেচনা করুন। ধরে নেওয়া যায় যে এটি "ER101_ORD_NBR" এর চেয়ে বেশি ব্যবহৃত হয়। যদি "ER101_ORD_NBR" বেশিবার ব্যবহৃত হয় তবে তা রাখুন। এটি কেবল মনে হচ্ছে, ক্ষেত্রের নামগুলির অর্থ "অর্গানাইজেশন কোড" এবং "অর্ডার নাম্বার", এটি "অর্গকোড" একটি আরও ভাল গ্রুপিং যা এর মধ্যে একাধিক "অর্ডার নাম্বার" থাকতে পারে।
  6. মাইনর পয়েন্ট, তবে যদি "ER101_ORG_CODE" সর্বদা 2 টি অক্ষর হয় তবে তার CHAR(2)পরিবর্তে ব্যবহার করুন VARCHAR(2)এটির সারি শিরোনামের একটি বাইট সংরক্ষণ করবে যা ভেরিয়েবলের প্রস্থের আকারকে ট্র্যাক করে এবং কয়েক মিলিয়ন সারি যুক্ত করে।
  7. এখানে অন্যরা যেমন উল্লেখ করেছে, ব্যবহারের SELECT *ফলে পারফরম্যান্স ক্ষতিগ্রস্থ হবে। এসকিউএল সার্ভারের জন্য সমস্ত কলামগুলি ফিরিয়ে আনার প্রয়োজন হয় না এবং তাই আপনার অন্যান্য সূচী নির্বিশেষে একটি ক্লাস্টারড ইনডেক্স স্ক্যান করার সম্ভাবনা বেশি তাই নয়, তবে টেবিলের সংজ্ঞাতে *গিয়ে সমস্ত কলামের নাম অনুবাদ করতে এসকিউএল সার্ভারের সময়ও লাগে । তালিকার সমস্ত 238 কলামের নাম উল্লেখ করা কিছুটা দ্রুত হওয়া উচিত SELECTযদিও এটি স্ক্যান ইস্যুতে সহায়তা করবে না। তবে আপনি কি সত্যিই একই সাথে একই সময়ে সমস্ত 238 কলামের প্রয়োজন?

শুভকামনা!

আপডেট
"অ্যাড-হক প্রশ্নগুলির জন্য একটি বৃহত টেবিলের উপর পারফরম্যান্স কীভাবে উন্নত করা যায়" এই প্রশ্নের সম্পূর্ণতার স্বার্থে, এটি লক্ষ করা উচিত যে এটি যখন এই নির্দিষ্ট ক্ষেত্রে সহায়তা করবে না, যদি কেউ এসকিউএল সার্ভার 2012 ব্যবহার করে (বা আরও নতুন যখন সেই সময়টি আসবে) এবং যদি টেবিলটি আপডেট করা হয় না, তবে কলামস্টোর সূচকগুলি ব্যবহার করা একটি বিকল্প। এই নতুন বৈশিষ্ট্য সম্পর্কে আরও তথ্যের জন্য, এখানে দেখুন: http://msdn.microsoft.com/en-us/library/gg492088.aspx (আমি বিশ্বাস করি যে এটি এসকিউএল সার্ভার ২০১৪-এ শুরু করে আপডেটযোগ্য হিসাবে তৈরি করা হয়েছিল)।

আপডেট 2
অতিরিক্ত বিবেচনাগুলি হ'ল :

  • ক্লাস্টারড ইনডেক্সে সংক্ষেপণ সক্ষম করুন। এই বিকল্পটি এসকিউএল সার্ভার ২০০৮ এ উপলভ্য হয়েছিল তবে কেবলমাত্র একটি এন্টারপ্রাইজ সংস্করণ বৈশিষ্ট্য হিসাবে। যাইহোক, এসকিউএল সার্ভার 2016 এসপি 1 হিসাবে , সমস্ত সংস্করণে ডেটা কম্প্রেশন উপলব্ধ করা হয়েছিল ! সারি এবং পৃষ্ঠা সংক্ষেপণের বিশদগুলির জন্য দয়া করে ডেটা সংক্ষেপণের জন্য এমএসডিএন পৃষ্ঠা দেখুন ।
  • আপনি ডেটা সংকোচন ব্যবহার করতে না পারেন, অথবা যদি এটা অনেক সুবিধা একটি নির্দিষ্ট টেবিল জন্য প্রদান করবে না, তাহলে আপনি একটি নির্দিষ্ট দৈর্ঘ্যের ধরনের একটি কলাম আছে যদি ( INT, BIGINT, TINYINT, SMALLINT, CHAR, NCHAR, BINARY, DATETIME, SMALLDATETIME, MONEY, ইত্যাদি) এবং ভাল উপর 50 সারি% হয় NULL, তারপর সক্ষম করার বিষয়টি বিবেচনার SPARSEবিকল্প যা SQL সার্ভার 2008 সালে পাওয়া হয়ে ওঠে জন্য দয়া করে দুটিই MSDN পৃষ্ঠা দেখতে ব্যবহার করুন বিরল কলাম বিস্তারিত জানার জন্য।

Point দফায় ব্যক্তিগতভাবে আমি কল্পনা করেছি যে মেটাডেটা থেকে ২৩৮ কলামের নাম যুক্ত করে ক্যোরির পাঠ্যটি বিশ্লেষণের চেয়ে দ্রুত করা উচিত এবং তারপরেই মেটাডেটা যাচাই করে দেখতে হবে যে সেগুলি সমস্তই রয়েছে that *সন্দেহজনক ব্যক্তি ব্যতীত যথেষ্ট শক্ত যুক্তি রয়েছে here
মার্টিন স্মিথ

53

এই ক্যোয়ারিতে কয়েকটি সমস্যা রয়েছে (এবং এটি প্রতিটি ক্যোয়ারিতে প্রযোজ্য)।

সূচকের অভাব

ওমেড ইতিমধ্যে উল্লেখ করেছে er101_upd_date_isoকলামে সূচীর অভাব সবচেয়ে গুরুত্বপূর্ণ বিষয় ।

মেলানো সূচক ছাড়া (যার অভাব টেবিল স্ক্যানের কারণ হতে পারে) বড় টেবিলগুলিতে দ্রুত অনুসন্ধান চালানোর কোনও সুযোগ নেই।

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

1. অস্থায়ী টেবিল ব্যবহার করুন

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

অস্থায়ী সারণী তৈরি করতে আপনি কোড (পরীক্ষিত নয়) এর মতো ব্যবহার করতে পারেন:

-- copy records from last month to temporary table
INSERT INTO
   #my_temporary_table
SELECT
    *
FROM
    er101_acct_order_dtl WITH (NOLOCK)
WHERE 
    er101_upd_date_iso > DATEADD(month, -1, GETDATE())

-- you can add any index you need on temp table
CREATE INDEX idx_er101_upd_date_iso ON #my_temporary_table(er101_upd_date_iso)

-- run other queries on temporary table (which can be indexed)
SELECT TOP 100
    * 
FROM 
    #my_temporary_table 
ORDER BY 
    er101_upd_date_iso DESC

পেশাদাররা:

  • ডেটা যে কোনও উপসেটের জন্য করা সহজ।
  • পরিচালনা করা সহজ - এটি অস্থায়ী এবং এটি টেবিল
  • সামগ্রিক সিস্টেমের পারফরম্যান্সকে প্রভাবিত করে না view
  • অস্থায়ী টেবিল সূচী করা যেতে পারে।
  • আপনার এটির যত্ন নেওয়ার দরকার নেই - এটি অস্থায়ী :)।

কনস:

  • এটি ডেটার স্ন্যাপশট - তবে বেশিরভাগ অ্যাডহক প্রশ্নের জন্য এটি যথেষ্ট ভাল।

2. সাধারণ টেবিল এক্সপ্রেশন - সিটিই

ব্যক্তিগতভাবে আমি অ্যাড-হক প্রশ্নগুলির সাথে সিটিই প্রচুর ব্যবহার করি - এটি একটি কোয়েরি টুকরো টুকরো করে বিল্ডিং (এবং পরীক্ষার) সাথে অনেক সহায়তা করে।

নীচে উদাহরণ দেখুন (কোয়েরি দিয়ে শুরু WITH)।

পেশাদাররা:

  • বড় দর্শন থেকে শুরু করে তৈরি করা সহজ এবং তারপরে আপনার যা প্রয়োজন তা নির্বাচন এবং ফিল্টারিং।
  • পরীক্ষা সহজ।

কনস:

  • কিছু লোক সিডিই পছন্দ করে না - সিডিই কোয়েরিগুলি দীর্ঘ এবং বুঝতে অসুবিধাজনক বলে মনে হয়।

৩. ভিউ তৈরি করুন

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

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

পেশাদাররা:

  • করাটা সহজ.
  • উত্স ডেটা সহ এটি আপ টু ডেট।

কনস:

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

সমস্ত কলাম নির্বাচন করা হচ্ছে

চলমান তারকা ক্যোয়ারী ( SELECT * FROMবড় টেবিল দিকে) ভাল জিনিস না ...

আপনার যদি বড় কলাম থাকে (লম্বা স্ট্রিংয়ের মতো) এগুলি ডিস্ক থেকে পড়তে এবং নেটওয়ার্কে পাস করতে অনেক সময় লাগে।

*আপনার সত্যিকারের কলামের নামগুলি প্রতিস্থাপন করার চেষ্টা করব ।

বা, আপনার যদি সমস্ত কলামগুলির প্রয়োজন হয় তবে কোয়েরিতে আবার কিছু লেখার চেষ্টা করুন ( সাধারণ ডেটা এক্সপ্রেশন ব্যবহার করে ):

;WITH recs AS (
    SELECT TOP 100 
        id as rec_id -- select primary key only
    FROM 
        er101_acct_order_dtl 
    ORDER BY 
        er101_upd_date_iso DESC
)
SELECT
    er101_acct_order_dtl.*
FROM
    recs
    JOIN
      er101_acct_order_dtl
    ON
      er101_acct_order_dtl.id = recs.rec_id
ORDER BY 
    er101_upd_date_iso DESC 

নোংরা পড়ে

সর্বশেষ জিনিস যা অ্যাডহক ক্যোয়ারিকে ত্বরান্বিত করতে পারে তা হ'ল টেবিল ইঙ্গিত সহ নোংরা পাঠকে মঞ্জুরি দেয় ।WITH (NOLOCK)

ইঙ্গিতের পরিবর্তে আপনি লেনদেনের বিচ্ছিন্নতা স্তরটি নির্বিঘ্নে পড়তে সেট করতে পারেন :

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

বা সঠিক এসকিউএল পরিচালনা স্টুডিও সেটিংস সেট করুন।

আমি ধরে নিয়েছি অ্যাড-হক প্রশ্নগুলির জন্য নোংরা পড়া যথেষ্ট ভাল।


4
+1 এর জন্য SELECT *- এটি এসকিউএল সার্ভারকে ক্লাস্টারড ইনডেক্স ব্যবহার করতে বাধ্য করে। কমপক্ষে, এটি করা উচিত। অ-
গোষ্ঠীহীন

4
এই উত্তরটি কেবল উদাহরণ ক্যোয়ারীর গতি উন্নত করে, প্রশ্নটি নয়, যা "অ্যাড-হক প্রশ্নগুলির জন্য পারফরম্যান্স উন্নত করা সম্ভব"
ফিল

সিডিই এখন সিটিই (সাধারণ ছক এক্সপ্রেশন)
স্ক্লুউজার

12

আপনি সেখানে একটি টেবিল স্ক্যান পেয়ে যাচ্ছেন যার অর্থ আপনার কোনও সূচক সংজ্ঞায়িত হয়নিer101_upd_date_iso , বা যদি কলামটি কোনও বিদ্যমান সূচকের অংশ হয় তবে সূচকটি ব্যবহার করা যাবে না (সম্ভবত এটি প্রাথমিক সূচক কলাম নয়)।

অনুপস্থিত সূচকগুলি যুক্ত করা কার্য সম্পাদনকে শেষ করবে।

ইতিমধ্যে কলামগুলিতে এমন সূচি রয়েছে যা সাধারণভাবে অনুসন্ধান করা হয়

এর অর্থ এই নয় যে তারা এই ক্যোয়ারিতে ব্যবহৃত হয় (এবং তারা সম্ভবত নেই)।

আমি গাইল শ, অংশ 1 এবং অংশ 2 দ্বারা এসকিউএল সার্ভারে খারাপ পারফরম্যান্সের কারণগুলি সন্ধান করার পরামর্শ দিচ্ছি ।



4
@ লিটিকিকেট - এবং তবুও, এই কোয়েরির কার্যকারিতা উন্নত করতে আপনি সম্ভবত একটি সূচক যুক্ত করতে পারেন ।
ওদে

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

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

আমি একজন শিক্ষানবিস, আমরা কীভাবে জানতে পারি যে কোন কলামটির সূচকের প্রয়োজন?
ভাইরাস

7

প্রশ্নটি নির্দিষ্ট করে বলছে যে অ্যাড-হক ক্যোয়ারির জন্য পারফরম্যান্সটি উন্নত করা দরকার এবং সেই সূচিগুলি যুক্ত করা যায় না। সুতরাং এটির মূল্য হিসাবে, কোনও টেবিলে কর্মক্ষমতা উন্নত করার জন্য কী করা যেতে পারে?

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

এটি বিবেচনায় নিয়ে আসুন, ধরে নেওয়া যাক টেবিলে প্রাথমিক কীতে কোনও ক্লাস্টারড ইনডেক্স ছাড়া কোনও সূচি নেই। এখন আসুন আমাদের কর্মক্ষমতা সর্বাধিকীকরণ করার বিকল্পগুলি বিবেচনা করুন।

  • টেবিলটি ডিফল্ট করুন

    যতক্ষণ না আমাদের কাছে একটি ক্লাস্টার্ড সূচক থাকে ততক্ষণ আমরা ডিবিসিসি INDEXDEFRAG ( অবমানিত ) বা অগ্রাধিকারের সাথে ALTER INDEX ব্যবহার করে টেবিলটিকে ডিফ্র্যাগমেন্ট করতে পারি । এটি টেবিলটি স্ক্যান করতে প্রয়োজনীয় ডিস্ক রিডের সংখ্যা হ্রাস করবে এবং গতির উন্নতি করবে।

  • দ্রুততম ডিস্ক ব্যবহার করুন। আপনি কী ডিস্ক ব্যবহার করছেন তা আপনি বলবেন না তবে যদি আপনি এসএসডি ব্যবহার করতে পারেন।

  • টেম্পিডবিটি অপ্টিমাইজ করুন। দ্রুততম ডিস্কগুলিতে টেম্পিডবি রাখুন, আবার এসএসডি করুন। এই এসও নিবন্ধ এবং এই রেডগেট নিবন্ধটি দেখুন

  • অন্যান্য উত্তরে যেমন বলা হয়েছে, আরও নির্বাচনী ক্যোয়ারী ব্যবহার করা কম ডেটা প্রত্যাবর্তন করবে এবং তাই দ্রুত হওয়া উচিত।

এখন আসুন বিবেচনা করুন আমরা যদি সূচিপত্র যুক্ত করার অনুমতি পাই তবে আমরা কী করতে পারি।

আমরা যদি না হয় অ্যাড-হক প্রশ্নের বিষয়ে কথা, তাহলে আমরা ইনডেক্স বিশেষভাবে প্রশ্নের সীমিত সেট টেবিল বিরুদ্ধে চালানো হচ্ছে জুড়তে হবে। যেহেতু আমরা অ্যাড-হক প্রশ্নগুলি নিয়ে আলোচনা করছি , বেশিরভাগ সময় গতি উন্নত করার জন্য কী করা যেতে পারে ?

  • প্রতিটি কলামে একটি একক কলাম সূচক যুক্ত করুন। এটি বেশিরভাগ প্রশ্নের জন্য গতি উন্নত করতে এসকিউএল সার্ভারকে কমপক্ষে কিছু কাজ করার উচিত তবে এটি অনুকূল হবে না।
  • সর্বাধিক সাধারণ প্রশ্নের জন্য নির্দিষ্ট সূচীগুলি যুক্ত করুন যাতে তারা অনুকূলিত হয়।
  • খারাপভাবে সম্পাদন করা প্রশ্নের জন্য নিরীক্ষণ করে প্রয়োজনীয় অতিরিক্ত সুনির্দিষ্ট সূচক যুক্ত করুন।

সম্পাদনা করুন

আমি 22 মিলিয়ন সারিগুলির একটি 'বৃহত' টেবিলটিতে কিছু পরীক্ষা চালিয়েছি। আমার টেবিলটিতে কেবল ছয়টি কলাম রয়েছে তবে এতে 4 জিবি ডেটা রয়েছে। আমার মেশিনটি 8 গিগাবাইট র‌্যাম এবং কোয়াড কোর সিপিইউ সহ একটি শ্রদ্ধেয় ডেস্কটপ এবং এতে একটি সিঙ্গল এগিলিটি 3 এসএসডি রয়েছে।

আমি আইডি কলামের প্রাথমিক কী বাদে সমস্ত সূচি অপসারণ করেছি।

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

মজার বিষয় হ'ল আমার ক্যোয়ারী প্ল্যানটি আপনার কাছে একই (ক্লাস্টারড ইনডেক্স স্ক্যান সহ) তবে সূচি স্ক্যানটি ক্যোয়ারী ব্যয়ের 9% এবং বাকী 91% অংশ নির্ধারণ করে। আমি কেবলমাত্র ধরে নিতে পারি আপনার টেবিলটিতে প্রচুর পরিমাণে ডেটা রয়েছে এবং / অথবা আপনার ডিস্কগুলি খুব ধীর গতির নেটওয়ার্ক সংযোগের ওপরে অবস্থিত।


2

এমনকি যদি আপনার কিছু কলামগুলিতে কিছু ক্যোয়ারী ব্যবহার করা হয় তবে আপনার 'অ্যাড-হক' ক্যোয়ারীটি একটি টেবিল স্ক্যানের কারণ হিসাবে প্রমাণিত হয় যে আপনার কাছে এই ক্যোয়ারিকে দক্ষতার সাথে সম্পন্ন করার অনুমতি দেওয়ার মতো পর্যাপ্ত সূচি নেই।

বিশেষ করে তারিখের সীমাগুলির জন্য ভাল সূচকগুলি যুক্ত করা কঠিন।

আপনার জিজ্ঞাসার দিকে তাকিয়ে, ডিবি প্রথম এন রেকর্ডগুলি ফিরিয়ে দিতে সক্ষম হতে নির্বাচিত কলামের দ্বারা সমস্ত রেকর্ডকে বাছাই করতে হবে।

ডিবি কি ধারা দ্বারা আদেশ ছাড়াই একটি পূর্ণ টেবিল স্ক্যান করে? টেবিলের কী কোনও প্রাথমিক কী রয়েছে - পিকে ছাড়া ডিবি বাছাই করতে আরও কঠোর পরিশ্রম করতে হবে?


টেবিলে একটি প্রাথমিক কী রয়েছে। select top 100 * from ER101_ACCT_ORDER_DTL
খালি

2

এটা কিভাবে সম্ভব? Er101_upd_date_iso কলামে একটি সূচি ছাড়া একটি ক্লাস্টারড ইনডেক্স স্ক্যানটি কীভাবে ব্যবহার করা যেতে পারে?

একটি সূচক একটি বি-ট্রি যেখানে প্রতিটি পাত নোড একটি 'সারিগুলির গুচ্ছ' (এসকিউএল অভ্যন্তরীণ পরিভাষায় 'পৃষ্ঠা' বলা হয়) দিকে নির্দেশ করে, তখন সূচকটি একটি ক্লাস্টারযুক্ত সূচক হয়।

ক্লাস্টারড ইনডেক্স একটি বিশেষ ক্ষেত্রে, যেখানে পাতার নোডগুলিতে 'সারিগুলির গুচ্ছ' থাকে (তাদের দিকে ইঙ্গিত করার চেয়ে)। এই কারণে...

1) টেবিলে কেবল একটি ক্লাস্টার ইনডেক্স থাকতে পারে।

এর অর্থ হ'ল পুরো টেবিলটি ক্লাস্টারড ইনডেক্স হিসাবে সঞ্চিত রয়েছে, এজন্য আপনি টেবিল স্ক্যানের পরিবর্তে সূচি স্ক্যান দেখতে শুরু করেছেন।

2) ক্লাস্টারড ইনডেক্স ব্যবহার করে এমন একটি অপারেশন সাধারণত একটি ক্লাস্টারযুক্ত সূচকের চেয়ে দ্রুত হয়

Http://msdn.microsoft.com/en-us/library/ms177443.aspx এ আরও পড়ুন

আপনার যে সমস্যাটি রয়েছে তার জন্য আপনার এই কলামটি একটি সূচকে যুক্ত করার বিষয়টি সত্যই বিবেচনা করা উচিত, যেমন আপনি বলেছিলেন যে একটি নতুন সূচক যুক্ত করা (বা একটি বিদ্যমান সূচকে একটি কলাম) যুক্ত করা / স্নাতকের আপডেটের ব্যয় বাড়ায় increases তবে 'er101_upd_date_iso' দিয়ে প্রতিস্থাপনের জন্য কিছু নিম্নচালিত সূচক (বা বিদ্যমান সূচী থেকে একটি কলাম) মুছে ফেলা সম্ভব।

যদি সূচী পরিবর্তনগুলি সম্ভব না হয়, আমি কলামে একটি পরিসংখ্যান যুক্ত করার পরামর্শ দিচ্ছি, কলামগুলিকে সূচীকরণকৃত কলামগুলির সাথে কিছু সম্পর্ক থাকতে পারে

http://msdn.microsoft.com/en-us/library/ms188038.aspx

বিটিডাব্লু, আপনি যদি ER101_ACCT_ORDER_DTL এর টেবিল স্কিমা পোস্ট করতে পারেন তবে আপনি আরও অনেক বেশি সহায়তা পাবেন। এবং বিদ্যমান সূচকগুলিও ..., সম্ভবত কিছুটি ব্যবহারের জন্য কোয়েরিটি আবার লেখা যেতে পারে।


উত্তরের জন্য +1। যদিও একটি মন্তব্য, ক্লাস্টারযুক্ত সূচকগুলি আপনার উত্তর থেকে সর্বদা দ্রুত হয় না কারণ এটি পড়তে পারে (এটি ভুল বোঝা সম্ভব)।
গিসলি

আমি মনে করি আমি ক্লাস্টারড / নন-ক্লাস্টারড ইনডেক্সের মধ্যে পার্থক্যটি বুঝতে পেরেছি কিন্তু এখনও দেখতে পাচ্ছি না যে কলামটি ক্লাস্টারড ইনডেক্সের অংশ নয় সেগুলি অন্য কলামগুলিতে ক্লাস্টার ইনডেক্স রেখে কীভাবে উন্নত করা যেতে পারে?
লি টিকেট

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

আমি তা পেয়েছি তবে আমি ভেবেছিলাম যে শাখাগুলি ক্লাস্টারড ইনডেক্সের কলামগুলির উপর ভিত্তি করে ছিল। সুতরাং আমি যে কলামটি জিজ্ঞাসা করছি সেগুলি যদি সে না থাকে তবে তিনি অবশ্যই প্রতিটি শাখা / পাতাগুলি স্ক্যান করতে চান?
লি টিকেট

4
আমি এই না। আমার সেরা অনুমানটি হ'ল যখন আপনার একটি আনলাস্ট্রোলড ইনডেক্স ছিল, তখন এটি স্ক্যান করা হয়েছিল যার ফলে প্রচুর এলোমেলো আই / ও হয়। যখন আপনি ক্লাস্টার্ড সূচক তৈরি করেছেন আপনি সেই সমস্ত এলোমেলো আই / ও থেকে মুক্তি পেয়েছেন? তবে এটি অনুমান, আমি এই আচরণের জন্য অন্য কোনও কারণ খুঁজে পাই না তবে আমি কোনও বিশেষজ্ঞ নই।
গিসলি

1

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

-- From Glen Barry
-- Clear Wait Stats (consider clearing and running wait stats query again after a few minutes)
-- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR);

-- Check Task Counts to get an initial idea what the problem might be

-- Avg Current Tasks Count, Avg Runnable Tasks Count, Avg Pending Disk IO Count across all schedulers
-- Run several times in quick succession
SELECT AVG(current_tasks_count) AS [Avg Task Count], 
       AVG(runnable_tasks_count) AS [Avg Runnable Task Count],
       AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255 OPTION (RECOMPILE);

-- Sustained values above 10 suggest further investigation in that area
-- High current_tasks_count is often an indication of locking/blocking problems
-- High runnable_tasks_count is a good indication of CPU pressure
-- High pending_disk_io_count is an indication of I/O pressure

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

গড় টাস্ক কাউন্ট এবং গড় বিচারাধীন ডিস্কিও গণনা 4 এ পৌঁছেছে I'm আমি এখনও ডিবিটিকে জোর করে দেওয়ার চেষ্টা করার বিষয়ে আগ্রহী।
লি টিকেট

0

আমি জানি যে আপনি বলেছিলেন যে সূচকগুলি যুক্ত করা কোনও বিকল্প নয় তবে আপনার টেবিল স্ক্যানটি মুছে ফেলার একমাত্র বিকল্প এটি হবে option আপনি যখন স্ক্যান করেন, এসকিউএল সার্ভার আপনার ক্যোয়ারীটি পূরণ করতে টেবিলের সমস্ত 2 মিলিয়ন সারি পড়ে।

এই নিবন্ধটি আরও তথ্য সরবরাহ করে তবে মনে রাখবেন: অনুসন্ধান করুন = ভাল, স্ক্যান = খারাপ।

দ্বিতীয়ত, আপনি কি নির্বাচনগুলি * মুছে ফেলতে এবং আপনার প্রয়োজনীয় কলামগুলিই নির্বাচন করতে পারবেন না? তৃতীয়, না "কোথায়" ধারা? এমনকি যদি আপনার একটি সূচক থাকে, যেহেতু আপনি সবকিছুই সবচেয়ে ভাল পড়ছেন আপনি যা পাবেন তা হ'ল একটি ইনডেক্স স্ক্যান (এটি একটি টেবিল স্ক্যানের চেয়ে ভাল তবে এটি সন্ধান নয়, যা আপনার জন্য লক্ষ্য করা উচিত)


এটি সত্য নয় যে সিক স্ক্যানের চেয়ে সর্বদা ভাল। কখনও কখনও একটি স্ক্যান আসলে আরও দক্ষ। যদি এটি না হয় তবে এম S এসকিউএল সার্ভার ২০০৮ আর 2 থেকে শুরু হওয়া একটি ফোরসেকান কোয়েরি ইঙ্গিতটি অন্তর্ভুক্ত না করত। আরও তথ্যের জন্য এখানে দেখুন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms181714(v=sql.105).aspx এবং এমনকি কেউ স্ক্যান জোর করতে চাইছেন এমন জন্য এখানে (অ্যাডাম হেইনসের তৃতীয় উত্তর ভাল তথ্য রয়েছে): সামাজিক .msdn.microsoft.com / ফোরাম / এন-ইউএস /
ট্রান্সএকএসএল

4
ওয়েল, সবার আগে, সন্ধানগুলি পয়েন্ট-এর মতো প্রশ্নের জন্য ভাল। দ্বিতীয়ত, স্ক্যানগুলি পরিসীমা অনুসন্ধানের জন্য ভাল যেখানে প্রচুর ডেটা পুনরুদ্ধার করতে হবে। ওএলএপি সিস্টেমগুলি স্ক্যান ছাড়াই ভাল সম্পাদন করতে পারে না। ওলটিপি সিস্টেমগুলি সন্ধান ছাড়াই ভাল সম্পাদন করবে না। জিনিসের দুর্দান্ত পরিকল্পনায় সবকিছুরই জায়গা রয়েছে ...
ডারলভ

0

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

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