怎么提高读表效率

kdjkfc123 2013-07-02 10:06:22
加精
有一张数据表,数据量很大,几十万到几百万的数据,如果现在要读这张表,用select 列1,列2 from table读效率会非常低,有什么方法可以提高查询效率吗?试过聚焦索引,效率几乎没变,求指导
...全文
6037 114 打赏 收藏 转发到动态 举报
写回复
用AI写文章
114 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南雪_158 2015-10-28
  • 打赏
  • 举报
回复
可以使用数据库引擎优化顾问优化一下,看一下给出的建议
524929657雯 2014-01-02
  • 打赏
  • 举报
回复
lynchhei 2014-01-02
  • 打赏
  • 举报
回复
请问你这个数据库在局域网里?还是广域网啊?
小孩快跑 2013-09-17
  • 打赏
  • 举报
回复
帖子看过了,楼主试过哪个方法最好,麻烦贴出来。等你好消息!
MYL471954386 2013-08-19
  • 打赏
  • 举报
回复
建议写到存储过程里边
  • 打赏
  • 举报
回复
没问题,我不是很急
kdjkfc123 2013-07-29
  • 打赏
  • 举报
回复
引用 103 楼 SQL_Beginner 的回复:
[quote=引用 100 楼 kdjkfc123 的回复:] [quote=引用 98 楼 SQL_Beginner 的回复:] SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid 你现在的问题是觉得执行上面的语句慢是吗?上面的结果集有4万条呢,为什么你觉得慢,上面的语句执行了多少秒?
在数据库里执行都要23S(上面已贴图),VC连接SQL读取会更慢了,我希望能控制在2-3秒最好[/quote] 需要几个东西 首先, 在SSMS上面点击 results to text(ctrl+t),以便以文本而不是表格的形式显示结果集,方面贴出来。 然后运行下面: set statistics profile on set statistics time on set statistics io on Go 然后, 1),运行SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid] 然后把结果集下面的所有东西贴出来,直接拷贝文本就可以了。 类似, 1.1 Scan count 1, logical reads。。。。 1.2 Rows Executes StmtText 。。。。。 1.3 SQL Server Execution Times:。。。。。 2)运行下面2.1 的语句,把Spid替代为运行“SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid]” 的那个SPID,否则会报错。 2.1

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='Waits_of_Particular_Session')
 DROP EVENT session Waits_of_Particular_Session ON SERVER;
GO
CREATE EVENT SESSION Waits_of_Particular_Session 
ON SERVER
ADD EVENT sqlserver.sql_statement_starting
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlos.wait_info 
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlos.wait_info_external
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlserver.sql_statement_completed
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
)
ADD TARGET package0.asynchronous_file_target
    (SET filename=N'C:\Waits_of_Particular_Session.xel')
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, TRACK_CAUSALITY=ON)
GO
ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
STATE = START
GO
2.2 运行SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid] 2.3 运行下面的语句,然后把结果集贴出来 SELECT wait_type ,TSQLQuery , sum(duration) as 'total_duration' , sum(SignalDuration) as 'total_SignalDuration' FROM ( SELECT event_xml.value('(./@name)', 'varchar(1000)') as Event_Name, event_xml.value('(./data[@name="wait_type"]/text)[1]', 'nvarchar(max)') as Wait_Type, event_xml.value('(./data[@name="duration"]/value)[1]', 'int') as Duration, event_xml.value ('(/event/data[@name=''signal_duration'']/value)[1]', 'BIGINT') AS SignalDuration, event_xml.value('(./action[@name="sql_text"]/value)[1]', 'nvarchar(max)') as TSQLQuery FROM (SELECT CAST(event_data AS XML) xml_event_data FROM sys.fn_xe_file_target_read_file('C:\Waits_of_Particular_Session*.xel', 'C:\Waits_of_Particular_Session*.xem', NULL, NULL)) AS event_table CROSS APPLY xml_event_data.nodes('//event') n (event_xml) WHERE event_xml.value('(./@name)', 'varchar(1000)') IN ('wait_info','wait_info_external') ) TMP GROUP BY wait_type,TSQLQuery 按照上面的步骤做,对上面的步骤,有不明白的提出来。[/quote]不好意思,客户那边的额数据库最近一直连不上所以没法贴结果,能脸上了第一时间会贴出来的,谢谢热心解答
  • 打赏
  • 举报
