Bir SQL sayısı sorgusunu ne hızlandırabilir?


9

Sayım (toplu) SQL sorgusu yaparken, bu 3 veritabanı sisteminde yürütme süresini ne hızlandırabilir? Eminim birçok şey onu hızlandırabilir (biri için donanım), ama ben sadece acemi bir DBA, bu yüzden burada birkaç cevap alacağımdan eminim. Bir SQL Server veritabanına yaklaşık 157 milyon satır taşıdım ve bu sorgu sonsuza kadar sürüyor. Ama kaynak Netezza veritabanımda saniyeler sürüyor.

Örneğin:

Netezza 6:

SELECT COUNT(*) FROM DATABASENAME..MYTABLE

Oracle 11g:

SELECT COUNT(*) FROM MYTABLE

SQL Server 2012:

SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]


1
Bunu yalnızca bir kez mi yoksa tekrar tekrar mı yapmanız gerekiyor?
Jon Seigel

@JonSeigel artımlı yükler yapıyoruz ve sayıların toplandığından emin olmak için her gün veritabanı sistemleri arasındaki kayıtları karşılaştırıyoruz. Tekrar tekrar.
MacGyver

Yanıtlar:


10

Netezza, büyük masa taramalarında mükemmel olacak şekilde tasarlanmış bir cihazdır, bu yüzden bu sistemde bu kadar hızlı sonuçlar elde edersiniz.

SQL Server'ınız için, sys.dm_db_partition_stats DMV'den sorgu yaparak satır sayısını büyük ölçüde hızlandırabilirsiniz.

SELECT s.name AS [Schema], o.name AS [Table], SUM(p.row_count) AS [RowCount]
FROM sys.dm_db_partition_stats p JOIN sys.objects o
ON p.object_id = o.object_id JOIN sys.schemas s
ON o.schema_id = s.schema_id
WHERE p.index_id < 2
AND o.object_id = object_id('MyTable')
GROUP BY o.name, s.name;

Yüksek işlem ortamında bu DMV'nin% 100 doğru olduğu garanti edilmez. Ancak sorunuzdan, taşımanızdan sonra her bir tabloyu doğrulamak için yalnızca satır sayıları yaptığınız anlaşılıyor, bu nedenle bu sorgu sizin için çalışmalıdır.


4
@Phil neden? Tablolar arasında geçiş yapar ve her birinden pahalı bir SELECT COUNT (*) gerçekleştirirseniz - son tabloya ulaştığınızda ilk sonuç ne kadar doğrudur?
Aaron Bertrand

1
Anlaşılır olması için, Phil şunları söylemişti: "% 100 doğru sonuç vermeyen veri sözlüğünü kullanmak kötü bir tavsiye. kes ve yapıştır ... "Feragatnamenin önemli olduğunu kabul ediyorum (ve meta verilerin mantıklı sonuçlar döndürmediği bazı kenar durumlar olduğu iddia ediliyor), genel olarak meta veri görünümlerini kullanmanın kötü tavsiye olduğunu kabul etmiyorum.
Aaron Bertrand

5

COUNT_BIGDizinlenmiş görünüm içinde kullanılan bir SQL Server çözümü . Bu, büyük tablo veya dizin taramalarının ek yükü olmadan ve ikincisi için gerekli depolama alanına gerek kalmadan işlemsel olarak tutarlı bir sayı elde etmenizi sağlar:

CREATE TABLE [dbo].[MyTable](id int);
GO

CREATE VIEW [dbo].[MyTableRowCount]
    WITH SCHEMABINDING
AS

    SELECT
        COUNT_BIG(*) AS TableRowCount
        FROM [dbo].[MyTable];
GO

CREATE UNIQUE CLUSTERED INDEX IX_MyTableRowCount
    ON [dbo].[MyTableRowCount](TableRowCount);
GO

SELECT
    TableRowCount
    FROM [dbo].[MyTableRowCount] WITH(NOEXPAND);

Bu, tek bir başlangıç ​​taraması gerektirir (bundan uzaklaşmak gerekmez) ve artımlı tablo veri manipülasyonlarına biraz ek yük ekler. Çok sayıda veriyle büyük işlemler yapıyorsanız (birçok küçük işlemin aksine), değişikliklerin getirdiği yükün ihmal edilebilir olduğunu düşünüyorum.


@SQLKiwi: 2012 öncesi gelirler nasıl engellenir? SQL Server hatası?
Jon Seigel

@JonSeigel - $ 0,05: Çevrimdışı oluşturulan normal tablodaki normal kümelenmiş dizinler tabloya bir Sch-M kilidi uygular. Bir görünümde, elbette gerekli değildir, ancak bu, dizin oluşturulmuş görünüm için SQL2012 için yapılan özel bir durum oluşturmak üzere Dizin Oluştur işleminde bir değişiklik anlamına gelir. IMHO, elbette.
Fabricio Araujo

3

Oracle'da, bir COUNT (*) değerini yanıtlamak için NOT NULL sütunundaki bir ikili ağaç dizini kullanılabilir. Çoğu durumda TAM TABLO TARAMASI'ndan daha hızlı olacaktır çünkü dizinler genellikle temel tablolarından daha küçüktür.

Bununla birlikte, düzenli bir ikili ağaç endeksi 157 Mrows ile hala büyük olacaktır. Tablonuz aynı anda güncellenmezse (yani yalnızca toplu yükleme işlemi), bunun yerine bir bitmap dizini kullanmak isteyebilirsiniz.

En küçük bitmap dizini şöyle olur:

CREATE BITMAP INDEX ix ON your_table(NULL);

Boş girişler bir bitmap dizini tarafından dikkate alınır. Ortaya çıkan endeks, normal bir ikili ağaç endeksi veya temel tabloyla karşılaştırıldığında küçük olacaktır (milyon satır başına 20-30 8k blok).

Ortaya çıkan plan aşağıdaki işlemleri göstermelidir:

----------------------------------------------
| Id  | Operation                     | Name | 
----------------------------------------------
|   0 | SELECT STATEMENT              |      |
|   1 |  SORT AGGREGATE               |      |
|   2 |   BITMAP CONVERSION COUNT     |      |
|   3 |    BITMAP INDEX FAST FULL SCAN| IX   |
----------------------------------------------

Tablonuz aynı anda güncellenirse, benzersiz bir değere sahip bir bitmap dizini bir çekişme noktası olacaktır ve kullanılmamalıdır.


3

Oracle'da, basit sayım sorgusu genellikle tüm tablo yerine bir dizin taranarak yürütülür. Dizin, bitmap dizini olmalı veya NOT NULL kısıtlaması olan bir sütunda tanımlanmalıdır. Tam tablo taraması gerektiren daha karmaşık sorgular için paralel sorgu kullanabilirsiniz.

Paralel sorguyu etkinleştirmek için (Enterprise Edition gerekir) optimize edici ipucunu kullanabilirsiniz:

select /*+ PARALLEL(mytable, 12) */ count(*) from mytable;

Veya tablodaki tüm sorgular için paralel sorguyu etkinleştirin:

alter table mytable parallel 12;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.