【问题标题】:How to get record fast when you have switchoffset in your where clause?当您的 where 子句中有 switchoffset 时,如何快速获取记录?
【发布时间】:2020-03-16 05:17:06
【问题描述】:

我有一个查询,我必须在 where 子句中使用 switchoffset 从数据库中获取记录,这需要大量时间。例如:

 CREATE TABLE #TempTable(
 ID int,
 Date datetime,
 Name char(20))

就像下面我在表中有 > 100k 条记录(这是真实情况)。下面只有 10 条记录,结果很快就会出来,但是如果我们用 5000 条记录尝试这个,它只会卡住几分钟。

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 1, GETDATE(), 'abc' );

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 2, GETDATE(), 'abc' );

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 3, GETDATE(), 'abc' );

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 4, GETDATE(), 'abc' );

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 5, GETDATE(), 'abc' );

INSERT INTO #TempTable( ID, Date, Name )
VALUES( 6, GETDATE(), 'abc' );
INSERT INTO #TempTable( ID, Date, Name )
VALUES( 7, GETDATE(), 'abc' );
INSERT INTO #TempTable( ID, Date, Name )
VALUES( 8, GETDATE(), 'abc' );
INSERT INTO #TempTable( ID, Date, Name )
VALUES( 9, GETDATE(), 'abc' );
INSERT INTO #TempTable( ID, Date, Name )
VALUES( 10, GETDATE(), 'abc' );
SELECT *
FROM #TempTable
WHERE CAST(SWITCHOFFSET([Date], '-07:00') AS DATE) = '2019-11-20';

在需要大量时间的情况下使用 switchoffset,我必须根据时间偏移量获取记录。 有什么办法可以解决这个问题吗?

【问题讨论】:

  • " 有什么办法可以解决这个问题?" 良好的索引?
  • 轶事:我发现临时表在存储几行时很好,但在存储数千行时性能很差。我想这与动态分配磁盘/临时数据库有关。无论如何,尝试使用表变量来代替

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

通常,您希望避免对列进行函数调用。因此,请尝试以相反的顺序执行此操作:

SELECT *
FROM #TempTable
WHERE CAST(Date AS DATE) = SWITCHOFFSET('2019-11-20', '+07:00')

CAST() 是一个例外。这仍然允许使用索引。

注意:您需要在(Date) 上建立索引以提高性能。

【讨论】:

  • 我尝试了逆序,但使用 switchoffset 仍然需要太多时间
  • @AnilThakur 。 . .你有(date) 的索引吗?这样才能真正提高性能。
猜你喜欢
  • 2019-11-01
  • 2015-05-18
  • 1970-01-01
  • 2017-10-14
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多