我正在使用MS SQL,并且必须在同一表上以不同条件运行多个查询。最初,我在原始表上运行了每个查询,尽管它们都共享一些过滤条件(即日期,状态)。这花费了很多时间(大约2分钟)。
数据行中有重复项,并且所有索引都是非聚集的。我只对4列的标准感兴趣,并且结果应仅输出所有查询的计数。
列需要:TABLE
,FIELD
,AFTER
,DATE
,并且对每一个的索引DATE
和TABLE
。
在仅创建了我需要的字段的临时表之后,它降到了1:40分钟,这仍然非常糟糕。
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Runnig this->(受影响的216598行)
由于并非所有查询都依赖日期范围,因此我没有将其包括在查询中。问题在于,仅插入需要1分钟以上的时间。上面的插入内容花费了1:19分钟
我想对几个查询运行这样的内容:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
插入问题多于选择问题,但是temp的行数远少于原始表,这可能比遍历该表要好得多。
我该如何优化呢?
编辑
我删除了排序ID,我认为问题主要出在选择而不是插入。这是一个猜测。
由于没有唯一的字段或行,因此无法在任何索引上创建唯一的。
我正在使用SQL Server 2012。
表信息:它是一个堆,具有以下空间使用量:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
,为什么不尝试分别优化每个(查询)?您是否不允许向表添加索引?
TABLE
和FIELD
列#temp
(毕竟所有行都具有TABLE = 'OTB' AND FIELD = 'STATUS'
特定的临时表。)
CREATE TABLE
语句)。否决票是因为问题不清楚。