przenoszenie tabel do innej bazy danych sql2008 (w tym indeksów, wyzwalaczy itp.)
<p>muszę przenieść całą grupę (ponad 100) dużych (miliony wierszy) tabel z jednej bazy danych sql2008 do drugiej.</p><p>pierwotnie użyłem kreatora importu/eksportu, ale we wszystkich tabelach docelowych brakowało kluczy głównych i obcych, indeksów, ograniczeń, wyzwalaczy itp. (kolumny tożsamości zostały również przekonwertowane na zwykłe int, ale myślę, że właśnie przegapiłem pole wyboru w polu czarodziej.)</p><p>jak to zrobić?</p><p>gdyby to było tylko kilka tabel, wróciłbym do źródła, wypisałbym definicję tabeli (ze wszystkimi indeksami itp.), a następnie uruchomiłem fragment skryptu służący do tworzenia indeksu w miejscu docelowym. ale przy tak wielu stołach wydaje się to niepraktyczne.</p><p>gdyby nie było tak dużo danych, mógłbym użyć kreatora „utwórz skrypty ...”, aby wyskrybować źródło, w tym dane, ale skrypt o długości 72 metrów nie wydaje się dobrym pomysłem!</p>
<p>zrobiliśmy to za pomocą wielu ręcznych skryptów w połączeniu z kreatorem importu, ale dziś rano znalazłem lepszą odpowiedź, dzięki uprzejmości <a href="http://sqlblog.com/blogs/tibor\_karaszi/archive/2008/06/21/import-export-wizard-and-indexes-keys-etc.aspx">artykuł na blogu tibora karasziego</a> .</p><p>częścią naszej frustracji było to, że <strong> sql 2000 </strong> „kreator importu/eksportu dts” sprawia, że ​​jest to prawie banalnie łatwe, wybierając „kopiuj obiekty i dane”:</p><p><img src="https://i.stack.imgur.com/igvdv.png" alt="dts import wizard"></p><p>ta trzecia opcja zawiera opcję włączenia indeksów/wyzwalaczy itp .:</p><p><img src="https://i.stack.imgur.com/ttgjq.png" alt="advanced options"></p><p>ta opcja została <strong> [~ # ~] usunięta [~ # ~] </strong> z <em> sql 2005/2008</em> kreator importu. dlaczego? brak pomysłu:</p><p><img src="https://i.stack.imgur.com/77kwn.png" alt="2008 import wizard"></p><p>w 2005/2008 najwyraźniej musisz <em> ręcznie</em> utworzyć pakiet ssis w bids i użyć <a href="http://www.sql-server-performance.com/articles/dba/transfer\_sql\_objects\_task\_ssis\_p2.aspx">transfer zadań sql server objects</a> , który zawiera wszystkie te same opcje, które były w kreator 2000:</p><p><img src="https://i.stack.imgur.com/m22zs.png" alt="ssis transfer sql server objects task"></p>
Użyj edycję programu Visual Studio do bazy danych skryptu z bazą danych. Działa jak czar i można użyć dowolnego systemu kontroli źródła, oczywiście najlepiej, jeśli ma wtyczek VS. Narzędzie posiada również szereg innych przydatnych funkcji. Sprawdź je tutaj, w tym wielkim poście


<http://www.vitalygorn.com/blog/post/2008/01/Handling-Database-easily-with-Visual-Studio-2008.aspx>


lub sprawdzić MSDN dla oficjalnej dokumentacji Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. źle zrozumiałem problem, myślałem, że chcesz rozciągnąć w poziomie - mój błąd. 

dane mogą zostać w tabeli, ale dolne menu robiłbym już w nav>ul>li, również nie robiłbym breadcrumbsów u góry w tabeli. 
wracając już do problemu, będziesz miał trochę ciężko to zrobić. wydaje mi się, że najlepiej będz… Z ograniczeniem, że klauzula warunek może być „coś”, to jesteś ograniczony do skanowania całą listę i stosując warunek.


Jeśli istnieją ograniczenia dotyczące klauzuli stan, wtedy można spojrzeć na organizowanie danych do bardziej efektywnie obsługiwać zapytań.


Na przykład, przykładowy kod z „byFirstLetter” słowniku nie pomaga w ogóle z „endswith” zapytania.


Więc tak naprawdę sprowadza się do tego, co pyta chcesz zrobić przed tymi danymi.


W bazach danych, problem ten jest ciężar „optymalizator zapytań”. W typowej bazy danych, jeśli masz bazę danych bez indeksów, oczywiście każde zapytanie będzie skan tabeli. Jak dodać indeksów w tabeli, optymalizator może użyć tych danych do bardziej wyrafinowanych zapytań planuje lepiej dostać się do danych. To w istocie problem, który opisujesz.


Gdy masz bardziej konkretny podzbiór typów kwerend następnie można zrobić lepszą decyzję, co struktura jest najlepsza. Ponadto, należy wziąć pod uwagę ilość danych. Jeśli masz listę 10 elementów każdy mniej niż 100 bajtów, skan wszystko może okazać się najszybciej, co można zrobić, ponieważ masz taką małą ilość danych. Oczywiście, że nie skaluje się do elementów 1M, ale nawet sprytnych technik dostępu nosić koszt w instalacji, konserwacji (jak utrzymanie indeksu) i pamięć.


**EDIT** , na podstawie komentarza


Jeśli jest to auto Nieukończenie, jeśli dane są statyczne, a następnie posortować je i używać przeszukiwanie binarne. Nie jesteś naprawdę dzieje się szybciej niż to.


Jeśli dane są dynamiczne, a następnie zapisać go w zrównoważonym drzewie, i szukać tego. To skutecznie wyszukiwanie binarne, a to pozwala zachować dodać dane losowo.


Coś jeszcze jest jakaś specjalność na tych pojęć. druga pewnie jest dla sprawdzenia poprwanosci odpowiedzi, kucze nie pamietam dokladnie tych komend ale sprobuj skopjowac je z tej gotowej tabelki i ewentualnie cos pozmieniaj- a dokladniej t wspolrzedne pol zeby sie zgadzaly (wstaw tylko w pierwszych ramkach a reszte zlap za jeden rog i przeciagnij to ci sie skopiuje dla innych wynikow) Ok. Znalazłem to w czym problem.


Na początku myślałem, że to problem z DataProvided, ale to nie było. Odkryłem ten sam problem w SQLServer 2000 ....


Wyszukiwanie w google dowiedziałem się czegoś o plan wykonania. Biorąc w ten sposób, że zapytania zwiększyło wydajność 50%.


Krótki życiorys tego problemu jest to, że podczas wykonywania SP kodem, DBMS ma pewne problemy z planu wykonania, a nie korzystać z indeksów ...


Lepszą odpowiedź jest w tym poście:
 [Parametr Wąchania (lub Fałszowanie) w SQL Server](https://stackoverflow.com/questions/211355/parameter-sniffing-or-spoofing-in-sql-server)


Mam nadzieję, że to Ci pomoże. Skopiuj BSTR do CString, czy wszystkie modyfikacje tam i następnie skopiować go z powrotem do BSTR / CComBSTR. Przydziały cstring są szybsze niż SysAllocStringLen. Można użyć `OCIDefineArrayOfStruct`obsługuje pobierania tablic rekordów. Można to zrobić poprzez przepuszczenie podstawę do tablicy `OCIDefineByPos`i używać `OCIDefineArrayOfStruct`powiedzieć Oracle o wielkości zapisów (skip rozmiaru). Wierzę, że wtedy zadzwonić `OCIFetch`informując go sprowadzić rozmiaru tablicy. 


Alternatywą jest ustawiony atrybut oświadczeniem `OCI_ATTR_PREFETCH_ROWS`, zanim zostanie wykonany. Mówi Oracle ile wierszy pobrać na raz, to domyślnie do 1. Stosując to podejście, Oracle sprawia mniej wycieczki okrągłe i buforuje wiersze dla Ciebie.


`OCIBindArrayOfStruct`jest używany z instrukcji DML. To działa w podobny sposób, aby `OCIDefineArrayOfStruct`oprócz tego, że pracuje ze zmiennymi bind.


Można znaleźć przykładowy kod na stronie Oracle. ło panie. dobra. jeśli używasz entity framework, to wybierz wszystko, co jest w danej tabelce do zmiennej (i już masz dane 2 cache). sprawdzasz ile masz tam danych metodą count dostępną dla list. robisz tablicę dynamiczną i wrzucasz tam dane podzielone z listy. zwykły for od 0 do tego, ile zwróciło … Często jest to realizowane za pomocą [„Data Driven Subskrypcje”](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale ta funkcja jest dostępna tylko w niektórych wersjach SQL: Enterprise i Business Intelligence, ale nie w standardzie.


Tak więc istnieje wiele twórczych obejścia. Ale nie lubię żadnego z nich, a wszystko to wymaga uczciwej trochę pracy poza SSRS.


Do obejścia widziałem to: Tworzenie subskrypcji, a następnie wyłączenie lub włączenie zadanie SQL, który wysyła subskrypcję (zidentyfikowanego przez GUID).


Tworzenie .exe .NET otoki do obsługi wysyłania wiadomości e-mail. Można go uruchomić kwerendę najpierw sprawdzić, ile zwracane są wiersze, a następnie w razie potrzeby wygenerować raport i umieścić go w wiadomości e-mail.