Sql 如何提高查询性能

Sql 如何提高查询性能,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的表中有很多记录。当我执行下面的查询时,它需要很多时间。如何提高性能 SET ROWCOUNT 10 SELECT StxnID ,Sprovider.description as SProvider ,txnID ,Request ,Raw ,Status ,txnBal ,Stxn.CreatedBy ,Stxn.CreatedOn ,Stxn.ModifiedBy ,S

我的表中有很多记录。当我执行下面的查询时,它需要很多时间。如何提高性能

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表有超过100000条记录


查询是从asp.net c中的报表查看器运行的

确保Stxn.SproviderID、Stxn.status、Stxn.CreatedOn、Stxn.CreatedBy、Stxn.StxnID和SProvider.SproviderID都定义了索引


注意-您可能不需要全部,但这不会有什么坏处。

我看不到在查询本身上可以做多少事情,但我可以看到在模式上正在做的事情:

在Stxn.SproviderID上创建索引/PK 在SProvider.Sproviderid上创建索引/PK 在status、CreatedOn、CreatedBy、StxnID上创建索引
<>你应该考虑使用执行计划并寻找缺失的索引。还有,执行需要多长时间?什么对你来说慢

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


检查

这是我在尝试执行具有多个搜索条件(可能是可选的)的搜索查询时的参考文章

查询中最大的问题是列=ISNULL@column,列语法。MSSQL不会为此使用索引。考虑将它更改为列=@列,@列不是null

,使用select top代替set RealCuto——优化器将有更好的机会。另一个建议是使用适当的内部联接,而不是使用旧式表、表联接语法以笛卡尔乘积结束。这里不是这样,但使用旧式语法可能会更容易。应该是:

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

如果你认为10万行太多了,或者认为这是速度慢的原因,那你就大错特错了。很可能您的索引策略非常糟糕,可能是一些参数嗅探,可能是一些隐式转换。。。如果不了解数据类型、索引和查看计划,很难判断。

有很多事情可能会影响查询的性能。虽然10万张唱片并不是那么多

无特定顺序考虑的项目

硬件:

SQL Server内存受限吗?换句话说,它是否有足够的RAM来完成它的工作?如果它正在将内存交换到磁盘,那么这肯定表明您需要升级。 机器磁盘是否受限。换句话说,驱动器的速度是否足以跟上您需要运行的查询?如果内存受限,那么磁盘速度将成为一个更大的因素。 机器处理器受限吗?例如,当您执行查询时,处理器是否长时间处于峰值状态?或者,是否已经有很多其他正在运行的查询正在占用您的资源。。。 数据库结构:

where子句中使用的列有索引吗?如果表没有索引,则必须对两个表进行完整扫描,以确定哪些记录匹配。 消除ISNULL函数调用。如果这是直接查询,请让调用代码在执行之前验证参数并设置默认值。如果它在存储过程中,则在s'proc的顶部执行检查。除非您是通过执行参数嗅探的重新编译来执行此操作,否则必须为每一行计算这些函数。。 网络:

您和服务器之间的网络速度慢吗?根据拉取的数据量,您可以跨线路拉取GB的数据。我不确定原始列中存储了什么。这里您需要问的第一个问题是有多少数据返回到客户机?例如,如果每条记录的大小都是1MB+,那么您可能会受到磁盘和网络的限制。 概述:

我不知道你的问题中“慢”是什么意思。这是否意味着处理查询大约需要1秒,还是意味着需要5分钟?这里的一切都是相对的。 基本上,如果你不提出很多问题,就不可能给出一个明确的答案。如果您分析查询,了解返回给客户端的内容和数量,并观察各个部分之间的交互,所有这些都将得到证实


最后,根据返回到客户端的数据量,除了硬件更改之外,可能没有提高性能的方法。

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


如果没有Order By子句,这将如何运行?

如果不知道表、索引等是如何运行的,这将非常困难。请考虑向我们展示执行计划,我制作存储过程。我使用数据集来检索存储过程。你们有一些相关的指标吗?不知道使用逗号分隔从句和s之间的连接优化差异
标准加入我无论如何都会改变这一点,并将加入标准放在on条款中-子孙后代将感谢您。另外,你预计的时间是多少。实时?你能生成一个查询计划并在这里共享吗?多长时间是多长时间?返回了多少条记录?@TrickyNixon:给出第一行查询,我想说大约10条;