【问题标题】:Sql server indexes tipsSql server 索引提示
【发布时间】:2011-03-14 22:47:04
【问题描述】:

过去两天我一直在阅读有关索引以及如何优化数据库的内容。

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

您能推荐任何优化数据库的教程或技术吗?

请具体一点,因为我已经阅读了很多理论,但到目前为止还没有具体的说明

谢谢

【问题讨论】:

    标签: sql sql-server-2008 indexing


    【解决方案1】:

    一些最爱:

    1. Performance tuning articles and tutorials 来自 SQLServerPedia
    2. An introduction to indexes 来自 SQL 服务器 MVP Gail Shaw
    3. SQL Server Execution Plans 格兰特·弗里奇。 了解执行计划将 成为优化代码的关键部分。 这是最好的 SQL Server 之一 我读过的书是免费的。

    【讨论】:

      【解决方案2】:

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

      where 子句中具有足够可变性以使索引有用的东西。例如,在 where 子句中使用的 last_name 可能需要索引,但仅包含“Y”或“N”文本的字段不会从中受益。 您会经常订购的东西。

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

      不要索引的东西: 大字段是 text 或 varchar(Max) 或通常通过 '%text%' 搜索的内容。与常规索引相比,这些可能从全文索引中受益更多。

      位域。对位字段进行索引根本没有意义(并非所有数据库甚至都允许索引),因为它没有足够的可变性来充分利用索引。

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

      【讨论】:

        【解决方案3】:

        如果它“没有”损坏,请不要修复它。查找应用程序的慢速区域,找到有问题的查询并分析这些查询计划并解决索引问题(如果有)。不要因为刚刚学到一些东西就开始对系统进行更改!

        进一步阅读: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
        

        【讨论】:

        • 查询具体做了什么?
        • 第一个查看所有包含“SCAN”的缓存查询计划,这通常表示没有使用索引。您可以更改 WHERE 中的 cmets 以查找其他内容。第二个查询返回运行最慢的查询。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-06
          • 2014-09-18
          • 1970-01-01
          • 2011-03-18
          • 2014-11-23
          • 1970-01-01
          相关资源
          最近更新 更多