Так что ни один из вышеперечисленных вещей не работал для меня. Кроме этого: отредактируйте httpd.conf,
, найдите строку
Listen 80
и измените на
listen 0.0.0.0:80
, если вы работаете в Windows 8, у него есть, чем заняться с использованием ipv6 вместо ipv4
Вы определенно хотите иметь индексы для attributeID
как в таблице атрибутов
, так и выражений
. Если у вас в настоящее время нет этих индексов, я думаю, вы заметите значительное ускорение.
Способы сделать код более безопасным (и более правильным).
somestring
. Вы можете вывести его напрямую. malloc
. malloc
. printf
с ненадежной строкой формата. Используйте printf ("% s", copy)
или put (copy)
. I Спорим, ваша проблема - огромное количество строк, которые вставляются в эту временную таблицу. Есть ли способ добавить предложение WHERE
перед SELECT
каждой строкой в базе данных?
Некоторые вещи, о которых вам нужно позаботиться, - это индексы, план запроса и статистика.
Поместите индексы в attributeId. Или убедитесь, что существуют индексы, где attributeId является первым столбцом в ключе (SQL Server все еще может использовать индексы, если это не первый столбец, но это не так быстро).
Выделите запрос в Query Analyzer и нажмите ^ L, чтобы посмотреть план. Вы можете увидеть, как таблицы соединяются вместе. Практически всегда использовать индексы лучше, чем не использовать (есть крайние случаи, когда, если таблица достаточно мала, индексы могут замедлить вас - но пока просто имейте в виду, что 99% времени индексы являются хорошо)
Обратите внимание на порядок, в котором таблицы соединяются. SQL Server ведет статистику размеров таблиц и определяет, к какой из них лучше присоединиться в первую очередь. Проведите небольшое исследование внутренних процедур SQL Server для обновления статистики - прошло слишком много времени, поэтому у меня нет этой информации.
Это должно помочь вам начать. На самом деле, можно написать целую главу о том, как база данных может оптимизировать даже такой простой запрос.
Если я правильно понимаю вашу схему, вы утверждаете, что ваши таблицы выглядят примерно так:
Выражения : PK - ExpressionID, AttributeID Атрибуты: PK - AttributeID
Если предположить, что каждый PK является кластеризованным индексом, это по-прежнему означает, что для таблицы выражений требуется сканирование индекса. Возможно, вы захотите создать индекс для таблицы Expressions , например: AttributeID, ExpressionID . Это поможет остановить текущее сканирование индекса.
Еще нужно добавить несколько индексов, например это:
attributes.{attributeId, attributeName, attributeValue}
expressions.{attributeId, expressionID}
Это хакерство! Но полезно, если это последнее средство.
Это создает план запроса, на который можно "полностью ответить" с помощью индексов. Обычно индекс фактически вызывает двойной ввод-вывод в указанном выше запросе: один для попадания в индекс (т. Е. Зондирование таблицы), другой для получения фактической строки, на которую ссылается индекс (для получения имени атрибута и т. Д.).
Это особенно полезно, если «атрибуты» или «выражения» представляют собой широкую таблицу. То есть таблица, из которой дорого извлекать строки.
Наконец, лучший способ ускорить ваш запрос - это добавить предложение WHERE!