Добавьте единственный индекс со столбцами k1-k6 в нем; это должно быть лучшим.
кроме того, если можно выполнить sp_updatestats перед каждым запросом.
Если используемые вами структуры - это просто данные, а наследование не используется, я думаю, это всегда должно работать.
Пока они являются POD, все должно быть в порядке. http://en.wikipedia.org/wiki/Plain_old_data_structures
Согласно стандарту (1.8.5)
«Если это не битовое поле (9.6), наиболее производный объект должен иметь ненулевого размера и должен занимать один или несколько байтов место хранения. Подобъекты базового класса могут иметь нулевой размер. Объект POD5) тип (3.9) должен занимать смежные байты хранилище. "
Если они занимают смежные байты хранилища и являются одной и той же структурой с другим именем, приведение должно быть успешным
Если две структуры POD начинаются с одной и той же последовательности элементов, стандарт гарантирует, что вы сможете получить к ним доступ свободно через союз. Вы можете сохранить A :: Point3D в объединении, а затем читать из члена B :: Point3D, пока вы касаетесь только тех членов, которые являются частью начальной общей последовательности. (так что если одна структура содержит int, int, int, float, а другая содержит int, int, int, int, вам будет разрешен доступ только к трем первым int).
Так что это похоже на один гарантированный способ в котором должен работать ваш код. Это также означает, что приведение должно работать, но я не уверен, что это явно указано в стандарте.
Конечно, все это предполагает, что обе структуры скомпилированы одним и тем же компилятором, чтобы гарантировать идентичный ABI .
Я точно знаю, что это не сработает:
могут быть еще какими-то ...
Следующее довольно безопасно:
namespace A {
struct Point3D {
float x,y,z;
};
}
namespace B {
typedef A::Point3D Point3D;
}
int main() {
A::Point3D a;
B::Point3D* b = &a;
return 0;
}
Эта строка должна быть:
B::Point3D* pb = (B::Point3D*)&pa;
Обратите внимание на и
. Я думаю, что вы делаете reinterpret_cast
между двумя указателями. Фактически вы можете переинтерпретировать_приведение любого типа указателя к другому, независимо от типа двух указателей. Но это небезопасно и не переносимо.
Например,
int x = 5;
double* y = reinterpret_cast<double*>(&x);
Вы просто используете C-стиль, поэтому вторая строка фактически равна:
double* z = (double*)&x;
Я просто ненавижу C-Style при кастинге, потому что вы не могу определить цель гипса с одного взгляда :)
При каких обстоятельствах это гарантированно работает?
Это не реальное преобразование между типами. Например,
int i = 5;
float* f = reinterpret_cast<float*>(&i);
Now f
указывает на то же место, на которое указывает i
. Итак, преобразование не производится. При разыменовании f
вы получите значение с плавающей запятой с тем же двоичным представлением целого числа i
. На моей машине это четыре байта.