Подготовленные материалы должны быть очень тщательно использованы в предложениях WHERE.
Предположим, что таблица определяется как:
create table t (int o, k varchar(100), v varchar(100))
(например, "O: ID объекта (внешний ключ), к: атрибут ключа, v: атрибут-значение"). .
Кроме того, существует (не уникальный) индекс V
create index ixt on t (v)
Предположим, что эта таблица содержит 200 миллионов строк, вставленные как:
for (i = 0; i < 100*1000*1000; i++) {
insert into t (o,k,v) values (i,'k1','v1');
insert into t (o,k,v) values (i,'k2', Convert(i, varchar));
}
("Таким образом, каждый объект О имеет атрибуты k1 = v1 и k2 = o ")
Тогда вы не должны строить запросы, такие как:
select o,p,v from t as tx, t as ty where tx.o=ty.o and tx.k=? and tx.v=? and ty.k=? and ty.v=?
(«найти объекты, которые имеют две заданные атрибуты»)
Мой опыт работы с ORACLE и MSSQL в том, что эти запросы может понадобиться много минут вернуться. Это верно, даже если ни одна строка не соответствует предложению where. Это зависит от того, как SQL-Server решает сначала искать tx.v или ty.v.
Один shoud помещает значения для столбцов k и v directy в оператор. Я думаю, это связано с тем, что SQL-серверы учитывают значения при вычислении плана выполнения.
Взгляд запрос, как это всегда возвращает после миллисекунд:
select o,p,v from t as tx, t as ty where tx.o=ty.o and tx.k='k1' and tx.v='v1' and ty.k='k2' and ty.v='1234'
("The SQL-Server всегда будет искать первую для V = '1234', а затем для V = 'v1'")
с уважением
Вольфганг
возможно дубликат [PreparedStatements и производительность] (http://stackoverflow.com/questions/687550/preparedstatements-and-performance) – sarnold