我一直在閱讀關於索引和如何優化數據庫的最近兩天內容。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
一個最大和最重要的工具用於分析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%'搜索的東西。這些可能比全文索引更多地受益於常規索引。
位域。根本沒有索引位字段的指向(並且並非所有的數據庫甚至可以允許索引),因爲它沒有足夠的可變性來充分利用索引。
記住每個索引都會增加插入,更新或刪除的時間。雖然我注意到用戶通常會容忍更多的時間來做這些事情,但要從選擇中返回結果,必須牢記在心。
一些收藏:
查詢特別做了什麼? – GigaPr 2010-07-12 18:38:03
第一個查看所有包含「SCAN」的cahced查詢計劃,這通常表示索引未被使用。您可以更改WHERE中的註釋以查找其他內容。第二個查詢返回最慢的運行查詢。 – 2010-07-12 18:43:29