请问如何优化表的数据输出速度

xs0573 2013-08-30 02:05:21
之前发了一个索引优化的帖子,但是经过测试发现,问题并不是主要归咎于索引
http://bbs.csdn.net/topics/390573285
目前我建立的表sql 如下,请问该如何优化输出速度
硬件无法改变,所以只能从设置上寻求答案
假设已经包含所有所需索引,以及每次都会先进行索引重组或优化,关于每个列的长度,因为涉及到源头表的长度设定,所以无法进行缩减
CREATE TABLE [dbo].[FactChangeRequest](
[ChangeRequestID] [int] IDENTITY(1,1) NOT NULL,
[MappingSchemaID] [int] NOT NULL,
[AffectedProgramTagID] [int] NOT NULL,
[BaseStatusID] [int] NOT NULL,
[CustomerSeverityID] [int] NOT NULL,
[ProbOfCustomerOccurrenceID] [int] NOT NULL,
[EngineeringPriorityID] [int] NOT NULL,
[ProductLifeCycleID] [int] NOT NULL,
[ProjectID] [int] NOT NULL,
[ProductID] [int] NOT NULL,
[TypeID] [int] NOT NULL,
[DispositionClassificationID] [int] NOT NULL,
[BlockerID] [int] NOT NULL,
[SeverityID] [int] NOT NULL,
[SourceSystemID] [int] NOT NULL,
[SourceIssueID] [nvarchar](100) NOT NULL,
[CustomerEncountered] [char](1) NOT NULL,
[CustomerEscalated] [char](1) NOT NULL,
[ForecastOfCustBaseEncountering] [char](1) NOT NULL,
[SubmitDate] [datetime] NULL,
[TerminalStateDate] [datetime] NULL,
[LastUpdateTime] [datetime] NULL,
[CreateBy] [int] NOT NULL,
[CreateDate] [datetime] NOT NULL,
[UpdateBy] [int] NOT NULL,
[UpdateDate] [datetime] NOT NULL,
[Status] [char](1) NOT NULL,
CONSTRAINT [PK_FactChangeRequest_ChangeRequestID] PRIMARY KEY CLUSTERED
(
[ChangeRequestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
...全文
181 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xs0573 2013-08-30
  • 打赏
  • 举报
回复
好的,谢谢 邮件已发
Shawn 2013-08-30
  • 打赏
  • 举报
回复
引用 15 楼 xs0573 的回复:
大概10几万
数据量真的不大,且你的表都是INT或CHAR类型,字段数也不多。奇怪了。 把你联系方式发到我邮箱。可以私聊解决一下:wwwwgou@163.com
xs0573 2013-08-30
  • 打赏
  • 举报
回复
大概10几万
xs0573 2013-08-30
  • 打赏
  • 举报
回复
引用 13 楼 wwwwgou 的回复:
[quote=引用 12 楼 xs0573 的回复:] #1 2013-08-30 07:31:43.560 2013-08-30 07:35:51.760 #2 因为没有输出,所以也看不到结果,只有看到持续时间 3分03
一个4分钟,一个3分钟。证明输出数据只用1分钟。要是这样,查询数据用3分钟说明还是很慢的,楼主查询出多少条数据?楼主看一下执行计划(CTRL+L),是不是走了全表扫描。 暂时能想到的优化方案:创建一个TerminalStateDate索引并INCLUDE(所有字段,除了主键和TerminalStateDate),测试一下,会不会快。[/quote] 好的,谢谢
Shawn 2013-08-30
  • 打赏
  • 举报
回复
引用 12 楼 xs0573 的回复:
#1 2013-08-30 07:31:43.560 2013-08-30 07:35:51.760 #2 因为没有输出,所以也看不到结果,只有看到持续时间 3分03
一个4分钟,一个3分钟。证明输出数据只用1分钟。要是这样,查询数据用3分钟说明还是很慢的,楼主查询出多少条数据?楼主看一下执行计划(CTRL+L),是不是走了全表扫描。 暂时能想到的优化方案:创建一个TerminalStateDate索引并INCLUDE(所有字段,除了主键和TerminalStateDate),测试一下,会不会快。
xs0573 2013-08-30
  • 打赏
  • 举报
回复
引用 11 楼 wwwwgou 的回复:
[quote=引用 10 楼 xs0573 的回复:] 确认下是这个选项吗
是这个选项。但是,不是在这儿设置的。 你新建一个查询,然后在工具栏上面,有个图标(执行,调试,取消查询,分析,显示估计的执行计划,再右边这个按钮就是),鼠标放在上面,会显示:查询选项,点击它。[/quote] 好的,query如下 DECLARE @begin DATETIME DECLARE @begin1 DATETIME SET @begin = GETDATE() -- SELECT * FROM master..spt_values select * FROM [cnvrgd_dwh_d].[dbo].[FactChangeRequest] where [TerminalStateDate] > '2012-03-12 00:00:00.000' SET @begin1 = GETDATE() select @begin,@begin1 #1 2013-08-30 07:31:43.560 2013-08-30 07:35:51.760 #2 因为没有输出,所以也看不到结果,只有看到持续时间 3分03
Shawn 2013-08-30
  • 打赏
  • 举报
回复
引用 10 楼 xs0573 的回复:
确认下是这个选项吗
是这个选项。但是,不是在这儿设置的。 你新建一个查询,然后在工具栏上面,有个图标(执行,调试,取消查询,分析,显示估计的执行计划,再右边这个按钮就是),鼠标放在上面,会显示:查询选项,点击它。
xs0573 2013-08-30
  • 打赏
  • 举报
回复
引用 9 楼 wwwwgou 的回复:
[quote=引用 7 楼 xs0573 的回复:]
后面2步不清楚如何操作 =。=

#3.在你代码里,跟数据库交互的那一行前面,加个begin变量,记下时间1,取出数据后,再加个变量,记下时间2,计算这两个时间差。
#4.页面全部显示完后,记录一个时间3,用时间3减去时间2,测试一下。[/quote]


确认下是这个选项吗
Shawn 2013-08-30
  • 打赏
  • 举报
回复
引用 7 楼 xs0573 的回复:
后面2步不清楚如何操作 =。=
#3.在你代码里,跟数据库交互的那一行前面,加个begin变量,记下时间1,取出数据后,再加个变量,记下时间2,计算这两个时间差。 #4.页面全部显示完后,记录一个时间3,用时间3减去时间2,测试一下。
Shawn 2013-08-30
  • 打赏
  • 举报
回复
引用 6 楼 xs0573 的回复:
目前测试结果是: #1 exec_time 3 #2 exec_time 3080
楼主是不是写反了? --放弃结果,用的是3毫秒, --不放弃,用的是3080毫秒 也就是说,传送数据用了3秒。那么显示到前台呢?如果共用了10秒,那么楼主是否可以考虑再优化下前台?或者用分页存储过程,一次只显示少量数据? --楼主可以再测试一下速度:
--#1. 
SELECT TOP(1) * FROM
(
	SELECT TOP(2000000000) *  
	FROM dbo.FactChangeRequest
	WHERE 1=1	--你的条件,条件要和#2中的一模一样
) t

--#2.
SELECT *  
FROM dbo.FactChangeRequest
WHERE 1=1	--你的条件,条件要和#1中的一模一样
xs0573 2013-08-30
  • 打赏
  • 举报
回复
后面2步不清楚如何操作 =。=
xs0573 2013-08-30
  • 打赏
  • 举报
回复
引用 2 楼 wwwwgou 的回复:
--#1.根据下面4步,测试你的时间,是花费在SQL执行?SQL SERVER数据输出(包括网络)?ADO或OLEDB接口执行?还是前台数据绑定并显示? --#2.如果#1和#2的测试相差非常大,SORRY,除了提高网络带宽,貌似没有什么好方法了。
--创建一个表TEST,存储语句执行时间
CREATE TABLE test(exec_time INT)

--#1.用MSSM执行,看一下从提交查询到数据显示到MSSM中结果的时间
DECLARE @begin DATETIME
SET @begin = GETDATE()
SELECT * FROM master..spt_values
INSERT INTO test(exec_time)
SELECT DATEDIFF(millisecond, @begin, GETDATE())
SELECT * FROM test

--#2.工具栏-》查询选项(显示估计的执行计划右边那个图标)-》结果-》网络-》勾选“执行后放弃结果”,进行和#1同样的测试
DECLARE @begin DATETIME
SET @begin = GETDATE()
SELECT * FROM master..spt_values
INSERT INTO test(exec_time)
SELECT DATEDIFF(millisecond, @begin, GETDATE())
SELECT * FROM test	--打开另一个连接查看TEST中的结果

/*
exec_time
123
6
*/

--#3.调试你的前台代码,测试从提交SQL到返回到前端的时间用了多少。
--#4.测试数据从返回,再到完全展现到界面上用了多长时间。
目前测试结果是: #1 exec_time 3 #2 exec_time 3080
xs0573 2013-08-30
  • 打赏
  • 举报
回复
好的,我先看下, 执行查询速度很快,但是显示速度比较慢
KeepSayingNo 2013-08-30
  • 打赏
  • 举报
回复
楼主要说明下目前的瓶颈到底在哪里,是在数据库里面执行查询的时候都慢吗,还是在界面上显示数据比较慢。
唐诗三百首 2013-08-30
  • 打赏
  • 举报
回复
建议: 1.避免使用"select *",会影响执行计划,尽量将仅需要的字段返回即可. 2.不必每次查询都先进行索引重组或优化,一般一周一次即可. 3.查看数据库属性,统计信息是否为自动创建及自动更新的,须开启. 4.创建具有包含列的索引,即 create index .. on [表名]([SubmitDate]) include([需返回的字段列表])
Shawn 2013-08-30
  • 打赏
  • 举报
回复
--#1.根据下面4步,测试你的时间,是花费在SQL执行?SQL SERVER数据输出(包括网络)?ADO或OLEDB接口执行?还是前台数据绑定并显示? --#2.如果#1和#2的测试相差非常大,SORRY,除了提高网络带宽,貌似没有什么好方法了。
--创建一个表TEST,存储语句执行时间
CREATE TABLE test(exec_time INT)

--#1.用MSSM执行,看一下从提交查询到数据显示到MSSM中结果的时间
DECLARE @begin DATETIME
SET @begin = GETDATE()
SELECT * FROM master..spt_values
INSERT INTO test(exec_time)
SELECT DATEDIFF(millisecond, @begin, GETDATE())
SELECT * FROM test

--#2.工具栏-》查询选项(显示估计的执行计划右边那个图标)-》结果-》网络-》勾选“执行后放弃结果”,进行和#1同样的测试
DECLARE @begin DATETIME
SET @begin = GETDATE()
SELECT * FROM master..spt_values
INSERT INTO test(exec_time)
SELECT DATEDIFF(millisecond, @begin, GETDATE())
SELECT * FROM test	--打开另一个连接查看TEST中的结果

/*
exec_time
123
6
*/

--#3.调试你的前台代码,测试从提交SQL到返回到前端的时间用了多少。
--#4.测试数据从返回,再到完全展现到界面上用了多长时间。
Andy__Huang 2013-08-30
  • 打赏
  • 举报
回复
你尝试: 建立一个相同有表FactChangeRequest2,它与原表FactChangeRequest结构完全一样,你把原表的数据插入到FactChangeRequest2,然后建索引,用同样的方法查询,看看速度快一点?如果比原来快,则你可以删除原表,然后把FactChangeRequest2表名改为FactChangeRequest,继续使用

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