2013-08-21 48 views
0

我正在尝试优化此查询。对于估计执行计划中估计的子树成本如何使成本更低,我有点难以理解。结果通常返回平均50k行,并且比我想要的时间更长。任何时间刮胡子都会有用。谢谢。如何进一步优化此查询?

SELECT 
    tbl1.DID AS "CID", 
    tbl1.ID AS "ID", 

    tbl2.Column2 AS "Col2", 
    tbl2.Column3 AS "Col3", 

    tbl3.Column4 AS "Col4", 
    tbl3.Column5 AS "Col5", 

    tbl4.Column6 AS "Col6" 
FROM TABLE1 tbl1 WITH (NOLOCK) 
INNER JOIN TABLE2 tbl2 WITH (NOLOCK) ON tbl1.ID = tbl2.CID 
INNER JOIN TABLE3 tbl3 WITH (NOLOCK) ON tbl1.ID = tbl3.CID 
INNER JOIN TABLE4 tbl4 WITH (NOLOCK) ON tbl1.DID = tbl4.CID 

更新 - 主键信息。每个表的内部联接中的所有列都有索引。如果主键那么它看起来像下面的一个,否则它是一个非聚集像最底部的那个。: 主键索引看起来像这样。

ALTER TABLE [dbo].[IDX_TABLE1] ADD CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,  IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

其他列的索引是非聚集这个样子的:

CREATE NONCLUSTERED INDEX [IDX_TABLE1] ON [dbo].[TABLE1] 
(
[DID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

表定义:

CREATE TABLE [dbo].[TABLE1](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[DID] [int] NULL 
CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 



CREATE TABLE [dbo].[TABLE2](
[CID] [int] NOT NULL, 
[Column3] [varchar](50) NULL, 

CONSTRAINT [PK_TABLE2] PRIMARY KEY CLUSTERED 
(
[CID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 



CREATE TABLE [dbo].[TABLE3](
[CID] [int] NOT NULL, 
[Column4] [varchar](50) NULL 
    [Column5] [varchar](50) NULL 
CONSTRAINT [PK_TABLE3] PRIMARY KEY CLUSTERED 
(
[CID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 



CREATE TABLE [dbo].[TABLE4](
[CID] [int] NOT NULL, 
[Column6] [char](2) NULL 
CONSTRAINT [PK_TABLE4] PRIMARY KEY CLUSTERED 
(
[CID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
+2

哪种SQL方言? I. e。哪个数据库系统?你能发布一个计划吗? – FrankPl

+0

你有外键索引吗? – HLGEM

+0

你对比较对方的列有任何索引吗? – EmCo

回答

2

根据您所提供的信息,正确的方法来解决这个将选择整个查询,右键单击该选择,然后选择“在数据库引擎优化顾问中分析查询”。它会给你一些关于如何优化它的想法。

如果没有对架构,执行计划,当前运行时间的的大量了解,我们无法对其进行优化。我们还需要知道它运行的硬件。

一般来说,调整顾问将让您深入了解可以对底层模式进行哪些更改以产生更快的结果。它也会告诉你应该看到多少改善(例如98%)。

4

确保每个表的连接列上都有一个索引。在SQL Server中,您还可以使用INCLUDE选项创建一个“覆盖索引”,并将查询中使用的所有列放在那里。这样,只有索引被读取,查询永远不会进入数据表。

像这样:

create index idx_name 
on tbl2 (cid) 
include (Column2, Column3) 

基础上的附加信息,您需要tbl2的索引,一个在TBL3类似于以上。

create index idx_name1 
on tbl3 (cid) 
include (Column4, Column5) 

这应该有助于一些表现。

+0

上面更多信息。 – gjarnos