我有2个表('键'由大约6个字段组成,'统计'由大约65个字段组成)。
我想在两个表中插入行而不发布短语文本。我使用这样的东西:
UPDATE Keys SET CommandType = 'ADDED', CommandCode = @CommandCode WHERE
KeyText = @KeyText AND Tab_ID = @TabID AND CommandType = 'DELETED';
INSERT INTO Keys (IsChecked, KeyText, AddDateTime, Tab_ID, KeySource_ID, CommandCode, CommandType)
SELECT 0, @KeyText, datetime(), @TabID, @KeySourceID, @CommandCode, 'ADDED'
WHERE NOT EXISTS (SELECT 1 FROM Keys WHERE Tab_ID = @TabID AND KeyText = @KeyText);
INSERT INTO Statistics (Key_ID)
SELECT ID FROM Keys WHERE KeyText = @KeyText AND Tab_ID = @TabID AND (CommandType IS NULL OR CommandType <> 'DELETED') AND
NOT EXISTS (SELECT 1 FROM Statistics WHERE Key_ID = (SELECT ID FROM Keys WHERE KeyText = @KeyText AND Tab_ID = @TabID AND (CommandType IS NULL OR CommandType <> 'DELETED') LIMIT 1));
我该如何优化它?我为此查询字段中使用的所有内容创建索引。也许你可以推荐一些解决方案吗?
感谢您的帮助,抱歉我的英语不好。
答案 0 :(得分:1)
您可以使用MERGE语句将insert / update语句组合到单个语句中。 如果要将键的修改复制到统计信息中,可以使用OUTPUT语句。
您必须在问题中添加索引才能评论其有效性,但基本上您希望每个表上包含where子句中所有列的单个索引。您希望对select中不包含where子句的任何内容使用include列。
优化的最佳方法是获取估计/实际查询计划,并查看查询的哪些部分很慢。在SQL Server中,这是从“查询”菜单完成的。基本上,注意任何说“扫描”的东西,这意味着你错过了一个索引。 “寻求”是好的。
但是,查询计划主要有助于微调。在这种情况下,使用不同的算法(如合并/输出)将产生更大的差异。
在SQL Server中,结果看起来有点像这样:
INSERT INTO [Statistics] (ID)
SELECT ID FROM
(
MERGE [Keys] AS TARGET
USING (
SELECT @KeyText AS KeyText, @TabID AS TabId, @CommandCode AS CommandCode, @KeySourceID AS KeySourceID, 'Added' AS CommandType
) AS SOURCE
ON (target.KeyText = source.KeyText AND target.Tab_Id = @TabID)
WHEN MATCHED AND CommandType = 'DELETED' THEN
UPDATE SET Target.CommandType = Source.CommandType, Target.CommandCode = Source.CommandCode
WHEN NOT MATCHED BY TARGET THEN
INSERT (IsChecked, KeyText, AddDateTime, Tab_Id, KeySource_ID, CommandCode, CommandType) VALUES (0, KeyText, getdate(), TabId, KeySourceId, CommandCode, CommandType)
OUTPUT $Action, INSERTED.ID
) AS Changes (Action, ID)
WHERE Changes.Action = 'INSERT'
AND NOT EXISTS (SELECT 1 FROM Statistics b WHERE b.ID = Changes.ID)
答案 1 :(得分:1)
创建索引会降低插入和更新查询的速度,因为索引必须与数据一起更新。要优化特定的插入语句,请删除典型select语句不需要的任何索引。然后努力简化那些“而不存在”的条款。这些是您将获得的任何性能提升的唯一来源。一旦你简化了子查询,尝试创建索引来加速子查询。
答案 2 :(得分:0)
问题在于我的表的索引不好。我重新构建它并用静态内容替换一些查询参数,它工作得很好!