Выберите запрос слишком медленно> 5 минут - PullRequest
1 голос
/ 27 марта 2011

У меня есть таблица MyTable с 29 000 строк.

MyTable structure {
  StudentId bigint,
  ....
}

Количество столбцов> 10 столбцов.База данных на хост-сервере.

Из SSMS я выполняю запрос:

SELECT *
  FROM MyTable

Это нормально, что выполнение длится более 5 минут?

Ответы [ 3 ]

2 голосов
/ 27 марта 2011

Прежде всего, получение всех данных из удаленной базы данных никогда не является хорошей идеей. Вы используете важную долю пропускной способности. Надеемся, что используемый вами запрос используется только для целей отладки и никогда не должен попадать в производство.

Вы не упомянули, прошло ли 5 ​​минут, прежде чем вы начали что-то получать, или вы получали данные в течение этих 5 минут с постоянной скоростью.

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

В последнем случае вы постоянно получаете строки, но с низкой скоростью. Пропускная способность и нагрузка на сервер играют большую роль в этом. Чтобы получить приблизительное представление о количестве загружаемых данных, запустите следующую хранимую процедуру:

EXEC sp_spaceused 'YourTableName';

Учтите, что сервер должен загрузить эти данные и что вы должны загрузить данные.

Двоичные и XML-поля (также называемые BLOB-полями) обычно занимают много данных, и вы, возможно, не сможете контролировать объем данных, хранящихся пользователем в этих полях.

Попробуйте проверить размер полей переменной длины (varchar, xml и varbinary), запустив DATALENGTH для вашего столбца:

SELECT DATALENGTH(MyField) FROM MyTable

Вы также можете получить среднее значение:

SELECT AVG(DATALENGTH(MyField)) FROM MyTable

Хорошая идея относительно поля BLOB - извлекать их только тогда, когда вам нужно, а не когда вы загружаете список данных.

Например, предположим, что поле XML хранится в таблице PurchaseOrder. Если вы хотите отобразить список PO для вашего пользователя, вам обычно не нужно извлекать это поле, если только пользователь не открывает PO.

Многие недавние ORM, такие как nHibernate, предлагают ленивую загрузку для столбцов наряду с подкачкой страниц, так что вы можете извлечь небольшое количество строк.

Ayende опубликовал арендную плату о загрузке неограниченного набора результатов две недели назад.

0 голосов
/ 27 марта 2011

Я бы порекомендовал вам рассмотреть рекомендацию OMG Ponies - это может быть связано с пропускной способностью между коробкой и вашей машиной, поэтому

  • попробуйте удалить поле и посмотреть, сколько времени занимает запрос на этом компьютере.
  • Если это занимает почти столько же времени, то проблема заключается либо в структуре базы данных, либо в базовом оборудовании, либо в других факторах (типы данных таблиц, неправильные индексы, общая нагрузка на машину, общие попадания в эту таблицу и т. Д.)
  • если это занимает значительно меньше времени, то проблема наверняка между вашей машиной и коробкой - в идеале это не должно быть большой проблемой, потому что веб-сервер будет ближе к серверу БД, возможно, в той же локальной сети (так должно быть намного быстрее в реальном мире). Кроме того, я уверен, что вы не использовали бы «Select *» в реальном приложении, чтобы выбрать 29000 строк, так что это не должно создавать больших проблем.
0 голосов
/ 27 марта 2011

Вы правы - запрос на выбор не должен занимать так много времени.Это не количество строк.Скорее всего, это тип данных, которые у вас есть в этой таблице / представлении, и, возможно, конфигурация хранилища (медленный диск, конфигурация файловых групп и т. Д.).

Некоторые идеи, которые следует рассмотреть, чтобы решить эту проблему производительности:

  • Укажите столбцы, которые вы хотите получить.Для специальных запросов SELECT * хорошо, но следует признать, что СУБД будет работать немного тяжелее, чтобы определить, какие столбцы находятся в таблице / представлении.
  • , собирая значения в любых столбцах типа данных text, varbinary займет пропорционально больше времени в зависимости от данных в этих полях.
  • рассмотрите индексы (есть ли у вас?) Для таблицы / представления?
  • это база данных Prod, где больше/ другие действия могут попадать в эту таблицу?

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

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