我需要建议如何在大尺寸表上查询最快的结果。 我使用的是SQL Server 2012,我的情况是这样的:
我有5个表包含事务记录,每个表有35百万条记录。 所有表都有14列,我需要搜索的列是GroupName,CustomerName和NoRegistration。我有一个视图,其中包含所有这些表中的5个。 GroupName,CustomerName和NoRegistration记录在每个表中都不是唯一的。我的应用程序具有搜索这些列的功能。 查询是这样的:
按组名搜索:
SELECT DISTINCT(GroupName) FROM TransactionRecords_view WHERE GroupName LIKE ''+@GroupName+'%'
按名称搜索:
SELECT DISTINCT(CustomerName) AS 'CustomerName' FROM TransactionRecords_view WHERE CustomerName LIKE ''+@Name+'%'
按NoRegistration搜索:
SELECT DISTINCT(NoRegistration) FROM TransactionRecords_view WHERE LOWER(NoRegistration) LIKE LOWER(@NoRegistration)+'%'
我的问题是如何才能实现最快的搜索执行时间? 根据我的情况,每次我搜索,都需要3到5分钟。
我的想法是让一个新表包含来自所有5个表的GroupName,CustomerName和NoRegistration的不同。
我的想法是让执行时间更快吗?或任何其他想法?
谢谢
编辑:
这是查看" TransactionRecords_view"
的查询CREATE VIEW TransactionRecords_view
AS
SELECT * FROM TransactionRecords_1507
UNION ALL
SELECT * FROM TransactionRecords_1506
UNION ALL
SELECT * FROM TransactionRecords_1505
UNION ALL
SELECT * FROM TransactionRecords_1504
UNION ALL
SELECT * FROM TransactionRecords_1503
答案 0 :(得分:3)
您必须显示TransactionRecords_view的sql。你有索引吗? NoRegistration列的整理是什么?粘贴每个查询的实际执行计划。
答案 1 :(得分:1)
好的,所以你不需要制作那些新表。如果您根据这些字段创建非聚集索引,它将(实际上)执行您之后的操作。索引将仅存储您指定的列的数据,而不是整个表。但请注意,索引非常适合辅助SELECT语句,但会对任何写语句(INSERT,UPDATE等)产生负面影响。
接下来,您希望在启用实际执行计划的情况下运行查询。这将向您展示优化器如何决定运行每个查询(在后端)。这里是否有任何特殊问题,是否有任何步骤占用了整个运营商的成本?关于youtube的执行计划有很多很棒的教学视频,如果你以前没有看过exe计划,请查看它们。
答案 2 :(得分:0)
您是否尝试检查实际执行计划中是否缺少索引?
此外,当您在varchar上使用子句时,我已经听说过全文搜索..也许它对您有用:
https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx