Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何改进大型表上的读取操作?_Sql Server_Sql Server 2008_Ssas - Fatal编程技术网

Sql server 如何改进大型表上的读取操作?

Sql server 如何改进大型表上的读取操作?,sql-server,sql-server-2008,ssas,Sql Server,Sql Server 2008,Ssas,我有一个巨大的表,大约有3.5亿行,不时更新(大约每行-5分钟一次),更新是成批完成的(一起更新多行,就像一次更新100行) 现在,在一个单独的应用程序中,我需要以固定的时间间隔(比如5分钟)运行查询,如果以正常的方式执行,这将花费很长时间 我需要关于如何以高效的方式完成这项工作的建议。AnalysisServices是否适用于此类任务 请提供您对此的意见/想法/评论 问候 由于这是一个非常笼统的问题,我只能提供一个非常笼统的回答 1) 索引确实会增加插入等的开销,但与其他地方的性能提升相比,它

我有一个巨大的表,大约有3.5亿行,不时更新(大约每行-5分钟一次),更新是成批完成的(一起更新多行,就像一次更新100行)

现在,在一个单独的应用程序中,我需要以固定的时间间隔(比如5分钟)运行查询,如果以正常的方式执行,这将花费很长时间

我需要关于如何以高效的方式完成这项工作的建议。AnalysisServices是否适用于此类任务

请提供您对此的意见/想法/评论

问候
由于这是一个非常笼统的问题,我只能提供一个非常笼统的回答

1) 索引确实会增加插入等的开销,但与其他地方的性能提升相比,它们通常是微不足道的。使用适当的索引来提高应用程序的性能

2) 我推断你阅读的频率比写作的频率高。让触发器为您预先计算存储在另一个表中的中间结果可能会使您受益匪浅。根据写入的性质,您可能需要从头开始删除重新计算,或者只计算更改的影响(使用
已删除的
和插入的
表)

编辑

如果您正在监视特定写入;在表上创建触发器


然后,您只需要检查正在写入的数据,而不需要检查整个表。

1-确保您具有正确的索引结构。请记住,索引会减慢写入和更新速度。通常,每当插入或更新行时,每个索引都会更新。这也会导致锁定


2-读写一致性有多重要?每个查询都有上一次更新中每一行的最新记录是否至关重要?如果不是,您可以在select语句中使用锁定提示,例如
WITH(NOLOCK)
,这将为您提供可能过期的记录(如果您正在读取这些记录时正在更新这些记录),但将绕过行级锁,现在等待
更新
插入
完成。

<,不要在生产环境中使用SELECT*查询,尤其是当您有连接时。返回的数据超过了需要的数量(联接字段包含相同的数据),这会浪费网络和服务器资源。每次运行查询时,只需花费额外的十秒钟时间输入需要的字段,以获得更好的查询性能


然后查看正在运行的其他性能增强查询。有很多方法可以编写性能差的查询,而在您描述的系统中,您根本负担不起这样做。为自己准备一本关于性能调优的书,并彻底阅读关于调优查询的章节。然后读剩下的。在这么大的系统中,性能调优是一项关键技能。当你在做一些大的事情时,你不可能不知道数据库的概念和内部结构,深入查询。

也许你也可以考虑做(尽管你不能改变数据库结构):

备注:在这种情况下1)选择不会阻止更新,反之亦然2)您将“查看最新提交的数据”3)在
tempdb
中存储行版本会有额外的开销

见本报告最后几段


另请参见:

从单独的应用程序运行的其他查询具体是什么?如果不知道它们,就无法判断需要创建哪个索引。SQL Server Analysis Services(SSAS)用于数据挖掘和商业智能。你必须为你的问题提供更多的背景。您正在运行什么类型的查询?运行它们的正常方式是什么?请原谅我对数据库概念的无知。我需要使用该数据库中多个表的联接来运行select*查询。通常,我指的是从.Net代码编写查询。但问题是,当我运行这样的查询时,它们需要很多分钟才能执行,同时,如果要对该表执行更新操作,它就会被阻塞。因此,原始应用程序的性能受到阻碍。我认为您需要提供更多的细节,但我将提供一个非常通用的答案…@Shruti您能用这些查询更新您的问题吗?如果没有它们,你就不可能知道你需要改进什么。我将尝试详细解释这个场景。有一个包含以下列的表-devID、attributeID、dcsValue、dcsChangeStamp、dcsDateModified。这个表大约有3.5亿行。现在在另一个应用程序中,我必须连续监视特定的属性ID和dcsValue。现在,我无论如何也不能影响写入此表的应用程序的性能。@Shruti:将索引放在单独的物理卷上。无论如何,您都应该这样做,但这也会提高性能。或者像我们的it部门那样,对单个驱动器进行分区,以便将.ldf和.mdf文件(等)放在不同的驱动器上。(这是讽刺。)我可能无法更改数据库结构/索引。我只能读取应用程序中使用的数据库。@Shruti-是
INSERT
还是
SELECT
更关键?听起来你需要优先考虑其中一个。当然。。Insert具有更高的优先级,因为它将使用第二个应用程序需要操作的最新值进行更新。@Shruti-我建议为Insert提供
TABLOCK
提示和/或事务,以防止并发读取出现问题。但问题是,如果读取发生(这将需要几分钟的时间)并且必须同时写入,应用程序写入数据的性能将受到阻碍(这是不允许的)。
ALTER DATABASE [your database]
SET READ_COMMITTED_SNAPSHOT ON;