2011-07-29 35 views
2

我有表的很多记录。当我执行以下查询时,需要很长时间。我怎样才能提高性能?如何提高查询性能

SET ROWCOUNT 10 
SELECT StxnID 
     ,Sprovider.description as SProvider 
     ,txnID 
     ,Request 
     ,Raw 
     ,Status 
     ,txnBal 
     ,Stxn.CreatedBy 
     ,Stxn.CreatedOn 
     ,Stxn.ModifiedBy 
     ,Stxn.ModifiedOn 
     ,Stxn.isDeleted 
    FROM Stxn,Sprovider 
    WHERE Stxn.SproviderID = SProvider.Sproviderid 
    AND Stxn.SProviderid = ISNULL(@pSProviderID,Stxn.SProviderid) 
    AND Stxn.status = ISNULL(@pStatus,Stxn.status) 
    AND Stxn.CreatedOn BETWEEN ISNULL(@pStartDate,getdate()-1) and ISNULL(@pEndDate,getdate()) 
    AND Stxn.CreatedBy = ISNULL(@pSellerId,Stxn.CreatedBy) 
    ORDER BY StxnID DESC 

stxn表有超过100,000条记录。

查询是从asp.net C#中的报表查看器中运行。

+5

它会很难不知道你是如何表,索引等。请考虑向我们展示执行计划。 –

+0

什么版本的SQL Server? –

+0

我做存储过程。我使用数据集来检索存储过程。 –

回答

0

确保Stxn.SproviderID,Stxn.status,Stxn.CreatedOn,Stxn.CreatedBy,Stxn.StxnID和SProvider.Sproviderid都具有已定义的索引。

(NB - 你可能并不需要所有,但它不能伤害。)

0

我没有看到太多可以在查询本身来完成,但我能看到的东西对正在做模式:

  • 上SProvider.Sproviderid
  • 上Stxn.SproviderID创建索引/ PK
  • 创建索引/ PK
  • 的状态创建索引,CreatedOn,CreatedBy,StxnID
3

你应该考虑使用的执行计划,寻找丢失的索引。另外,执行需要多长时间?什么是你慢?

也许你还不能返回这么多行,但是这只是一个猜测。实际上,我们需要查看您的表格和索引以及执行计划。

检查sql-tuning-tutorial

4

这是我去到的时候,我尝试这样做,有可能是可选的几个搜索条件搜索查询的文章。

http://www.sommarskog.se/dyn-search-2008.html

与您的查询的最大问题是column=ISNULL(@column, column)语法。 MSSQL不会为此使用索引。考虑将其更改为(column = @column AND @column IS NOT NULL)

3

其中之一,使用SELECT TOP()而不是SET ROWCOUNT - 优化器将有更好的机会。另一个建议是使用适当的内部连接,而不是使用旧式表笛卡尔积,表可能结束了连接语法(这里不是这种情况,但它可以与旧的语法发生容易得多)。应该是:

... 
FROM Stxn INNER JOIN Sprovider 
    ON Stxn.SproviderID = SProvider.Sproviderid 
... 

而且,如果你认为100K行是很多,或者说这卷是缓慢的一个原因,你大错特错了。很可能你的索引策略真的很差,可能是一些参数嗅探,可能是一些隐式转换......很难说不理解数据类型,索引和查看计划。

3

有很多的东西,可能会影响查询的性能。虽然10万条记录真的不是那么多。

项目考虑(排名不分先后)

硬件:

  1. 是SQL Server内存限制?换句话说,它有足够的RAM来完成它的工作吗?如果它将内存交换到磁盘,那么这肯定表明您需要升级。
  2. 机器磁盘受到限制。换句话说,驱动器的速度足以跟上你需要运行的查询吗?如果它受到内存限制,则磁盘速度成为一个更大的因素。
  3. 机器处理器是否受到限制?例如,当您执行查询时,处理器会长时间飙升?或者,是否有很多已经被获取资源从你离开其他查询运行...

数据库结构:

  1. 你对列索引你的where子句中使用?如果表没有索引,那么它将不得不对两个表进行完整扫描以确定哪些记录匹配。
  2. 消除ISNULL函数调用。如果这是一个直接查询,请让调用代码在执行前验证参数并设置默认值。如果它在存储过程中,则执行s'proc顶部的检查。除非你正在执行这个与重新编译,它的参数嗅探,这些功能将有每一行进行评估..

网:

  1. 是网络,你和服务器之间的慢?根据所提取的数据量,您可能会通过线路拉取GB数据。我不确定存储在“原始”列中的内容。你需要问的第一个问题是“有多少数据回到客户端?”例如,如果每条记录的大小为1MB +,那么您可能会遇到磁盘和网络限制。

一般:

  1. 我不知道你的问题是什么 “慢” 的意思。这是否意味着查询需要大约1秒钟的时间来处理,还是表示需要5分钟?一切都是相对的。

基本上,没有很多您提出的问题就不可能给出一个硬答案。如果你分析查询,了解什么和回到客户端以及观察各个部分之间的交互,所有这些都会显现出来。

最后,根据返回客户端的数据量,可能无法通过硬件更改来提高性能。

0

需要考虑的事情:当ROWCOUNT或TOP与ORDER BY子句一起使用时,首先创建并排序整个结果集,然后返回前10个结果。

没有Order By子句,它如何运行?