改善我的MySQL

时间:2015-12-03 03:17:15

标签: sql sql-server vb.net ssms

我想问一下如何加快我的SQL查询?因为我有大量的记录,而且读得太慢了。我正在使用3个查询btw检查数据库,如果数据存在问题,它是否读取速度慢。我是VB.Net的新手,在Windows端管理SQL Server。我不确定我是否正确地操作或如何正确地索引列。

我得到了一张包含这些列的表company

id, company name, abbreviation, symbol, type, sub-industry 

我想优化我的查询。

Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE [db_Analytics].[dbo].[Companies].[Company Name] LIKE '" & atempstr.Substring(0, 3) & "%'", Con)

Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE Replace([db_Analytics].[dbo].[Companies].[Company Name], ' ', '') = '" & atempstr.Replace(" ", "") & "' OR Replace([db_Analytics].[dbo].[Companies].[Company Name], ' ', '') LIKE '" & antempstr.Replace(" ", "") & "'", Con)

Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE Replace([db_Analytics].[dbo].[Companies].[Abbreviation], ' ', '') = '" & atempstr.Replace(" ", "") & "'", Con)

1 个答案:

答案 0 :(得分:1)

我假设您实际使用Microsoft SQL Server,基于SELECT语句的语法。我还假设这三个查询是在程序的不同部分执行的,而不是一个接一个地执行。如果是这种情况,请提供更多上下文,例如在使用每个查询时程序中发生的情况。数据库是存储在单个硬盘驱动器还是RAID阵列上?这些字段是什么数据类型(varchar,nvarchar)?请更新您的问题或添加评论,我会酌情更新此答案。

Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE [db_Analytics].[dbo].[Companies].[Company Name] LIKE '" & atempstr.Substring(0, 3) & "%'", Con)

我不知道细节,建议在[公司名称]字段中添加索引。尝试获取查询的执行计划,以了解它们如何更详细地运行;这可以从SQL Server Management Studio完成。查看此帖子了解详细信息:How do I obtain a Query Execution Plan?如果您有一个,首先在开发服务器上尝试此操作,因为您真的不应该"实验"在生产箱上!

Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE Replace([db_Analytics].[dbo].[Companies].[Company Name], ' ', '') = '" & atempstr.Replace(" ", "") & "' OR Replace([db_Analytics].[dbo].[Companies].[Company Name], ' ', '') LIKE '" & antempstr.Replace(" ", "") & "'", Con)


Using Com As New SqlCommand("SELECT [db_Analytics].[dbo].[Companies].[Company Name],[db_Analytics].[dbo].[Companies].[Company] FROM [db_Analytics].[dbo].[Companies] WHERE Replace([db_Analytics].[dbo].[Companies].[Abbreviation], ' ', '') = '" & atempstr.Replace(" ", "") & "'", Con)

您可能还想索引缩写字段。

如果您需要经常搜索缩写和[公司名称]字段以获取数据并删除空格,则使用公司名称和缩写每个没有空格向表中添加新字段会更有效,例如[公司名称nospace]和[缩写nospace]。为什么?如果必须经常运行这些查询,那么访问每一行,从字符串中删除空格以及比较它们所涉及的开销将很快增加。在这种情况下,将表中的数据放在不带空格的不同字段中会更有效。

如果您不知道如何在MSSQL Server中创建索引,请查看此MSDN文章:https://msdn.microsoft.com/en-us/library/ms188783.aspx至少,您可以说

CREATE INDEX idxCompanyName ON [db_Analytics].[dbo].[Companies]([Company Name]);

在[公司名称]字段上创建索引,但必须研究表格的最佳索引配置。

根据OP的评论更新: 如果您从单个硬盘驱动器运行数据库,事情会有点迟缓。我猜这是一个非常基本的服务器,一个用作服务器的工作站,或一个开发盒。在这种情况下,您所能做的就是尝试补偿存储设置。如果您正在使用MSSQL Server 2014,则可以尝试使用内存表,但必须具有足够的RAM用于操作系统,SQL Server和数据。如果没有,你可能会让事情更糟,因为Windows会把它换成磁盘。查看http://robtiffany.com/create-in-memory-database-tables-sql-server-2014/https://msdn.microsoft.com/en-us/library/dn133079.aspx如果可能的话,尝试将最后两个查询合并为一个,这样MSSQL的查询优化器就可以了。此外,为了查询公司名称和没有空格的缩写,您可以执行以下操作之一:

  • 包含数据的varchar列和您编写的应用程序将其放在那里
  • 让varchar列包含使用触发器放入字段的数据
  • 根据[缩写]和[公司名称]列计算字段。这可能会导致更多的开销,从而使您的性能受到更大的影响,因此请先进行研究。