Sql服务器索引技巧

问题描述:

我一直在阅读关于索引和如何优化数据库的最近两天内容。Sql服务器索引技巧

尽管我对索引有一个清晰的想法,我还不知道如何实际上优化我的数据库。

你可以建议任何教程或技术来优化数据库。

请具体说明,因为我一直在阅读大量的理论,但没有具体的指示到现在

感谢

如果“AINT”破不解决它。查找应用程序的缓慢区域,查找有问题的查询并分析这些查询计划,并解决索引问题(如果有的话)。不要只是开始对系统进行修改,因为你刚刚学到了一些东西!

进一步阅读:http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx

尝试此查询寻找失踪指标:

--based on http://stackoverflow.com/questions/1540192/searching-for-table-index-scans 
--this query will show cahced query plans that "SCAN", change comments for other things 

;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan') 
, CachedPlans AS 
(SELECT 
    RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID 
     ,RelOp.op.value(N'@NodeId', N'int') AS OperationID 
     ,RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator 
     ,RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator 
     ,RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost 
     ,RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO 
     ,RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU 
     ,RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows 
     ,cp.plan_handle AS PlanHandle 
     ,qp.query_plan AS QueryPlan 
     ,st.TEXT AS QueryText 
     ,cp.cacheobjtype AS CacheObjectType 
     ,cp.objtype AS ObjectType 
     ,cp.usecounts AS UseCounts 
    FROM sys.dm_exec_cached_plans       cp 
     CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)  st 
     CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp 
     CROSS APPLY qp.query_plan.nodes(N'//RelOp')   RelOp (op) 
) 
SELECT 
    PlanHandle 
     ,ParentOperationID 
     ,OperationID 
     ,PhysicalOperator 
     ,LogicalOperator 
     ,UseCounts 
     ,CacheObjectType 
     ,ObjectType 
     ,EstimatedCost 
     ,EstimatedIO 
     ,EstimatedCPU 
     ,EstimatedRows 
     ,QueryText 
    FROM CachedPlans 
    WHERE CacheObjectType = N'Compiled Plan' 
     AND PhysicalOperator IN ('nothing will ever match this one!' 
           --,'Assert'        
           --,'Bitmap' 
           --,'Clustered Index Delete' 
           --,'Clustered Index Insert' 
           ,'Clustered Index Scan' 
           --,'Clustered Index Seek' 
           --,'Clustered Index Update' 
           --,'Compute Scalar' 
           --,'Concatenation' 
           --,'Constant Scan' 
           ,'Deleted Scan' 
           --,'Filter' 
           --,'Hash Match' 
           ,'Index Scan' 
           --,'Index Seek' 
           --,'Index Spool' 
           ,'Inserted Scan' 
           --,'Merge Join' 
           --,'Nested Loops' 
           --,'Parallelism' 
           ,'Parameter Table Scan' 
           --,'RID Lookup' 
           --,'Segment' 
           --,'Sequence Project' 
           --,'Sort' 
           --,'Stream Aggregate' 
           --,'Table Delete' 
           --,'Table Insert' 
           ,'Table Scan' 
           --,'Table Spool' 
           --,'Table Update' 
           --,'Table-valued function' 
           --,'Top' 
           ) 

或者这一个:

SELECT TOP 50 
    total_worker_time/execution_count AS Avg_CPU_Time 
     ,execution_count 
     ,total_elapsed_time/execution_count as AVG_Run_Time 
     ,(SELECT 
       SUBSTRING(text,statement_start_offset/2,(CASE 
                  WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                  ELSE statement_end_offset 
                 END -statement_start_offset)/2 
         ) FROM sys.dm_exec_sql_text(sql_handle) 
     ) AS query_text 
FROM sys.dm_exec_query_stats 
ORDER BY 3 DESC 
+0

查询特别做了什么? – GigaPr 2010-07-12 18:38:03

+0

第一个查看所有包含“SCAN”的cahced查询计划,这通常表示索引未被使用。您可以更改WHERE中的注释以查找其他内容。第二个查询返回最慢的运行查询。 – 2010-07-12 18:43:29

一个最大和最重要的工具用于分析SQL Server的性能是SQL Profiler。这并不容易理解和使用,因此这个Master SQL Server Profiler视频系列可能会帮助您了解如何使用SQL Profiler来帮助您进行SQL Server性能调优。

首先查看索引的最关键的事情是: 外键(它们不是自动索引的,通常用于连接,因此通常应该索引,除非表的大小很小并且保持很小。)更多往往不是FK需要索引。

事情在哪里有足够的可变性来使索引有用。例如,where子句中使用的last_name可能需要一个索引,但只有'Y'或'N'文本的字段才会从中受益。 你会经常订购的东西。

如果只有一个查询使用where或order by中的特定字段,则不要编制索引,除非查询时间过长。

不归功于索引的东西: 大字段是text或varchar(Max)或通常通过类似'%text%'搜索的东西。这些可能比全文索引更多地受益于常规索引。

位域。根本没有索引位字段的指向(并且并非所有的数据库甚至可以允许索引),因为它没有足够的可变性来充分利用索引。

记住每个索引都会增加插入,更新或删除的时间。虽然我注意到用户通常会容忍更多的时间来做这些事情,但要从选择中返回结果,必须牢记在心。

一些收藏:

  1. Performance tuning articles and tutorials从 SQLServerPedia
  2. An introduction to indexes从SQL 服务器MVP盖尔肖
  3. SQL Server Execution Plans格兰特Fritchey。 理解执行计划将 是优化代码的关键部分。 这是我读过的最好的SQL Server 书籍之一,它是免费的。