簡體   English   中英

sql server 24/7 insert delete select performance

[英]sql server 24/7 insert delete select performance

我正在構建一個C#應用程序,它使用Bulkinsert每秒插入2000條記錄。

數據庫版本是2008 R2

應用程序調用一個SP,它使用TOP(10000)在塊中超過2小時時刪除記錄。 這在每次插入后執行。

最終用戶使用日期范圍和2到10個參數的選擇選擇要在圖表中查看的記錄。

由於應用程序將在沒有停機的情況下全天候運行,因此我擔心性能問題。

由於客戶沒有企業版,因此​​分區不是一種選擇。

  • 聚集索引定義是否良好?
  • 是否有必要實現任何索引重新創建/重新索引以提高性能,因為行插入表的一端並在另一端刪除?
  • 如何更新統計數據,它仍然是2008 R2的問題嗎?
  • 我使用OPTION(RECOMPILE)來避免在select中使用過時的查詢計划,這是一個好方法嗎?
  • 有沒有可以加速SELECT的桌面提示?
  • 關於鎖定策略的任何建議?

除了上面的場景,我還有3個表以不同的時間幀以相同的方式工作。 每20秒插入一次,刪除超過1周的行,另一次插入每分鍾,刪除超過六周的行,最后一次每5分鍾插入一次,刪除超過3年的行。

CREATE TABLE [dbo].[BufferShort](
    [DateTime] [datetime2](2) NOT NULL,
    [ParameterId] [int] NOT NULL,
    [BufferStateId] [smallint] NOT NULL,
    [Value] [real] NOT NULL,
 CONSTRAINT [PK_BufferShort] PRIMARY KEY CLUSTERED 
(
    [DateTime] ASC,
    [ParameterId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER PROCEDURE [dbo].[DeleteFromBufferShort]
@DateTime DateTime,
@BufferSizeInHours int

AS
BEGIN
    DELETE TOP (10000) 
    FROM BufferShort
    FROM BufferStates 
    WHERE BufferShort.BufferStateId = BufferStates.BufferStateId 
    AND BufferShort.[DateTime] < @DateTime
    AND (BufferStates.BufferStateType = 'A' OR BufferStates.Deleted = 'True')

    RETURN 0
END


ALTER PROCEDURE [dbo].[SelectFromBufferShortWithParameterList]
@DateTimeFrom Datetime2(2),
@DateTimeTo Datetime2(2),
@ParameterList varchar(max)

AS
BEGIN
SET NOCOUNT ON;

-- Split ParameterList into a temporary table
SELECT * INTO #TempTable FROM dbo.splitString(@ParameterList, ',');

SELECT *
FROM BufferShort Datapoints
JOIN Parameters P ON P.ParameterId = Datapoints.ParameterId
JOIN #TempTable TT ON TT.Token = P.ElementReference
WHERE Datapoints.[DateTime] BETWEEN @DateTimeFrom AND @DateTimeTo
ORDER BY [DateTime]
OPTION (RECOMPILE)

RETURN 0
END

這是一個明智/愚蠢的經典案例。 您每天要插入1.5億條記錄,而您沒有使用Enterprise。

不使用聚簇索引的主要原因是機器無法跟上插入的行數。 否則,您應始終使用聚簇索引。 是否使用聚簇索引的決定通常在那些認為每個表應該具有聚簇索引的人和那些認為可能有一個或兩個百分比的表不應該具有聚簇索引的人之間進行爭論。 (我沒有時間參與關於這個問題的“宗教”類型辯論 - 只是研究網絡。)除非桌面上的插入失敗,否則我總是使用聚簇索引。

我不會使用STATISTICS_NORECOMPUTE子句。 如果插入失敗,我只會將其關閉。 請參閱http://sqlmag.com/blog/statisticsnorecompute-when-would-anyone-want-use-it上的 Kimberly Tripp(MVP和真正的SQL Server專家)文章。

除非您在實際查詢計划中看到查詢未使用正確的索引(或連接類型),否則我也不會使用OPTION(RECOMPILE)。 如果您的查詢每分鍾/秒執行多次,則會對計算機的性能產生不必要的影響。

只要所有查詢至少指定了前導DateTime列,聚簇索引定義就會很好。 假設時間是遞增的,索引還將最大化插入速度,以及減少碎片。 您不應該經常重組/重新組織。

如果此表上只有聚簇索引,我不希望您需要經常更新統計信息,因為沒有其他數據訪問路徑。 如果您有其他索引和復雜查詢,請使用以下查詢驗證索引是否以升序標記。 如果統計信息沒有按品牌升序而且您有復雜的查詢,則可能需要經常更新統計信息:

DBCC TRACEON(2388);
DBCC SHOW_STATISTICS('dbo.BufferShort', 'PK_BufferShort');
DBCC TRACEOFF(2388);

對於@ParameterList,請考慮使用表值參數。 在表類型上指定Token的主鍵。

我建議你只在需要的時候引入RECOMPILE提示; 我懷疑你會得到一個沒有聚集索引的穩定計划。

如果遇到阻塞問題,請考慮更改數據庫以指定READ_COMMITTED_SNAPSHOT選項,以便將行版本控制而不是阻塞用於讀取一致性。 請注意,這將增加14個字節的行開銷並更多地使用tempdb,但並發優勢可能會超過成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM