2017-02-27 42 views
0

我有一張表格,大約有100列。該表包含約400萬行。 我已經創建對主鍵簡單的選擇*從表中取13分鐘執行

CREATE TABLE [dbo].[Table1](
[Col1] [int] IDENTITY(1,1) NOT NULL, 
[Col2] [int] NOT NULL, 
[Col3] [int] NOT NULL, 
[Col4] [int] NOT NULL, 
[Col5] [int] NULL, 
[Col6] [int] NULL, 
[Col7] [varchar](1) NULL, 
[Col8] [varchar](1) NULL, 
[Col9] [int] NULL, 
[Col10] [varchar](100) NULL, 
[Col11] [int] NULL, 
[Col12] [varchar](100) NULL, 
[Col13] [varchar](20) NULL, 
[Col14] [int] NULL, 
[Col15] [int] NULL, 
[Col16] [varchar](80) NULL, 
[Col17] [int] NULL, 
[Col18] [varchar](50) NULL, 
[Col19] [int] NULL, 
[Col20] [varchar](50) NULL, 
[Col21] [float] NULL, 
[Col22] [float] NULL, 
[Col23] [float] NULL, 
[Col24] [float] NULL, 
[Col25] [float] NULL, 
[Col26] [float] NULL, 
[Col27] [float] NULL, 
[Col28] [float] NULL, 
[Col29] [float] NULL, 
[Col30] [float] NULL, 
[Col31] [float] NULL, 
[Col32] [float] NULL, 
[Col33] [int] NULL, 
[Col34] [varchar](50) NULL, 
[Col35] [int] NULL, 
[Col36] [datetime] NULL, 
[Col37] [int] NULL, 
[Col38] [datetime] NULL, 
[Col39] [int] NULL, 
[Col40] [datetime] NULL, 
[Col41] [datetime] NULL, 
[Col42] [int] NULL, 
[Col43] [datetime] NULL, 
[Col44] [datetime] NULL, 
[Col45] [varchar](1) NULL, 
[Col46] [int] NULL, 
[Col47] [varchar](50) NULL, 
[Col48] [int] NULL, 
[Col49] [varchar](100) NULL, 
[Col50] [int] NULL, 
[Col51] [varchar](100) NULL, 
[Col52] [int] NULL, 
[Col53] [varchar](120) NULL, 
[Col54] [varchar](255) NULL, 
[Col55] [varchar](255) NULL, 
[Col56] [datetime] NULL, 
[Col57] [varchar](20) NULL, 
[Col58] [varchar](1) NULL, 
[Col59] [varchar](255) NULL, 
[Col60] [varchar](255) NULL, 
[Col61] [varchar](80) NULL, 
[Col62] [varchar](50) NULL, 
[Col63] [varchar](1) NULL, 
[Col64] [varchar](50) NULL, 
[Col65] [varchar](1) NULL, 
[Col66] [varchar](4) NULL, 
[Col67] [varchar](60) NULL, 
[Col68] [varchar](8000) NULL, 
[Col69] [int] NULL, 
[Col70] [varchar](80) NULL, 
[Col71] [varchar](1) NULL, 
[Col72] [datetime] NULL, 
[Col73] [int] NULL, 
[Col74] [varchar](50) NULL, 
[Col75] [varchar](255) NULL, 
[Col76] [varchar](255) NULL, 
[Col77] [varchar](255) NULL, 
[Col78] [varchar](255) NULL, 
[Col79] [varchar](255) NULL, 
[Col80] [varchar](1) NULL, 
[Col81] [varchar](1) NULL, 
[Col82] [varchar](50) NULL, 
[Col83] [varchar](200) NULL, 
[Col84] [int] NULL, 
[Col85] [varchar](120) NULL, 
[Col86] [int] NULL, 
[Col87] [varchar](120) NULL, 
[Col88] [varchar](255) NULL, 
[Col89] [varchar](1) NULL, 
[Col90] [varchar](80) NULL, 
[Col91] [varchar](255) NULL, 
[Col92] [varchar](20) NULL, 
[Col93] [varchar](255) NULL, 
[Col94] [varchar](8000) NULL, 
[Col95] [varchar](255) NULL, 
[Col96] [varchar](255) NULL, 
[Col97] [varchar](255) NULL, 
[Col98] [char](1) NULL, 
[Col99] [varchar](255) NULL, 
[Col100] [datetime] NULL, 
[Col101] [int] NULL, 
[Col102] [float] NULL, 
PRIMARY KEY CLUSTERED 
(
    [Col1] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

當我選擇*從該表中,需要花費超過12分鐘來執行聚簇索引。 我也使用了NoLock。

我在這裏失蹤了什麼?我應該創建什麼非聚集索引以使其工作更快?

在此先感謝。

+0

您是否檢查過執行計劃? –

+0

你可以發佈你用來從這個表中檢索數據的代碼嗎? –

+5

這與索引沒有任何關係。您將100萬條記錄拉回100列 - 需要花費時間從服務器下載所有數據。這不是一個索引問題,它是一個數據傳輸問題。並沒有得到一個更好的網絡管道,你沒有太多的辦法來解決這個問題。 – Siyual

回答

0

如果您將主鍵放在條件的哪個位置,索引將會使用。否則,將一次獲取每個記錄和有基礎設施的修復工作要做

+0

有沒有條件。你建議哪些基礎結構修復?分頁? –

+1

@PrateekBhardwaj如果您沒有'WHERE'子句,則無法解決該問題。你應該問的問題是:你是否真的需要桌子上的所有東西? – Siyual

1

基本上是有金科玉律,而在具有行的龐大數量的表格做的選擇應遵循

1)只查詢你需要

2)查詢只需要

但應用選擇*在這個巨大的表將明顯的列行消耗時間。

+0

是的!在任何情況下,SELECT *都是一項糟糕的技術,不應在生產代碼中使用。除非您創建輸出文件,否則查詢數百萬條記錄並將其返回到生產代碼中是一件很奇怪的事情。沒有人會通過用戶界面查看400萬條記錄。 – HLGEM