簡體   English   中英

SQL - 3.77億表的性能差查詢

[英]SQL - Poor Performance SELECT Query on 377 million table

我得到了一個具有以下結構的表:

Id | clientid | type | timeStamp | message |

我正在使用此查詢來獲取表的第一行以開始刪除行但是崩潰了DB:

SELECT TOP 10 [id]
      ,[clientid]
      ,[type]
      ,[timeStamp]
      ,[message]
FROM [db].[dbo].[table]
WHERE timeStamp LIKE '%2014-01-01 00:00:00.000%'

有沒有辦法讓第一行沒有崩潰並刪除它們才到達timeStamp '2016-01-01 00:00:00.000'

我不確定我是否理解這一點:

如果在TimeStamp列上設置索引,則應該絕對快速地過濾給定日期的行或多或少。

這些行將刪除TimeStamp小於2016-01-01的表中的所有內容。 只剩下當前的參賽作品......

注意:小心! 不要測試真實數據! :-)

DELETE FROM myTable
WHERE ID IN(SELECT ID 
            FROM myTable AS innerTbl 
            WHERE innerTbl.Timestamp<{ts'2016-01-01 00:00:00'}
           )

更新

這將刪除每次調用1000行。 “GO”背后的數字將執行此片段377000次。 用較小的數字測試......

BEGIN TRANSACTION;
DELETE FROM myTable
WHERE ID IN(SELECT TOP 1000
            ID 
            FROM myTable AS innerTbl 
            WHERE innerTbl.Timestamp<{ts'2016-01-01 00:00:00'}
           );
COMMIT;
GO 377000

簡單?

WHERE timeStamp = '2014-01-01 00:00:00.000'

你為什么用LIKE 這最有效地減慢了查詢速度, LIKE通常用於比較部分字符串。

你可以截斷日期時間,並使用正常比較:

SELECT TOP 10 [id]
      ,[clientid]
      ,[type]
      ,[timeStamp]
      ,[message]
FROM [db].[dbo].[table]
WHERE cast(timeStamp AS DATE) = '2014-01-01'

當沒有額外的東西可以添加到日期時間時,不確定為什么使用LIKE

要么使用=

SELECT TOP 10 [id]
      ,[clientid]
      ,[type]
      ,[timeStamp]
      ,[message]
FROM [db].[dbo].[table]
WHERE timeStamp ='2014-01-01 00:00:00.000'

或者,如果您嘗試從當天開始全部使用CONVERT功能。 (我選擇了103因為我從西班牙看到你並使用DD/MM/YYYY格式)。

SELECT TOP 10 [id]
      ,[clientid]
      ,[type]
      ,[timeStamp]
      ,[message]
FROM [db].[dbo].[table]
WHERE CONVERT(VARCHAR(11),timeStamp ,103) = '01/01/2014'

我猜ID是一個標識列? 可能懶惰的DBA也把它作為聚集索引? 做就是了

DELETE TOP (10) from [Table] order by ID ASC

請注意,在完全記錄模式下,這將是激烈的

您應該在時間戳上創建索引。

您可以設置過濾索引,因為它是一個相當大的表。

CREATE NONCLUSTERED INDEX IX_Table_timestamp ON Table([timestamp]) WHERE CONVERT(DATE,[timestamp]) = '2014-01-01';

然后按小批量刪除行。

來自Aaron Bertrand的舊帖子的代碼。

SET NOCOUNT ON;

DECLARE @r INT;

SET @r = 1;

WHILE @r > 0
BEGIN
  BEGIN TRANSACTION;

  DELETE TOP (10000) 
    dbo.Table
    WHERE CONVERT(DATE,[timestamp]) = '2014-01-01';

  SET @r = @@ROWCOUNT;

  COMMIT TRANSACTION;

END

如果您有一個自動遞增的列ID,而不是使用ID選擇第一行的原因?

DELETE TOP (1) from [Table] order by ID ASC

暫無
暫無

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

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