2015-12-03 2 views
1

Я хотел бы спросить, как я могу ускорить свой SQL-запрос? Потому что у меня много записей, и он читается слишком медленно. Я использую 3 запроса btw для проверки базы данных, если существует существующая проблема, она читает медленно. Я новичок в VB.Net и управляю SQL Server со стороны Windows. Я не уверен, правильно ли я делаю это правильно или как правильно индексировать столбец.Улучшите мой MySQL

Я получил таблицу 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) 
+0

Сколько записей в вашей таблице VS сколько вам действительно нужно? если у вас огромное количество записей, и вам не нужны все, что вы можете улучшить, ограничивая результаты с помощью 'TOP' или используя' ROW_NUMBER() как dynamicID' для генерации динамического идентификатора, упорядочивая его и ограничивая значения, используя 'WHERE dynamicID BETWEEN ... AND ...' –

+0

@GordonLinoff было удалено, пока Alexandre Cartaxo не добавил его обратно. мое редактирование, чтобы удалить его снова, находится на рассмотрении –

+0

Убейте его. У меня есть 30k строк в db и 100k необработанных данных для сравнения – user2962807

ответ

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, вы можете попробовать таблицу в памяти, но у вас должно быть достаточно ОЗУ для операционной системы, SQL Server и данных. Если нет, вы, вероятно, сделаете вещи хуже, потому что Windows поменяет его на диск. Проверьте http://robtiffany.com/create-in-memory-database-tables-sql-server-2014/ и https://msdn.microsoft.com/en-us/library/dn133079.aspx Если возможно, попробуйте объединить последние два запроса в один, чтобы оптимизатор запросов MSSQL мог пойти на него.Кроме того, для выполнения запросов от имени компании и аббревиатуры без пробелов, вы можете сделать одно из нескольких вещей:

  • Have VARCHAR столбцов, содержащих данные и приложение вы пишете ставит его там
  • У VARCHAR колонок, содержащие данные, помещенные в поля с помощью триггера
  • Вычисляемые поля, основанные на столбцах [аббревиатура] и [название компании]. Это может вызвать дополнительные накладные расходы, поэтому вы получите еще больший удар по производительности, поэтому сначала выполните исследования.
+0

Его хранятся на одном жестком диске, а столбцы - varchar (255). И его право за другим. Я пытаюсь ура предложения. То, что он делает, сравнивает данные excel с моими данными db и корректирует неправильные, поэтому почему я получил 2 столбца компании – user2962807

Смежные вопросы