查询大尺寸的最快执行时间 table
Fastest execution time for querying on Big size table
我需要建议如何在大尺寸 table 上获得最快的查询结果。
我使用的是 SQL Server 2012,我的情况是这样的:
我有5个tables包含交易记录,每个table有3500万条记录。
所有 table 都有 14 列,我需要搜索的列是 GroupName、CustomerName 和 NoRegistration。我有一个包含所有这些 table 中的 5 个的视图。
GroupName、CustomerName 和 NoRegistration 记录不是每个 tables 唯一的。
我的应用程序具有搜索这些列的功能。
查询是这样的:
按群组名称搜索:
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分钟
我的想法是制作一个新的 tables,其中包含与所有 5 个 tables 不同的 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
您必须显示 sql 个 TransactionRecords_view。你有索引吗? NoRegistration 列的排序规则是什么?粘贴每个查询的实际执行计划。
好的,所以您不需要制作那些新的 table。如果您基于这些字段创建非聚集索引,它将(实际上)执行您想要的操作。索引只会存储您指定的列上的数据,而不是整个 table。但是请注意,索引非常有助于 SELECT 语句,但会对任何写入语句(INSERT、UPDATE 等)产生负面影响。
接下来您要 运行 启用实际执行计划的查询。这将向您展示优化器如何决定 运行 每个查询(在后端)。这里是否有任何特殊问题,是否有任何步骤占用了大量的整体运营成本? youtube 上有很多关于执行计划的精彩教学视频,如果您以前没有看过 exe 计划,请查看它们。
您是否尝试检查实际执行计划是否缺少索引?
此外,当您在 varchar 上使用子句时,我听说过全文搜索。也许它对您有用:
https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx
我需要建议如何在大尺寸 table 上获得最快的查询结果。 我使用的是 SQL Server 2012,我的情况是这样的:
我有5个tables包含交易记录,每个table有3500万条记录。 所有 table 都有 14 列,我需要搜索的列是 GroupName、CustomerName 和 NoRegistration。我有一个包含所有这些 table 中的 5 个的视图。 GroupName、CustomerName 和 NoRegistration 记录不是每个 tables 唯一的。
我的应用程序具有搜索这些列的功能。 查询是这样的:
按群组名称搜索:
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分钟
我的想法是制作一个新的 tables,其中包含与所有 5 个 tables 不同的 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
您必须显示 sql 个 TransactionRecords_view。你有索引吗? NoRegistration 列的排序规则是什么?粘贴每个查询的实际执行计划。
好的,所以您不需要制作那些新的 table。如果您基于这些字段创建非聚集索引,它将(实际上)执行您想要的操作。索引只会存储您指定的列上的数据,而不是整个 table。但是请注意,索引非常有助于 SELECT 语句,但会对任何写入语句(INSERT、UPDATE 等)产生负面影响。
接下来您要 运行 启用实际执行计划的查询。这将向您展示优化器如何决定 运行 每个查询(在后端)。这里是否有任何特殊问题,是否有任何步骤占用了大量的整体运营成本? youtube 上有很多关于执行计划的精彩教学视频,如果您以前没有看过 exe 计划,请查看它们。
您是否尝试检查实际执行计划是否缺少索引?
此外,当您在 varchar 上使用子句时,我听说过全文搜索。也许它对您有用:
https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx