복붙노트

[SQL] 큰 테이블에 SQL 서버 쿼리 성능 향상

SQL

큰 테이블에 SQL 서버 쿼리 성능 향상

나는 비교적 큰 테이블 (현재 2 개 백만 레코드)이 있고이 광고가-임의 쿼리 성능을 향상시킬 수 있는지 알고 싶습니다. 단어 여기에 임시 복지 키를 누릅니다. indexs를 추가하면 (가장 일반적으로 조회되는 열을 indexs 이미있다) 옵션을 선택하지 않습니다.

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.

서버는 SQL 서버 2008 R2 x64의 실행 (메모리 48기가바이트 램, 24 코어 프로세서에서) 매우 강력하다.

최신 정보

나는 백만 레코드 테이블을 만들려면이 코드를 발견했다. 내 디스크 액세스 속도가 서버에서 가난하면 내가 다음 찾아 SELECT TOP 몇 서로 다른 서버에 testEnvironment ORDER BY mailAddress DESC 100 *를 실행할 수 있다고 생각.

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

이 requested- 같이 테이블 스크립트를 생성한다 :

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]

표는 3.9 GB의 인덱스 크기 서 규모 2.8 GB입니다.

해결법

  1. ==============================

    1.간단한 답 : NO. 당신은 클러스터 된 인덱스에 50 % 채우기 비율로 238 컬럼 테이블에 임시 쿼리를 도울 수 없다.

    간단한 답 : NO. 당신은 클러스터 된 인덱스에 50 % 채우기 비율로 238 컬럼 테이블에 임시 쿼리를 도울 수 없다.

    자세한 답변 :

    나는이 주제에 대한 다른 답변에서 언급 한 바와 같이, 인덱스 디자인은 모두 예술과 과학,있는 경우, 몇 가지 하드 및 빠른 규칙이 있다는 것을 고려해야 할 많은 요소가 있습니다. 당신은 고려해야합니다 조건 및 여러 다른 것들 내가도 잘 기억하지 수 WHERE에 select 대 DML 작업, 디스크 서브 시스템, 기타 인덱스 / 테이블에 트리거, 테이블 내에서 데이터의 분포의 볼륨이 쿼리 스 SARGable를 사용하는 지금.

    나는 더 도움이 이제 테이블 정의 (계속 인덱스를 기다리고 있지만, 표 정의 만 포인트를 기록했다고 등 표 자체의 인덱스, 트리거, 이해없이이 주제에 대한 질문이 주어지지 될 수 있음을 말할 수있다 문제의 99 %) 나는 몇 가지 제안을 제공 할 수 있습니다.

    테이블 정의가 정확하면 우선, (238 열, 50 % 채우기 비율) 당신은 꽤 많이 ;-) 여기에 대한 답변 / 조언의 나머지 부분을 무시할 수 있습니다. 죄송합니다 여기보다 정치 적을 수 있지만, 심각, 그것은 세부 사항을 알 수없는 야생 거위 체이스의합니다. 그리고 지금 우리가 테스트 쿼리 (1 업데이트 #)이 너무 빨리 실행하는 경우에도, 그것은 간단한 쿼리가 너무 오래 걸릴 이유에 꽤 명확하게 테이블 정의를 볼 수있다.

    가장 큰 문제는 여기에 (많은 가난한 성능 상황은) 잘못된 데이터 모델링입니다. (238) 열은 단지 금지되지 않은 999 인덱스를 가진 같은 금지하지만, 일반적으로하지 매우 현명한도되지 않습니다.

    권장 사항 :

    행운을 빕니다!

    최신 정보 질문에 대한 완성도를 위해서가 주목해야한다 "어떻게 임시 쿼리에 대한 큰 테이블의 성능을 향상시키기 위해"그 동안 것이 특정 사건에 대한하지의 도움, 누군가가 SQL 서버 2012 (또는 때 새로운를 사용하는 경우 시간이 온다) 테이블이 업데이트되지 않는 경우, 다음 Columnstore 인덱스를 사용하는 옵션이다. 이 새로운 기능에 대한 자세한 내용은 이쪽을 봐 : http://msdn.microsoft.com/en-us/library/gg492088.aspx (I 다음은 SQL 서버 2014 년 갱신 시작으로 만들어졌다 믿는다).

    업데이트 2 추가 고려 사항은 다음과 같습니다 :

  2. ==============================

    2.이이 쿼리에 몇 가지 문제가 있습니다 (이것은 모든 쿼리에 적용).

    이이 쿼리에 몇 가지 문제가 있습니다 (이것은 모든 쿼리에 적용).

    er101_upd_date_iso 컬럼에 인덱스의 부족은 오뎃 이미 언급 한 것처럼 가장 중요한 것입니다.

    (테이블 스캔을 일으킬 수의 부족)하는 인덱스없이 큰 테이블에 빠르게 쿼리를 실행할 수있는 기회가 없다.

    당신은 인덱스를 추가 할 수없는 경우 나 (임시 쿼리에 사용할 수있는) 몇 가지 해결 방법을 제안 (을 포함한 여러 가지 이유로 하나의 임시 쿼리에 대한 인덱스를 만드는 아무 소용이 없다) :

    관심있는 데이터의 부분 집합 (행과 열)에 임시 테이블을 생성합니다. 임시 테이블은 원래의 소스 테이블 (필요한 경우) 쉽게 색인을 생성 할 수 있으며, 관심있는 데이터의 하위 집합을 캐시 할 수있는 훨씬 작아야한다.

    임시 테이블을 만들려면이 같은 코드를 (테스트하지)를 사용할 수 있습니다 :

    -- 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
    

    장점 :

    단점 :

    조각하여 쿼리 조각을 구축 (및 테스트)으로의 도움을 많이 - 개인적으로 나는 CTE에게 임시 쿼리를 많이 사용합니다.

    (쿼리 WITH로 시작) 아래의 예를 참조하십시오.

    장점 :

    단점 :

    같은 쿼리를 자주 플레이하고 인덱싱 된 뷰를 지원하는 MS SQL 버전이있는 경우 위,하지만 (대신 임시 테이블의 뷰를 생성하기와 유사합니다.

    당신은 당신이에 관심이있는 데이터의 부분 집합에 뷰 또는 인덱싱 된 뷰를 만들 수 있습니다 전체 테이블보다 훨씬 작은 데이터의 흥미로운 부분 집합을 포함해야 - 및 뷰에 대한 쿼리를 실행합니다.

    장점 :

    단점 :

    큰 테이블에 스타 쿼리 (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 
    

    애드혹 쿼리 속도를 높일 수있는 마지막 일이 더러운 (NOLOCK)와 함께 테이블 힌트로 읽어 수있다.

    대신 힌트 당신은 커밋되지 않은 읽기 트랜잭션 격리 수준을 설정할 수 있습니다 :

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    

    또는 적절한 SQL 관리 Studio 설정을 설정합니다.

    나는 임시 쿼리 더러운 읽기에 대한 것은 충분히 좋은 가정.

  3. ==============================

    3.당신은 테이블이 스캔 점점 당신이 인덱스가 er101_upd_date_iso에 정의 된, 또는 열이 기존 인덱스의 일부인 경우, 인덱스를 사용할 수없는이없는 것을 의미하는 (아마도 그것은 주 인덱서 열 수 없음).

    당신은 테이블이 스캔 점점 당신이 인덱스가 er101_upd_date_iso에 정의 된, 또는 열이 기존 인덱스의 일부인 경우, 인덱스를 사용할 수없는이없는 것을 의미하는 (아마도 그것은 주 인덱서 열 수 없음).

    누락 된 인덱스를 추가하면 성능이 결국 아무런 도움이되지 않습니다.

    그것이 그들이이 쿼리에 사용되는 것을 의미하지 않는다 (그리고 그들은 아마되지 않습니다).

    게일 쇼, 1 부와 2 부에 의해 SQL Server의 성능 저하의 원인을 찾기 읽는 것이 좋습니다.

  4. ==============================

    4.문제는 특히 성능 요구가 임시 쿼리를 개선하고, 인덱스를 추가 할 수없는 것을 할 수 말한다. 액면 것을 고려 그럼, 모든 테이블의 성능을 향상시키기 위해 할 수 있는가?

    문제는 특히 성능 요구가 임시 쿼리를 개선하고, 인덱스를 추가 할 수없는 것을 할 수 말한다. 액면 것을 고려 그럼, 모든 테이블의 성능을 향상시키기 위해 할 수 있는가?

    우리가 고려하고 있기 때문에 임시 쿼리, 절 BY 절과 ORDER 컬럼의 조합을 포함 할 수있는 곳. 거의 관계없이 인덱스가 테이블에 배치 무엇을 잘못 수행하는 쿼리의 쿼리 계획에 위에서 본 바와 같이, 테이블 스캔을 필요로하는 일부 쿼리가있을 것이 의미합니다.

    계정에이 촬영,의는 전혀 인덱스가 떨어져 기본 키에 클러스터 된 인덱스에서 테이블에이없는 가정하자. 이제 우리는 성능을 극대화 할 수있는 어떤 옵션을 생각해 보자.

    이제 우리는 인덱스를 추가 할 수있는 경우 우리가 할 수있는 일이 무엇인지 생각해 보자.

    우리는 임시 쿼리에 대해 얘기하지 않은 경우, 우리는 테이블에 대해 실행되는 쿼리의 제한된 집합을 위해 특별히 인덱스를 추가합니다. 우리가 논의되기 때문에 광고를 혹 쿼리, 무슨 일이 대부분의 시간의 속도를 향상 할 수 있는가?

    편집하다

    나는 22 백만 행의 '큰'테이블에 몇 가지 테스트를 실행했습니다. 내 테이블은 6 개 열을 가지고 있지만 데이터 4GB의를 포함 않습니다. 내 컴퓨터는 8GB의 RAM과 존경 데스크톱 및 쿼드 코어 CPU이며, 하나의 민첩성 3 SSD가 있습니다.

    나는 id 컬럼에 기본 키에서 모든 인덱스 떨어져 제거.

    SQL 서버가 처음 3 초 후에 다시 시작하면 문제에서 주어진 문제 하나 유사한 쿼리 5 초 정도 걸립니다. 데이터베이스 튜닝 고문은 분명히> 99 %의 추정 개선과 함께,이 쿼리를 개선하기 위해 인덱스를 추가하는 것이 좋습니다. 효과적으로 0의 질의 시간에 인덱스 결과를 추가.

    무엇 또한 흥미로운 것은 내 쿼리 계획은 당신에게 (클러스터 된 인덱스 스캔과) 동일하다고하지만 쿼리 비용의 9 %와 정렬 나머지 91 %에 대한 인덱스 스캔 차지한다. 난 단지 당신의 테이블에 엄청난 양의 데이터를 포함하고 /하거나 디스크가 느리거나 매우 느린 네트워크 연결을 통해 위치하고 있습니다 가정 할 수있다.

  5. ==============================

    5.당신은 어떤 쿼리에 사용되는 일부 열, 당신의 '임시'쿼리가이 쿼리를 효율적으로 완료 할 수 있도록하기에 충분한 인덱스를하지 않아도 테이블 스캔 쇼를 유발한다는 사실에 인덱스가 경우에도 마찬가지입니다.

    당신은 어떤 쿼리에 사용되는 일부 열, 당신의 '임시'쿼리가이 쿼리를 효율적으로 완료 할 수 있도록하기에 충분한 인덱스를하지 않아도 테이블 스캔 쇼를 유발한다는 사실에 인덱스가 경우에도 마찬가지입니다.

    특히 날짜 범위의 경우가 좋은 인덱스를 추가하기가 어렵습니다.

    그냥 쿼리에서 찾고 DB는 처음 n 레코드를 반환 할 수 있도록 선택한 열을 기준으로 모든 레코드를 정렬 할 수 있습니다.

    DB를 또한 ORDER BY 절없이 전체 테이블 스캔을 할 수 있습니까? 테이블에 기본 키가 있습니까 - PK가없는을의 DB는 정렬을 수행하기 위해 더 열심히 일해야합니까?

  6. ==============================

    6.인덱스가 클러스터되지 않은 인덱스 인 경우 인덱스는 각 잎 노드 (SQL 내부 용어로 '페이지'라고 함) '행의 무리'를 가리키는 된 B-트리입니다 때문입니다.

    인덱스가 클러스터되지 않은 인덱스 인 경우 인덱스는 각 잎 노드 (SQL 내부 용어로 '페이지'라고 함) '행의 무리'를 가리키는 된 B-트리입니다 때문입니다.

    클러스터 된 인덱스는 리프 노드가 '행의 무리'(보다는 가리키는)가있는 특별한 경우이다. 그 이유는 ...

    1) 테이블에 단 하나의 클러스터 된 인덱스가있을 수 있습니다.

    이 또한 전체 표는 인덱스 스캔보다는 테이블 스캔을보기 시작 이유는 클러스터 된 인덱스로 저장됩니다 것을 의미합니다.

    2) 클러스터 된 인덱스를 이용하여 동작을 빠르게 일반적 클러스터되지 않은 인덱스보다

    http://msdn.microsoft.com/en-us/library/ms177443.aspx에서 더 읽기

    새 인덱스 (또는 기존 인덱스에 열을) 추가 말했듯이 당신이 가진 문제를 들어, 당신이 정말로하는 인덱스에이 열을 추가하는 것을 고려한다 INSERT / UPDATE 비용을 증가시킨다. 그러나 'er101_upd_date_iso'로 대체 몇 가지 활용도가 낮은 인덱스 (또는 기존 인덱스에서 열)을 제거 할 수 있습니다.

    인덱스 변경이 가능하지 않은 경우, 나는이 칼럼에 통계를 추가하는 것이 좋습니다 열이 인덱싱 된 열이 어떤 상관 관계가있을 때, 그것은 물건을 고정 할 수 있습니다

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

    당신이 ER101_ACCT_ORDER_DTL의 테이블 스키마를 게시 할 수있는 경우 BTW, 당신은 더 많은 도움을받을 것입니다. 그들 중 일부를 사용하도록 작성된 재 기존 인덱스도 ... 아마 쿼리가 될 수 있습니다.

  7. ==============================

    7.당신의 1M 테스트가 빨리 실행 한 이유 중 하나는 임시 테이블이 메모리에 완전하고 서버 메모리 압력이 발생하는 경우에만 디스크에 갈 것이다 가능성이 있기 때문이다. 당신도 다시 공예 당신의 쿼리에 의해 순서를 제거 이전에 언급 한 바와 같이 좋은 클러스터 인덱스와 커버 인덱스 (들)을 추가하거나 DMV는 하드웨어가 관련 있는지 IO 압력을 확인하기 위해 쿼리 할 수 ​​있습니다.

    당신의 1M 테스트가 빨리 실행 한 이유 중 하나는 임시 테이블이 메모리에 완전하고 서버 메모리 압력이 발생하는 경우에만 디스크에 갈 것이다 가능성이 있기 때문이다. 당신도 다시 공예 당신의 쿼리에 의해 순서를 제거 이전에 언급 한 바와 같이 좋은 클러스터 인덱스와 커버 인덱스 (들)을 추가하거나 DMV는 하드웨어가 관련 있는지 IO 압력을 확인하기 위해 쿼리 할 수 ​​있습니다.

    -- 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
    
  8. ==============================

    8.나는 당신이 인덱스를 추가하는 옵션을 선택하지 않습니다하지만 그건 당신이 스캔 테이블을 제거 할 수있는 유일한 옵션이 될 것이라고 말했다 것을 알고있다. 당신이 검색을 수행 할 때 SQL Server는 쿼리를 수행하기 위해 테이블에있는 모든 2 개 백만 행을 읽습니다.

    나는 당신이 인덱스를 추가하는 옵션을 선택하지 않습니다하지만 그건 당신이 스캔 테이블을 제거 할 수있는 유일한 옵션이 될 것이라고 말했다 것을 알고있다. 당신이 검색을 수행 할 때 SQL Server는 쿼리를 수행하기 위해 테이블에있는 모든 2 개 백만 행을 읽습니다.

    이 문서는 더 많은 정보를 제공하지만 기억 = 좋은 검사 = 나쁜을 얻을 수 있습니다.

    둘째, 당신은 선택 *을 제거하고 필요한 경우에만 열을 선택할 수없는 이유는 무엇입니까? 셋째, 아니오 ""절? 당신은 인덱스가하더라도, 당신은 모든 것을 읽고 있기 때문에 당신이 얻을 것이다 최고는 인덱스 스캔입니다 (테이블 스캔보다 더 나은,하지만 그것은 당신이 목표로해야 무엇 인 추구하지 않습니다)

  9. ==============================

    9.나는이 모든 답변에 많은 지혜가있다 ... 그것은 처음부터 꽤 시간이되었습니다 알고있다. 좋은 인덱스는 쿼리를 개선하기 위해 노력하고 최초의 일이다. 음, 거의 처음. (말하자면) 가장 우선은 효율적 있도록 코드를 변경하고 있습니다. 그래서, 모두가있었습니다 후 말했다과 하나가 WHERE 조건은 선택적 충분이없는 경우, 데이터를 얻을 수있는 하나의 방법이, 또는 전혀 사용하여 쿼리가있는 경우, 수행 : TABLE SCAN (INDEX SCAN을). 하나는 테이블에서 모든 열을 필요로하는 경우, 다음 TABLE SCAN은 사용되지 않습니다 - 그것에 대해 어떤 질문을. 이것은 데이터 조직의 유형에 따라, 힙 스캔 또는 클러스터 된 인덱스 스캔 수 있습니다. OPTION (MAXDOP 0) : 속도 일까지 유일한 마지막 방법은 (가능한 모든의 경우), 많은 코어가 스캔을 할 수로 사용되는로 있는지 확인하는 것입니다. 나는 물론 스토리지의 주제를 무시하고있어, 그러나 사람은 반드시 하나는 말할 것도 없다 무제한 RAM을 가지고 있는지 확인한다 :

    나는이 모든 답변에 많은 지혜가있다 ... 그것은 처음부터 꽤 시간이되었습니다 알고있다. 좋은 인덱스는 쿼리를 개선하기 위해 노력하고 최초의 일이다. 음, 거의 처음. (말하자면) 가장 우선은 효율적 있도록 코드를 변경하고 있습니다. 그래서, 모두가있었습니다 후 말했다과 하나가 WHERE 조건은 선택적 충분이없는 경우, 데이터를 얻을 수있는 하나의 방법이, 또는 전혀 사용하여 쿼리가있는 경우, 수행 : TABLE SCAN (INDEX SCAN을). 하나는 테이블에서 모든 열을 필요로하는 경우, 다음 TABLE SCAN은 사용되지 않습니다 - 그것에 대해 어떤 질문을. 이것은 데이터 조직의 유형에 따라, 힙 스캔 또는 클러스터 된 인덱스 스캔 수 있습니다. OPTION (MAXDOP 0) : 속도 일까지 유일한 마지막 방법은 (가능한 모든의 경우), 많은 코어가 스캔을 할 수로 사용되는로 있는지 확인하는 것입니다. 나는 물론 스토리지의 주제를 무시하고있어, 그러나 사람은 반드시 하나는 말할 것도 없다 무제한 RAM을 가지고 있는지 확인한다 :

  10. from https://stackoverflow.com/questions/10025569/improve-sql-server-query-performance-on-large-tables by cc-by-sa and MIT license