działanie indeksów w postgresql
<p>mam kilka pytań dotyczących działania indeksów w postgresql. mam tabelę <code>friends</code> z następującym indeksem:</p><pre><code> friends ( user\_id1 ,user\_id2) </code></pre><p><code>user\_id1</code> i <code>user\_id2</code> to klucze obce do tabeli <code>user</code></p><ol> <li> <p>czy to są równoważne? jeśli nie to dlaczego?</p> <pre><code>index(user\_id1,user\_id2) and index(user\_id2,user\_id1) </code></pre></li> <li> <p>jeśli utworzę klucz podstawowy (identyfikator\_użytkownika1, identyfikator\_użytkownika2), czy automatycznie utworzę dla niego indeksy i</p> <p>jeśli indeksy w pierwszym pytaniu nie są równoważne, to który indeks jest tworzony na podstawie polecenia klucza podstawowego?</p> </li> </ol>
<p>oto wyniki zapytania tabeli w <strong>druga kolumna indeksu wielokolumnowego</strong>.<br> efekty są łatwe do odtworzenia dla każdego. po prostu spróbuj w domu.</p><p>testowałem z postgresql <strong>9.0.5</strong> na debianie, używając średniej wielkości tabeli bazy danych z 23322 wierszami. implementuje relację n: m między tabelami <code>adr</code> (adres) i <code>att</code> (atrybut), ale tutaj nie ma to znaczenia. uproszczony schemat:</p><pre><code>create table adratt ( adratt\_id serial primary key , adr\_id integer not null , att\_id integer not null , log\_up timestamp(0) not null default (now())::timestamp(0) , constraint adratt\_uni unique (adr\_id, att\_id) ); </code></pre><p>ograniczenie <code>unique</code> skutecznie implementuje unikalny indeks. dla pewności powtórzyłem test z prostym indeksem i uzyskałem identyczne wyniki, jak oczekiwano.</p><pre><code>create index adratt\_idx on adratt(adr\_id, att\_id) </code></pre><p>tabela jest skupiona w <code>adratt\_uni</code> indeks i przed testem uruchomiłem:</p><pre><code>cluster adratt; analyze adratt; </code></pre><p>skanowanie sekwencyjne w poszukiwaniu zapytań na <code>(adr\_id, att\_id)</code> są tak szybkie, jak to tylko możliwe. indeks wielokolumnowy będzie nadal używany jako warunek zapytania w samej drugiej kolumnie indeksu.</p><p>uruchomiłem zapytania kilka razy, aby zapełnić pamięć podręczną i wybrałem najlepszy z dziesięciu przebiegów, aby uzyskać porównywalne wyniki.</p><h2>1. zapytanie za pomocą obu kolumn</h2><pre><code>select * from adratt where att\_id = 90 and adr\_id = 10; adratt\_id | adr\_id | att\_id | log\_up +++ 123 | 10 | 90 | 2008-07-29 09:35:54 (1 row) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..3.48 rows=1 width=20) (actual time=0.022..0.025 rows=1 loops=1) index cond: ((adr\_id = 10) and (att\_id = 90)) total runtime: 0.067 ms </code></pre></blockquote><h2>2. zapytanie za pomocą pierwszej kolumny</h2><pre><code>select * from adratt where adr\_id = 10 adratt\_id | adr\_id | att\_id | log\_up +++ 126 | 10 | 10 | 2008-07-29 09:35:54 125 | 10 | 13 | 2008-07-29 09:35:54 4711 | 10 | 21 | 2008-07-29 09:35:54 29322 | 10 | 22 | 2011-06-06 15:50:38 29321 | 10 | 30 | 2011-06-06 15:47:17 124 | 10 | 62 | 2008-07-29 09:35:54 21913 | 10 | 78 | 2008-07-29 09:35:54 123 | 10 | 90 | 2008-07-29 09:35:54 28352 | 10 | 106 | 2010-11-22 12:37:50 (9 rows) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..8.23 rows=9 width=20) (actual time=0.007..0.023 rows=9 loops=1) index cond: (adr\_id = 10) total runtime: 0.058 ms </code></pre></blockquote><h2>3. zapytanie za pomocą drugiej kolumny</h2><pre><code>select * from adratt where att\_id = 90 adratt\_id | adr\_id | att\_id | log\_up +++ 123 | 10 | 90 | 2008-07-29 09:35:54 180 | 39 | 90 | 2008-08-29 15:46:07 ... (83 rows) </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>index scan using adratt\_uni on adratt (cost=0.00..818.51 rows=83 width=20) (actual time=0.014..0.694 rows=83 loops=1) index cond: (att\_id = 90) total runtime: 0.849 ms </code></pre></blockquote><h2>4. wyłącz indeksowanie i skanowanie bitmaps</h2><pre><code>set enable\_indexscan = off; select * from adratt where att\_id = 90 </code></pre><p>wynik analizy explain analyze:</p><blockquote> <pre><code>bitmap heap scan on adratt (cost=779.94..854.74 rows=83 width=20) (actual time=0.558..0.743 rows=83 loops=1) recheck cond: (att\_id = 90) -&gt; bitmap index scan on adratt\_uni (cost=0.00..779.86 rows=83 width=0) (actual time=0.544..0.544 rows=83 loops=1) index cond: (att\_id = 90) total runtime: 0.894 ms </code></pre></blockquote><pre><code>set enable\_bitmapscan = off select * from adratt where att\_id = 90 </code></pre><p>wyjście <code>explain analyze</code>:</p><blockquote> <pre><code>seq scan on adratt (cost=0.00..1323.10 rows=83 width=20) (actual time=0.009..2.429 rows=83 loops=1) filter: (att\_id = 90) total runtime: 2.680 ms </code></pre></blockquote><h2>wniosek</h2><p>zgodnie z oczekiwaniami indeks wielokolumnowy służy do zapytania tylko w drugiej kolumnie.<br> zgodnie z oczekiwaniami jest mniej skuteczny, ale zapytanie jest nadal <strong>x szybsze</strong> niż bez indeksu.<br> po wyłączeniu skanowania indeksów planista zapytań wybiera skanowanie sterty map bitowych, które wykonuje prawie tak samo szybko. dopiero po wyłączeniu tego wraca do skanowania sekwencyjnego.</p>
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. Pierwszą rzeczą, myślę o tym, kiedy czytam to pytanie brzmi: *jakiego rodzaju rzeczy wykorzystywać wykresy / drzew?* i wtedy myślę wstecz, jak mogę z nich korzystać.