回复
把表做分区,能后一个分区一个分区读
haitao 2013-07-25
  • 打赏
  • 举报
回复
返回几万条记录,这个过程(网络传输)就快不了
hai_amn 2013-07-25
  • 打赏
  • 举报
回复
我是来学习的,
kdjkfc123 2013-07-25
  • 打赏
  • 举报
回复
引用 98 楼 SQL_Beginner 的回复:
SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid 你现在的问题是觉得执行上面的语句慢是吗?上面的结果集有4万条呢,为什么你觉得慢,上面的语句执行了多少秒?
在数据库里执行都要23S(上面已贴图),VC连接SQL读取会更慢了,我希望能控制在2-3秒最好
黄_瓜 2013-07-25
  • 打赏
  • 举报
回复
不是查询慢,是返回数据需要的时间长 管理器里面的慢慢给你展示啊 对各位大婶们无比膜拜
  • 打赏
  • 举报
回复
引用 100 楼 kdjkfc123 的回复:
[quote=引用 98 楼 SQL_Beginner 的回复:] SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid 你现在的问题是觉得执行上面的语句慢是吗?上面的结果集有4万条呢,为什么你觉得慢,上面的语句执行了多少秒?
在数据库里执行都要23S(上面已贴图),VC连接SQL读取会更慢了,我希望能控制在2-3秒最好[/quote] 需要几个东西 首先, 在SSMS上面点击 results to text(ctrl+t),以便以文本而不是表格的形式显示结果集,方面贴出来。 然后运行下面: set statistics profile on set statistics time on set statistics io on Go 然后, 1),运行SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid] 然后把结果集下面的所有东西贴出来,直接拷贝文本就可以了。 类似, 1.1 Scan count 1, logical reads。。。。 1.2 Rows Executes StmtText 。。。。。 1.3 SQL Server Execution Times:。。。。。 2)运行下面2.1 的语句,把Spid替代为运行“SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid]” 的那个SPID,否则会报错。 2.1

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='Waits_of_Particular_Session')
 DROP EVENT session Waits_of_Particular_Session ON SERVER;
GO
CREATE EVENT SESSION Waits_of_Particular_Session 
ON SERVER
ADD EVENT sqlserver.sql_statement_starting
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlos.wait_info 
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlos.wait_info_external
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
),

