c # - SQL - ускорить код в БД - PullRequest
0 голосов
/ 03 мая 2010

У меня есть страница с 26 разделами - по одному на каждую букву алфавита. Я извлекаю список производителей из базы данных, и для каждого из них создаю ссылку - используя другое поле в базе данных. Поэтому в настоящее время я оставляю соединение открытым, а затем делаю новый SELECT по каждой букве, ГДЕ ИМЯ КАК это письмо. Хотя это очень медленно.

Какой лучший способ сделать это?

ТИА

Ответы [ 9 ]

4 голосов
/ 03 мая 2010

Так как вы все равно будете собирать их все, вы можете быстрее найти их за один раз и разбить их на группы букв в коде.

Глядя на это с другого конца, зачем вам выбирать все списки только для создания набора ссылок? Разве вы не должны получить одну букву при нажатии на ссылку?

2 голосов
/ 03 мая 2010

Похоже, вы делаете до 26 запросов, которые никогда не будут быстрыми. Часто один запрос БД может занять не менее 40 мс из-за задержки в сети, установления соединения и т. Д. Таким образом, выполнение этого 26 раз означает, что это займет около 40 x 26 мс или более одной секунды. Конечно, это может занять гораздо больше времени в зависимости от вашей схемы, набора данных, оборудования и т. Д., Но это практическое правило, которое дает вам приблизительное представление о влиянии запросов на общее время отображения страницы.

Один из способов справиться с такой ситуацией - использовать DataTable. Извлеките все записи в DataTable, а затем вы можете выполнить итерацию по алфавиту и использовать метод Select для фильтрации.

DataTable myData = GetMyData();
foreach(string letter in lettersOfTheAlphabet)
{
    myData.Filter(String.Format("Name like '{0}%'", letter));
    //create your link here
}

В зависимости от уровня модели вы можете фильтровать по-разному, но это основная идея, которая должна значительно улучшить производительность.

Предполагая, что вы запрашиваете, какие буквы используются, чтобы вы знали, какие ссылки отображать, вы могли бы просто запросить сами буквы, например:

select distinct substring(ManufacturerName, 1, 1) as FirstCharacter
from MyTable
order by 1
0 голосов
/ 03 мая 2010

Если я правильно вас понял, вы делаете запрос для каждого производителя , чтобы получить «другое поле», необходимое для построения ссылки. Если это так, это ваша проблема, а не 26 алфавитных запросов (хотя это не поможет).

В таком случае быстрее выполняется этот запрос:

SELECT manufacturer_name, manufacturer_id, different_field 
FROM manufacturers m
INNER JOIN different_field_table d
ON m.manufacturer_id = d.manufacturer_id
ORDER BY manufacturer_name

В коде вашего сервера просматривайте записи как обычно. Если хотите, создайте заголовок, когда первая буква manufacturer_name изменится.

Для дополнительной скорости:

  • Поместите это в хранимую процедуру.
  • Индекс different_field_table на manufacturer_id.
0 голосов
/ 03 мая 2010

Мне это кажется грязным, но вы можете создать первый буквенный столбец CHAR и вызвать его заполнение. Сохраните первую букву от имени производителя в этом столбце и внесите его в указатель. Затем выберите * из таблицы, где FirstLetter = 'A'.

Или создайте таблицу поиска со строками A - Z и установите внешний ключ в таблице производителя. Опять же, вам, вероятно, понадобится триггер для обновления этой информации. Затем вы можете присоединить таблицу соответствия к таблице производителя.

Тогда вместо размещения 26 наборов данных на странице создайте список ссылок (A-Z), которые выбирают и показывают каждый набор данных по одному за раз.

0 голосов
/ 03 мая 2010

Есть несколько способов сделать это. 1) Создайте представление в вашей базе данных, в котором есть все производители и их ссылки на веб-сайты, а затем продолжите просмотр каждого письма. 2) выберите всех производителей один раз и сохраните их в наборе данных .net, а затем используйте этот набор данных для заполнения ваших ссылок.

0 голосов
/ 03 мая 2010
  • Первая буква в алфавите - отстой (извините) как дискриминатор. Вы не можете разделить их на самом деле (вы можете просто спросить «где имя, например,«% »), но что бы вы ни выбрали, это дает вам в среднем 1/26 или около того разделения имен. Не очень эффективно.

  • Что вы подразумеваете под «созданием ссылки - используя другое поле в базе данных» - для меня это звучит как плохой дизайн.

0 голосов
/ 03 мая 2010

Вернуть все элементы в одном наборе (набор данных и т. Д.), Либо с помощью хранимой процедуры или запроса, включая оставленное поле (col1,1), и отсортировав по этому полю.

выберите left (col1,1) как LetterGroup, col1, url_column из таблицы в порядке слева (col1,1)

Затем просмотрите весь набор результатов, меняя разделы при изменении буквы.

0 голосов
/ 03 мая 2010

получить один набор результатов из одного запроса и разделить его.Существует довольно много лишних усилий, выходящих из базы данных 26 раз для выполнения в основном той же работы!

0 голосов
/ 03 мая 2010

Вероятно, вы могли бы сделать это умнее с помощью хранимой процедуры . Пусть SP вернет все информацию, необходимую вам для одного вызова, и вдруг у вас будет одно взаимодействие с базой данных вместо 26 ...

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