Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wykonywanie różnych podejść do danych opartych na czasie

Z jednej strony dobrze, że otworzyłeś nowe pytanie. Ale z drugiej strony, wyodrębniając jedno zapytanie i pytając, czy działa szybciej, tracisz kontekst poprzedniego pytania, nowe pytanie jest zbyt izolowane. Jak na pewno wiesz, administrowanie bazą danych, zarządzanie zasobami (pamięć/pamięć podręczna, dysk, cykle procesora), zarządzanie kodem (dobrym lub słabym), który wykorzystuje te zasoby, są częścią całego obrazu. Wydajność to gra handlowa, nic nie jest darmowe.

  1. Najważniejszym problemem, jaki miałem, była duplikacja kolumny EndDate, którą łatwo wyprowadzić. Zduplikowane kolumny równają się anomaliom aktualizacji. Smirkingman podał klasyczny przykład:niektóre zapytania otrzymają jeden wynik, a inne — drugi. To jest po prostu nie do przyjęcia w przypadku dużych organizacji; lub w bankach (przynajmniej w krajach rozwiniętych), gdzie dane są kontrolowane i chronione. Złamałeś podstawową zasadę normalizacji i musisz zapłacić kary.

    • Aktualizuj anomaile; dwie wersje (już szczegółowe). Audytorzy mogą nie przejść przez system.

    • Rozmiar tabeli
      W każdej dużej tabeli jest to problem, a zwłaszcza w szeregach czasowych lub danych czasowych, gdzie liczba kolumn jest niewielka, a liczba wierszy ogromna. Więc co niektórzy powiedzą, miejsce na dysku jest tanie. Tak, tak jak choroby przenoszone drogą płciową. Liczy się to, do czego jest używany i jak dobrze się nim zajmuje.

      • Miejsce na dysku
        Może być tanie na komputerze PC, ale na serwerze produkcyjnym tak nie jest. Zasadniczo dodałeś 62% do rozmiaru wiersza (13 plus 8 równa się 21), a zatem do rozmiaru tabeli. W banku, do którego jestem obecnie przydzielony, każdy dział, który jest właścicielem danych, jest rozliczany w następujący sposób, tylko pamięć masowa oparta na sieci SAN. Dane dotyczą za GB miesięcznie (nie jest to wysokiej klasy bank australijski):

        1,05 USD za RAID5 Unmirrored
        (wiemy, że jest powolny, ale jest tani, po prostu nie umieszczaj na nim ważnych informacji, ponieważ jeśli się zepsuje, po tym, jak nowy dysk zostanie zamieniony na gorąco lub na zimno, zajmie to kilka dni aby ponownie się zsynchronizować).

        2,10 USD za dublowanie RAID5
        Oznacza to, że w sieci SAN.

        4,40 USD za RAID1+0
        Minimum dla danych produkcyjnych, kopii zapasowych dzienników transakcji i nocnych zrzutów bazy danych.

        9,80 USD za replikację RAID1+0
        do identycznego układu SAN w innej, odpornej na bomby, witrynie. Przerwanie produkcji w kilka minut; prawie zerowa strata transakcji.

      • Pamięć/Cache
        Ok, Oracle tego nie ma, ale poważne bazy danych bankowych mają pamięć podręczną i są zarządzane. Przy określonym rozmiarze pamięci podręcznej tylko 62% wierszy będzie pasować do tego samego rozmiaru pamięci podręcznej.

      • Logiczne i fizyczne wejścia/wyjścia
        Co oznacza 50% więcej wejść/wyjść do odczytu tabeli; zarówno przesyłanie strumieniowe do pamięci podręcznej, jak i odczyty z dysku.

  2. Dlatego to, czy zapytanie działa lepiej, czy gorzej w izolacji, jest kwestią akademicką. W kontekście powyższego tabela jest powolny, a jego wydajność jest o 62% gorsza przez cały czas przy każdym dostępie. I to wpływa na każdego innego użytkownika na serwerze. Większość administratorów baz danych nie będzie się przejmować (z pewnością bym tego nie obchodziła), jeśli formularz podzapytania będzie działał z o połowę mniejszą szybkością, ponieważ ich premia jest powiązana z akceptacją audytu, a nie tylko wydajnością kodu.

    • Poza tym istnieje dodatkowa korzyść polegająca na tym, że nigdy nie trzeba ponownie odwiedzać kodu i naprawiać transakcji z powodu anomalii aktualizacji.

    • A transakcje mają mniej punktów do aktualizacji, więc są mniejsze; mniej blokowania zamków itp.

  3. Zgadzam się, że dyskusja w komentarzach jest trudna. W mojej odpowiedzi wyszczególniłem i wyjaśniłem dwa podzapytania. Zaszło nieporozumienie:mówiłeś o tym podzapytaniu (w klauzuli WHERE, podzapytanie tabeli ) i mówiłem o innym podzapytaniu (na liście kolumn podzapytanie skalarne ), kiedy powiedziałem, że działa tak szybko lub szybciej. Teraz, gdy zostało to wyjaśnione, nie mogę powiedzieć, że pierwsze zapytanie powyżej (podzapytanie w klauzuli WHERE, tabela) wykona tak szybko, jak drugie zapytanie (ze zduplikowaną kolumną); pierwszy musi wykonać 3 skany, podczas gdy drugi wykonuje tylko 2 skany. (Ośmielę się powiedzieć, że drugi będzie skanował tabelę.)

    Chodzi o to, że oprócz kwestii izolacji nie jest to uczciwe porównanie, skomentowałem podzapytania skalarne. Nie sugerowałbym, że zapytanie z trzema skanami jest tak samo szybkie lub szybsze niż zapytanie z dwoma skanami.

    Oświadczenie, które złożyłem na temat podzapytania dotyczącego tabeli 3-skanów (które tutaj cytuję) należy przyjąć w pełnym kontekście (albo tego posta w całości, albo powyższego). Nie wycofuję się z tego.

    Spędziłem pół życia usuwając nielegalne alternatywy, takie jak zduplikowane kolumny, które opierają się na kwestii wydajności, a twórcy śpiewają mantrę, że stół jest powolny, więc "zdenormalizowali wydajność". Wynik, przewidywalny, zanim zacznę, to stół o połowę mniejszy, który działa dwa razy szybciej ogólnie . Najczęstszym pytaniem jest tutaj Times Series (link prowadzi do innego pytania; które prowadzi do innego), ale wyobraź sobie problem w bankowej bazie danych:codziennie OpeningExposure i ClosingExposure na Security na Holding naUnitTrust naPortfolio .

  4. Ale pozwólcie, że odpowiem na pytanie, które nie zostało zadane. Ten rodzaj interakcji jest normalny, nie jest niczym niezwykłym podczas pracy z wewnętrznymi zespołami programistycznymi; pojawia się co najmniej raz w miesiącu. Deweloper na gorąco już napisał i przetestował swój kod, używając tabeli ze zduplikowaną kolumną, leci, a teraz jest zablokowany, ponieważ nie umieszczę go w db.

    Nie, przetestuję to w kontekście całego systemu i:

    • przez połowę czasu tabela jest wprowadzana bez kolumny EndDate, ponieważ nie ma wielkiego problemu z wykonaniem półsekundowego zapytania w ciągu jednej sekundy.

    • W drugiej połowie czasu wydajność [podzapytanie tabeli] jest nie do przyjęcia, więc implementuję wskaźnik logiczny (bitowy), aby zidentyfikować IsCurrent . Jest to znacznie lepsze niż zduplikowana kolumna i zapewnia prędkości 2-skanowania.

    • Za milion lat nie zmusisz mnie do powielania kolumny; dodanie 62% do wielkości stołu; spowalnianie tabeli w pełnym kontekście wielu użytkowników o 62%; i ryzyko niepowodzenia audytu. I nie jestem pracownikiem, nie dostaję premii.

    Teraz warto byłoby przetestować:zapytanie ze zduplikowaną kolumną vs zapytanie z IsCurrent wskaźnik, w pełnym kontekście ogólnego wykorzystania zasobów.

  5. Smirkingman poruszył dobrą sprawę. I jasno to powtórzę, aby się nie rozdrobnił, a następnie jeden lub drugi fragment został zaatakowany. Proszę nie przerywać tego:

    Relacyjna baza danych,
    znormalizowana przez doświadczonego modelarza relacyjnego do prawdziwej piątej formy normalnej

    (bez anomalii aktualizacji; bez zduplikowanych kolumn),
    z pełną zgodnością relacyjną
    (IDEF1X, szczególnie w odniesieniu do minimalizacji Id Klucze podstawowe; a tym samym nie uszkadzać mocy silnika relacyjnego)
    spowoduje powstanie większej liczby mniejszych tabel, mniejszej bazy danych,
    z mniejszą liczbą indeksów,
    wymagających mniejszej liczby złączeń

    (zgadza się, więcej stołów, ale mniej złączeń),
    i będzie działać lepiej niż wszystko, co łamie którąkolwiek z tych zasad
    na tym samym sprzęcie i firmie platforma bazy danych

    (wyklucza oprogramowanie freeware, MS, Oracle; ale niech cię to nie powstrzyma),
    w pełnym kontekście wykorzystania produkcyjnego OLTP
    co najmniej o jeden rząd wielkości
    i będzie znacznie łatwiej używać
    i zmieniać

    (nigdy nie trzeba „refaktoryzacji”).

    Robiłem to co najmniej 80 razy. Dwa rzędy wielkości nie są rzadkością, jeśli robię to sam, zamiast zapewniać ramy dla kogoś innego.

Ani ja, ani ludzie, z którymi pracuję lub którzy mi płacą, nie dbam o to, co zrobi jedno zapytanie w oderwaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dziennik transakcji dla bazy danych 'databasename' jest pełny.

  2. Konwertuj typ danych czasu na format AM PM:

  3. Zwróć listę profili poczty bazy danych w SQL Server (T-SQL)

  4. Jak poniższe dwie instrukcje aktualizacji różnią się w SQL?

  5. Częściowe słowa w dowolnym tekście na serwerze SQL