ADD EVENT sqlserver.sql_statement_completed
(
	ACTION (sqlserver.session_id,
		sqlserver.sql_text,
		sqlserver.plan_handle)
	WHERE  sqlserver.session_id =Spid
)
ADD TARGET package0.asynchronous_file_target
    (SET filename=N'C:\Waits_of_Particular_Session.xel')
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, TRACK_CAUSALITY=ON)
GO
ALTER EVENT SESSION Waits_of_Particular_Session ON SERVER
STATE = START
GO
2.2 运行SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid] 2.3 运行下面的语句,然后把结果集贴出来 SELECT wait_type ,TSQLQuery , sum(duration) as 'total_duration' , sum(SignalDuration) as 'total_SignalDuration' FROM ( SELECT event_xml.value('(./@name)', 'varchar(1000)') as Event_Name, event_xml.value('(./data[@name="wait_type"]/text)[1]', 'nvarchar(max)') as Wait_Type, event_xml.value('(./data[@name="duration"]/value)[1]', 'int') as Duration, event_xml.value ('(/event/data[@name=''signal_duration'']/value)[1]', 'BIGINT') AS SignalDuration, event_xml.value('(./action[@name="sql_text"]/value)[1]', 'nvarchar(max)') as TSQLQuery FROM (SELECT CAST(event_data AS XML) xml_event_data FROM sys.fn_xe_file_target_read_file('C:\Waits_of_Particular_Session*.xel', 'C:\Waits_of_Particular_Session*.xem', NULL, NULL)) AS event_table CROSS APPLY xml_event_data.nodes('//event') n (event_xml) WHERE event_xml.value('(./@name)', 'varchar(1000)') IN ('wait_info','wait_info_external') ) TMP GROUP BY wait_type,TSQLQuery 按照上面的步骤做,对上面的步骤,有不明白的提出来。
wangsufu77 2013-07-24
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
SELECT [GridID ,[XCoor ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid 你现在的问题是觉得执行上面的语句慢是吗?上面的结果集有4万条呢,为什么你觉得慢,上面的语句执行了多少秒?
kdjkfc123 2013-07-22
  • 打赏
  • 举报
回复
引用 88 楼 athwind 的回复:
1.把主键设置为int/bigint类型,如果以int类型主键为条件的话速度会比GUID快很多,GUID主键从来不用,另外sql server主键默认为聚焦索引,可以控制为非聚集索引 2.虽然不太常用索引,但感觉楼主建的索引很无厘头:索引是建在GridID,XCoor,YCoor列上,XCoor、YCoor是数值型字段,像价格、金额这样的字段,具有很大的随机性和重复性,建索引有何意义?只会降低效率,试问你懂索引吗? 个人愚见,请内行指正
如果不见索引效率几乎一样,当时主要想到要以GridID这列为查询条件,这里的XCoor、YCoor组合不会出现一组同样的值,所以才组合创建了一个索引。我也知道如果索引列出现的重复值太多索引就没有意义了,所以这里也比较纠结
kdjkfc123 2013-07-22
  • 打赏
  • 举报
回复
出了一段时间的差昨天刚回,又因软件安装问题一直调不出执行计划,今天终于弄出来了,让各位大侠久等了,抱歉
kdjkfc123 2013-07-22
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-16"?> <ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.0.1600.22" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> <BatchSequence> <Batch> <Statements> <StmtSimple StatementCompId="1" StatementEstRows="40000" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.185801" StatementText="/****** Script for SelectTopNRows command from SSMS ******/ SELECT [GridID] ,[XCoor] ,[YCoor] FROM [CIAEMonitoringAndAssessment].[dbo].[Grid] " StatementType="SELECT" QueryHash="0x97F24E19EDFF6C25" QueryPlanHash="0xD0E5441F40A2EB1A"> <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> <QueryPlan CachedPlanSize="16" CompileTime="1" CompileCPU="1" CompileMemory="80"> <RelOp AvgRowSize="39" EstimateCPU="0.044157" EstimateIO="0.141644" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="40000" LogicalOp="Index Scan" NodeId="0" Parallel="false" PhysicalOp="Index Scan" EstimatedTotalSubtreeCost="0.185801" TableCardinality="40000"> <OutputList> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="GridID" /> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="XCoor" /> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="YCoor" /> </OutputList> <IndexScan Ordered="false" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> <DefinedValues> <DefinedValue> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="GridID" /> </DefinedValue> <DefinedValue> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="XCoor" /> </DefinedValue> <DefinedValue> <ColumnReference Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Column="YCoor" /> </DefinedValue> </DefinedValues> <Object Database="[CIAEMonitoringAndAssessment]" Schema="[dbo]" Table="[Grid]" Index="[IX_GRID]" IndexKind="NonClustered" /> </IndexScan> </RelOp> </QueryPlan> </StmtSimple> </Statements> </Batch> </BatchSequence> </ShowPlanXML>
蝈蝈(GuoGuo) 2013-07-21
  • 打赏
  • 举报
回复
针对这个情况,出现的是IO的问题,可以通过以下方式: 1、增加硬盘数量,提高读写能力。 2、建立文件组,将你经常使用的文件分成不同的文件组,有可能还将其他的文件放在不同的磁盘。 3、如果SQL版本够高的话,针对历史数据,完全可以使用列压缩技术。
蝈蝈(GuoGuo) 2013-07-21
  • 打赏
  • 举报
回复
针对这个情况,出现的是IO的问题,可以通过以下方式:
1、增加硬盘数量,提高读写能力。
2、建立文件组,将你经常使用的文件分成不同的文件组,有可能还将其他的文件放在不同的磁盘。
3、如果SQL版本够高的话,针对历史数据,完全可以使用列压缩技术。
加载更多回复(83)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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