2010-07-12 184 views
3

我一直在閱讀關於索引和如何優化數據庫的最近兩天內容。Sql服務器索引技巧

儘管我對索引有一個清晰的想法,我還不知道如何實際上優化我的數據庫。

你可以建議任何教程或技術來優化數據庫。

請具體說明,因爲我一直在閱讀大量的理論,但沒有具體的指示到現在

感謝

回答

3

如果「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

1

一個最大和最重要的工具用於分析SQL Server的性能是SQL Profiler。這並不容易理解和使用,因此這個Master SQL Server Profiler視頻系列可能會幫助您瞭解如何使用SQL Profiler來幫助您進行SQL Server性能調優。

1

首先查看索引的最關鍵的事情是: 外鍵(它們不是自動索引的,通常用於連接,因此通常應該索引,除非表的大小很小並且保持很小。)更多往往不是FK需要索引。

事情在哪裏有足夠的可變性來使索引有用。例如,where子句中使用的last_name可能需要一個索引,但只有'Y'或'N'文本的字段纔會從中受益。 你會經常訂購的東西。

如果只有一個查詢使用where或order by中的特定字段,則不要編制索引,除非查詢時間過長。

不歸功於索引的東西: 大字段是text或varchar(Max)或通常通過類似'%text%'搜索的東西。這些可能比全文索引更多地受益於常規索引。

位域。根本沒有索引位字段的指向(並且並非所有的數據庫甚至可以允許索引),因爲它沒有足夠的可變性來充分利用索引。

記住每個索引都會增加插入,更新或刪除的時間。雖然我注意到用戶通常會容忍更多的時間來做這些事情,但要從選擇中返回結果,必須牢記在心。