sql - 在大型表上,提高 SQL Server 查询性能

  显示原文与译文双语对照的内容
120 0

我有一个比较大的表( 目前有 2万记录),想知道是否可以提高即席查询的性能。在这里,是关键。添加索引不是选项( 在查询最常用的列上已经有索引) 。

运行一个简单查询返回 100个最近更新的记录:

select top 100 * from ER101_ACCT_ORDER_DTL order by er101_upd_date_iso desc

需要几分钟的时间请参见下面的执行计划:

enter image description here

表扫描中的其他详细信息:

enter image description here

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

服务器是运行 SQL Server 2008 r2的强大( 。内存 48GB ram,24内核处理器) 。

更新

我发现这里代码创建了一个包含 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;

但是在这三个测试服务器上,查询几乎立即运行。谁能解释这个?

enter image description here

更新2

谢谢你的comments-,请让他们来。他们指导我尝试从非聚集中更改主键索引,而非集群中的( 还有意想不到的) 结果。

非聚集:

enter image description here

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

集群:

enter image description here

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]

表的大小为 2.8 GB,索引大小为 3.9 GB 。

时间:原作者:0个回答

75 3

如果是 ,那么你就不能在 er101_upd_date_iso 上定义索引,或者该列是现有索引的一部分。

添加缺失索引将有助于提高性能。

在查询最常用的列上已经有索引

这并不意味着它们在这个查询( 而且他们可能不是) 中被使用。

建议阅读 Gail Shaw 第1 部分的原因,找出 SQL Server 中性能较差的原因。

原作者:
91 4

这个问题特别指出,需要改进的性能需要为个即席查询查询,而且不能添加索引。因此,在面对价值的时候,可以做什么来提高任何表的性能?

由于我们正在考虑即席查询,所以where子句和 ORDER BY 子句可以包含列的任意组合。这意味着几乎不管在表上放置什么索引,都会有一些查询需要表扫描。

考虑到这个问题,假设表上没有索引,除了主键的聚集索引之外。现在让我们来考虑一下,我们必须最大化性能。

  • 整理表格碎片

    只要有聚集索引,就可以使用 ( 已经废弃) 或者最好的索引来整理表。这将减少扫描表所需的磁盘读取数量,并提高速度。

  • 使用最快的磁盘。如果你可以使用 ssd,你不需要说你正在使用什么磁盘。

  • 优化 tempdb 。将tempdb放在尽可能快的磁盘上,再次使用 ssd 。请参见这个 ,以便文章和这个 RedGate文章。

  • 如它的他答案所述,使用更多选择性查询将返回较少的数据,因这里应该更快。

现在让我们考虑一下,如果允许添加索引,我们可以做什么。

在讨论即席查询时,我们将针对针对表运行的有限查询集添加专门的索引。由于我们正在讨论特定于应用程序的即席查询,因此可以做什么来提高速度,大多数情况下都是这样?

  • 在每列中添加单个列索引。这将使 SQL Server 至少能够为大多数查询提供提高速度的工作,但不是最优的。
  • 为最常见的查询添加特定索引以便优化。
  • 根据监视较差的查询,添加额外的特定索引。

编辑

我已经对 22行的'大'表做了一些测试。我的表只有六个列,但包含了 4GB 个数据。我的机器是一个拥有 8Gb 个内存和一个四核CPU的出色桌面,拥有一个单一的敏捷 3 SSD 。

除 Id column上的主键之外,我删除了所有索引。

如果 SQL Server 首次重新启动和 3秒后重新启动,问题中给出的问题的类似查询将需要 5秒。数据库调优顾问显然建议添加一个索引来改进这里查询,并估计> 99%的改进。添加索引将使查询时间有效零。

也有趣的是,我的查询计划与你的( 使用聚集索引扫描) 相同,但索引扫描占用了 9%个查询成本和它的余 91% 。我只能假设你的表包含了大量的数据,或者者你的磁盘很慢或者者在很慢的网络连接上。

原作者:
145 1

即使在某些查询中使用了索引,'即席'查询会导致表扫描无足够的索引才能有效地完成。

特别是对于日期范围,添加好索引是很困难的。

只要查看查询,db就必须按所选列对所有记录进行排序,以便返回第一个记录。

数据库是否也在没有 ORDER BY 子句的情况下进行全表扫描?表有一个主键- 没有 mtf,数据库必须工作得更难以执行排序。

原作者:
...