Вот альтернативный подход к вокруг' части. Не наиболее блестяще кодированное решение, но это сделало задание, и этот тип синтаксиса немного легче помнить (плюс, работал бы на значения выравнивания, которые не являются питанием 2). Эти uintptr_t
бросок был необходим для успокоения компилятора; адресная арифметика с указателями не очень любит разделение или умножение.
void *mem = malloc(1024 + 15);
void *ptr = (void*) ((uintptr_t) mem + 15) / 16 * 16;
memset_16aligned(ptr, 0, 1024);
free(mem);
Мой вопрос для связанного сервера: есть большая проблема с производительностью? Если да, что является ключевым узким местом в производительности и передовой практике мы должны следовать?
По сравнению с чем? Для каких запросов? конечно все зависит от того, что вы делаете. Для некоторых запросов снижение производительности будет незначительным, для других - значительным.
Есть несколько проблем, о которых вы должны помнить:
В прошлом я встречал ситуации, когда локально перемещать удаленные данные и индексировать их раньше было на несколько порядков быстрее. присоединяясь к нему.
Вам нужно немного потрудиться, чтобы дважды передать результаты по сети (связанный сервер с SQL Server на вашу машину). Во-вторых, он должен разрешить имя и войти в систему, что не так уж важно, но, тем не менее, это удачно.
В любом случае, я обнаружил, что единственное серьезное узкое место - это перескакивание серверов, поскольку он должен передавать информация дважды.
Это зависит от того, что вы делаете.
Если вы выполняете запросы, которые объединяют таблицы в двух экземплярах сервера и передают большие объемы данных, то у вас есть узкое место, которое вы необходимо знать.
Если серверы находятся в собственной подсети со ссылкой на 1 ГБ, вам не следует сильно беспокоиться. Я был бы обеспокоен, если два сервера соединены общим медленным каналом.
I use linked servers frequently to synchronise data between environments, mainly because I found it to be the easiest solution to code and manage.
One tip I found, but may not be an option for others, was to run any procedures on the server that has the most data or is doing the most updating/inserting. For example I have a procedure that compares two tables and inserts/updates from A to B. If I ran this on server A it would take many times longer than running the procedure on B. If you don't have a choice where to run our code, and you are stuck on, say, server A, then this advice may not help.
Another tip is to reduce the data returned to the minimum necessary. Whereas you might normally have data returned almost instantly on a local server, if a linked server is some distance away then the latency can be very painful. Be stricter than normal in accessing only those columns you need.
Я обнаружил, что если вы выполняете внешние соединения (влево / вправо), производительность быстро падает. Иногда быстрее выбрать данные с удаленного сервера во временную таблицу и проиндексировать их, чем присоединяться по сети. В большинстве случаев лучшая стратегия - написать запрос так, как он имеет смысл, а затем настраивать его только в том случае, если производительность является реальной проблемой.