Как ускорить время ответа таблицы SQL и установить правильные индексы? - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть таблица, как вы можете видеть ниже

Listings
-----------------------------------------------------------------
ListingID            Make       Model     Year          Zipcode 

1                    BMW        325       2009          90210
2                    Mercedes   330 C     2006          33160
3    

около 2 миллионов строк. Каждый день я добавляю новые строки и удаляю старые.

В моем приложении я запрашиваю эту таблицу, перечисляя, по марке, по марке и модели, по марке и модели.

У меня есть кластеризованный индекс для ListingID и некластеризованный для всех остальных столбцов.

если я запрашиваю таблицу по listid, я получаю очень быстрый ответ. по марке, модели, почтовому индексу это очень медленно. например, чтобы вернуть 10000 записей с присоединяющейся таблицей с почтовыми индексами, около 25-30 секунд.

вот размер этой таблицы

enter image description here

Вот пример запроса, который я использую для возврата списка в пределах определенного радиуса.

  1. Сначала на основе почтового индекса и радиуса, с помощью функции я вставляю почтовый индекс во временную таблицу #CloseZips (занимает 0 секунд). Эта процедура очень быстро возвращает почтовый индекс в радиусе 0 секунд.

  2. Во-вторых, я присоединяюсь к таблице списков, вы можете видеть. Эта часть занимает время 25-60 секунд

            SELECT ListingID, Make, Model, Year, L.Zipcode, Year
        FROM Listings L WITH (NOLOCK)
        INNER JOIN  #CloseZips Z ON Z.ZipCode = L.Zipcode 
        WHERE L.Make = @Make AND L.Model = @Model AND L.IsActive = 1
        ORDER BY Z.Distance DESC
    

Вопросы:

  1. Какой подход был бы правильным подходом для повышения производительности на такого рода таблицы размеров?

  2. Нужно ли иметь индексы для всех столбцов?

  3. Каков наилучший способ ведения таких таблиц?

1 Ответ

2 голосов
/ 11 сентября 2011

Немного сложно помочь вам оптимизировать запрос, если вы не указали сам фактический запрос, но вот он:

  • Если вы присоединяетесь к почтовым индексам таблицы, убедитесь, что столбец почтового индекса проиндексирован в этой таблице.

  • Есть часть запроса, которую вы не обсуждали, - как вы оцениваете близость одного почтового индекса к другому. Ваш запрос также должен решить эту часть проблемы, и я предполагаю, что эта часть написана таким образом, что она не проиндексирована.

  • Если у вас есть отдельные индексы по марке, модели и почтовому индексу, и вы выполняете поиск по всем трем столбцам, будет использоваться только один индекс. Вам нужно будет использовать инструмент EXPLAIN, чтобы определить, какой из них - он не может быть оптимальным.

  • Поскольку, согласно вашему описанию, поиск всегда включает в себя марку, а поиски, включающие почтовый индекс, также всегда включают модель, я бы заменил ваши индексы на марку и модель на один индекс на (марка, модель, почтовый индекс). Это можно использовать для любых ваших запросов, чтобы обеспечить индексированный поиск. (Вам, вероятно, все еще понадобится индекс почтового индекса для JOIN).

Опять же, опубликуйте полный запрос SQL, и мы сможем оказать вам дополнительную помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...