Sql server 2008 获得更好的想法。

Sql server 2008 获得更好的想法。,sql-server-2008,tsql,join,left-join,Sql Server 2008,Tsql,Join,Left Join,视图,除非它们是索引视图(您必须遵循许多规则来定义和使用这些视图),它们类似于其他编程语言中的宏-它们被有效地扩展到使用它们的查询中,然后整个查询在这一点上得到优化 因此,视图在任何方面都不是“关于”性能的——它们通常提供的只是引用查询的简写(它们可能隐藏了复杂的查询,或者实现了专门的规则,例如安全性) 我将继续检查执行计划,并继续研究查询中最昂贵的部分,直到执行时间为您所接受-我不知道在您当前的情况下2.5秒是否“足够快”,在进行优化之前,您确实需要定义可接受的性能。在一个完美的世界中,将一个

视图,除非它们是索引视图(您必须遵循许多规则来定义和使用这些视图),它们类似于其他编程语言中的宏-它们被有效地扩展到使用它们的查询中,然后整个查询在这一点上得到优化

因此,视图在任何方面都不是“关于”性能的——它们通常提供的只是引用查询的简写(它们可能隐藏了复杂的查询,或者实现了专门的规则,例如安全性)


我将继续检查执行计划,并继续研究查询中最昂贵的部分,直到执行时间为您所接受-我不知道在您当前的情况下2.5秒是否“足够快”,在进行优化之前,您确实需要定义可接受的性能。

在一个完美的世界中,将一个视图连接到另一个视图不会影响您的性能。不幸的是,在我们生活的世界里,这是一个问题。基本上,您向优化器抛出的对象和联接越多,优化器在有限的时间内需要做的工作就越多,超时的可能性就越大,从而导致次优计划。因此,一般来说,与其将一个视图连接到另一个视图,不如重写查询,以便只引用所需的信息,从而使优化器的工作更轻松

至于将所有内容放在大表中,而不是标准化数据,这取决于您的情况,可以执行得更好。但是,它也可能表现得更糟。与在单个页面上分散存储大量信息的小数据集不同,您将非常大的数据集塞满到一个页面上,因此每页只有很少的行。不管怎样,您都必须阅读页面,因此,如果您只需要一行信息,您可能会看到相同的性能,或者通过消除连接而降低性能。但是,当您看到多个寻道或扫描时,性能会因数据过度规范化而严重降低


如果您使用的是关系数据库管理系统,我强烈建议您接受关系数据管理的概念。规范化结构,强制执行主键,强制执行外键,按照设计的方式使用系统,您将获得好处。当人们不再像对待RDBMS那样对待它,而是试图把它当作文件存储或NoSQL系统来对待时,大多数问题就会出现(它们确实擅长于它们所做的工作,但你必须需要它们所做的工作才能使它们工作良好,我还看到人们像RDBMS一样使用NoSQL数据库,然后抱怨它们工作不正常…。

只对索引列进行连接,对查询中的所有表重建索引(或对它们进行索引碎片整理),尤其是在您要加入并获得如此糟糕性能的表上

维护索引后,最好使用“FULLSCAN”运行“UPDATE STATISTICS tableName”以获得最佳样本,但指定“WITH SAMPLE 20%”或任何较大的样本大小会提供比使用默认值更好的统计信息。此外,如果选择重建所有索引,则还可以通过添加“列”来节省时间,以仅重新生成列统计信息,因为重建索引已经为您提供了索引统计信息的完美采样。 因此,最佳语句应该是“使用FULLSCAN、COLUMNS更新统计表名”

另外,我支持已经说过的只使用实际的表而不是视图来编写整个查询的说法,除非这些视图被编入了有利于您的索引。此外,您应该只指定在SELECT语句中实际使用的列,而不是使用SELECT*。这样优化器就有机会做更少的工作,甚至可以跳过读取某些表中的聚集索引,如果您碰巧有一个包含该表所需全部内容的索引


如果进行我建议的更改并没有给您带来更好的性能,并且您没有受到阻塞的困扰,那么我认为我们需要查看您的查询计划,以更好地了解正在发生的情况。

视图是一个虚拟表,由一个或多个表中的列组成。您无法实际使用此技术筛选记录。所有匹配/不匹配的记录将出现在结果集中,具体取决于您的联接(内部/左侧)

所以,基本上,在使用视图时,您必须等待执行,直到所有记录都存储在RAM中

另一方面,存储过程为您提供了输入参数选项来过滤查询

有两种方法可以快速从存储过程中获取结果集,具体取决于特定表中存在的记录数

案例1

Select Column1, Column2 From LargeTable T1
Inner Join SmallTable T2 on T2.Id = T1.Id
Where T1.ID = 1;
案例2

Select Column1, Column2 From
(
    Select Column1, Column2, ID From LargeTable Where ID = 1
)K
Inner Join SmallTable T2 on T2.ID = K.ID

检查差异…希望这将帮助您优化它…

没有迹象表明sp_uu或count与上面讨论的性能问题有任何关系。您是否碰巧有调用其他视图的视图?这些视图可能非常慢。没有调用其他视图的视图。只有包含到表的联接的视图。可以吗向我们展示sp?有时,看到您正在做的事情可以让我们了解可能存在问题的地方。这是一个很好的建议-从视图中删除逻辑,然后将其添加到存储过程中。因此,一般来说,问题是,将加入逻辑从视图中删除,并在存储过程中使用它,性能会提高吗?您仍在创建连接,等等,那么创建非规范化主表会带来更好的性能吗?在2的情况下检查连接…这将具有较小的索引,因此执行速度将最快。
CREATE PROC dbo.ProcName
AS
 SET NOCOUNT ON;
--Procedure code here
SELECT column1 FROM dbo.TblTable1
-- Reset SET NOCOUNT to OFF
SET NOCOUNT OFF;
GO
SELECT * FROM dbo.MyTable -- Preferred method
 -- Instead of
SELECT * FROM MyTable -- Avoid this method
 --And finally call the stored procedure with qualified name like:
EXEC dbo.MyProc -- Preferred method
 --Instead of
EXEC MyProc -- Avoid this method
IF EXISTS (SELECT 1 FROM sysobjects
WHERE name = 'MyTable' AND type = 'U')
DECLARE @Query VARCHAR(100)
DECLARE @Age INT
 SET @Age = 25
SET @Query = 'SELECT * FROM dbo.tblPerson WHERE Age = ' + CONVERT(VARCHAR(3),@Age)
EXEC (@Query)
DECLARE @Query NVARCHAR(100)
SET @Query = N'SELECT * FROM dbo.tblPerson WHERE Age = @Age'
EXECUTE sp_executesql @Query, N'@Age int', @Age = 25
BEGIN TRY
--Your t-sql code goes here
END TRY
BEGIN CATCH
--Your error handling code goes here
END CATCH
Select Column1, Column2 From LargeTable T1
Inner Join SmallTable T2 on T2.Id = T1.Id
Where T1.ID = 1;
Select Column1, Column2 From
(
    Select Column1, Column2, ID From LargeTable Where ID = 1
)K
Inner Join SmallTable T2 on T2.ID = K.ID