Sql server 如何优化以下T-SQL查询
这是我的Sql server 如何优化以下T-SQL查询,sql-server,tsql,Sql Server,Tsql,这是我的sqlquery SELECT MIN(CompletedDate), MAX(CompletedDate) FROM dbo.FactTable WHERE IdColumn IN ('guid1','guid2','guid3', 'guid4') AND NameColumn1 IN (N'150 comma seperated names') AND NameColumn2 = ('name') 针对数据仓库中只有140万条记录
sql
query
SELECT MIN(CompletedDate), MAX(CompletedDate) FROM dbo.FactTable
WHERE IdColumn IN ('guid1','guid2','guid3', 'guid4')
AND NameColumn1 IN (N'150 comma seperated names')
AND NameColumn2 = ('name')
针对数据仓库中只有140万条记录的事实表执行。在我的本地机器上完成需要9秒钟。CompletedDate列可以使用非聚集索引和大量空值为空。我需要知道是否可以用更少的执行时间进一步优化它
我建议使用table变量来保存可能的
NameColumn1
值:
DECLARE @Names TABLE (NAME VARCHAR(255) PRIMARY KEY)
INSERT INTO @Names (NAME)
SELECT spt.col
FROM dbo.splitvalue(@name, ',') spt
SELECT . . .
FROM dbo.FactTable ft
WHERE IdColumn IN ('guid1','guid2','guid3', 'guid4') AND
NameColumn2 = 'name' AND
EXISTS (SELECT 1 FROM @Names N WHERE N.NAME = ft.NameColumn1);
为表中的CompletedDate列创建覆盖索引
Create Index IDX on TableName (col1,col2) Then Rewrite that as
Create Index IDX on TableName (col1,col2) Include (CompletedDate).
这样,您的键查找将被删除。我认为您需要一个覆盖索引。这不应该是('guid1'、'guid2'、'guid3'、'guid4')中的
。
?表FactTable上的所有索引基本上都是什么-键查找不好。您希望使用一个包含所有相关列的索引。SQL Server不应该在中的中处理150个值(远不是这样),但您最好在此时使用一个临时表/表变量和一个联接
;除了可读性,我们的事实表有40列。最终用户将设计具有不同列组合的仪表板,而dev express可视化工具将生成不同的查询。最好是跟踪所有查询并考虑覆盖索引每Quy您可以添加最多16列在覆盖索引。谢谢。这很有帮助。因此,如果我在我创建的索引的include部分中再添加15列,它还应该优化包含这15列的其他查询