Na przykład, weźmy dwa wspólne zastosowań drzewa:


* DOM
* systemy plików


DOM, XML dla tej sprawy, przypominają struktury drzewa.   

![tekst alternatywny](https://i.stack.imgur.com/bk5RY.gif)


To ma sens, też. **Ma to sens, ponieważ, jak wymaga tego dane do uzgodnienia** . System plików, too. W systemie UNIX istnieje węzeł główny, a rozgałęzienia w dół poniżej. Podczas montażu nowego urządzenia, jesteś dołączenie go do drzewa.


Należy również być zadając sobie pytanie: czy dane należą do tego typu konstrukcji? Tworzenie struktur danych, które mają sens problemu, a reszta przyjdzie sama.


O ile łatwiej jest, myślę, że to jest to względne. Czy jesteś dobry z funkcji rekurencyjnych przemierzać drzewo / wykres? Co zrobić, jeśli trzeba zrównoważyć drzewo?


Pomyśl o program, który rozwiązuje zagadkę wyszukiwarki słowo. Można nakreślić wszystkie litery szukanej słowo na wykresie i sprawdzić okolicznych węzłów aby sprawdzić, czy ciąg jest dopasowanie którekolwiek ze słów. Ale nie można po prostu zrobić to samo z jednym z tablicy? Wszystko, co naprawdę trzeba zrobić, to przenieść wskaźnik do sprawdzenia listy po lewej i prawej stronie, a przez szerokość, by sprawdzić powyżej i poniżej liter. Rozwiązanie tego problemu z wykresu nie jest trudne, ale może stworzyć wiele dodatkowej pracy i trudności, jeśli nie jesteś dobrze z ich użyciem - oczywiście, że nie powinna zniechęcać od robią to, zwłaszcza jeśli są nauki o im.


Mam nadzieję, że pomaga myśleć o tych struktur. Jeśli chodzi o zalecenie książki, będę musiał iść z **[Wprowadzenie do algorytmów](http://rads.stackoverflow.com/amzn/click/0262032937)** . Replikacja [works by reading the transaction log](https://technet.microsoft.com/en-us/library/ms151706%28v=sql.105%29.aspx) .

Ten rodzaj „aktualizacji bez aktualizacji” często nie generuje żadnych rekordów dziennika transakcji.

Więcej informacji na ten temat można znaleźć w artykule Paula White'a [The Impact of Non-Updating Updates](http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx) . 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. Po pierwsze: Tak, to jest coś, co należy do Wniosku o dokładnie określonym reson: Co się dzieje po nowe profile użytkowników są tworzone? Oczywiście, jeśli używasz domeny jest możliwe, aby mieć jakiś materiał umieścić w rejestrze stworzenia, ale to naprawdę nie jest przypadek użycia. Wniosek powinien sprawdzić, czy istnieją seetings i jeśli nie korzystać z ustawień domyślnych.


Mając na uwadze powyższe, możliwe jest, aby zmienić Inni użytkownicy Keys przez HKEY\_USERS ula.


Nie mam doświadczenia z Visual Studio 2003 projektu instalacji, więc tutaj jest trochę (całkowicie niezwiązanego) kod VBScript, że może po prostu dać ci pomysł, gdzie szukać:



```
const HKEY_USERS = &H80000003
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = ""
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys
strKeyPath = "\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing"
For Each subkey In arrSubKeys
    objReg.SetDWORDValue HKEY_USERS, subkey & strKeyPath, "State", 146944
Next

```

(Kod uprzejmości [Jeroen Ritmeijer](http://jritmeijer.spaces.live.com/blog/cns!8A48A27460FB898A!965.entry) ) <p>nie</p>

<p>mozesz sprawdzić czy w ogóle działa. mozesz porównać paramterty z kilku sąsiednich paneli pracujących w jednym ringu, ale to nadal nie da ci odpowiedzi, czy na pewno jest w pełni sprawny.&nbsp;<br />
&nbsp;</p> 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) wszystko zależy od preferencji.

inne publiczne serwery dns niż od isp często dodają coś od siebie - np. ochronę anty-phishingową lub podobne.

możliwe, że są też wydajniejsze od domyślnych.

funkcja dns relay umożliwia wykorzystanie routera jako serwer dns, który pobiera wyniki translacji z wybrane… działalność botów. dodają użytkowników na czarną listę, a ci niczego nie świadomi wchodzą na ich konta... a oni- boty- te konta przechwytuja, hackują i minusują pytania z tychże kont... najlepiej ignorować czarną listę i zmienić hasło... 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ęć.