Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Internal dari Tujuh Jenis SQL Server – Bagian 2

Tujuh kelas implementasi pengurutan SQL Server adalah:

  1. CQScanSortNew
  2. CQScanTopSortNew
  3. CQScanIndexSortNew
  4. CQScanPartitionSortNew (hanya SQL Server 2014)
  5. CQScanInMemSortNew
  6. In-Memory OLTP (Hekaton) prosedur yang dikompilasi secara native Top N Sort (hanya SQL Server 2014)
  7. In-Memory OLTP (Hekaton) secara native dikompilasi prosedur General Sort (SQL Server 2014 saja)

Empat jenis pertama dibahas di bagian pertama artikel ini.

5. CQScanInMemSortNew

Kelas sortir ini memiliki sejumlah fitur menarik, beberapa di antaranya unik:

  • Seperti namanya, itu selalu mengurutkan seluruhnya dalam memori; itu tidak akan pernah tumpah ke tempdb
  • Penyortiran selalu dilakukan menggunakan quicksort qsort_s di pustaka run-time C standar MSVCR100
  • Ini dapat melakukan ketiga jenis pengurutan logis:Pengurutan Umum, N Atas, dan Pengurutan Berbeda
  • Ini dapat digunakan untuk sortir lunak per-partisi columnstore berkerumun (lihat bagian 4 di bagian 1)
  • Memori yang digunakannya mungkin di-cache dengan rencana daripada dicadangkan sebelum eksekusi
  • Ini dapat diidentifikasi sebagai pengurutan dalam memori dalam rencana eksekusi
  • Maksimum 500 nilai dapat diurutkan
  • Ini tidak pernah digunakan untuk pembuatan indeks (lihat bagian 3 di bagian 1)

CQScanInMemSortNew adalah kelas semacam yang tidak akan sering Anda temui. Karena selalu mengurutkan dalam memori menggunakan algoritme quicksort perpustakaan standar, ini bukan pilihan yang baik untuk tugas penyortiran basis data umum. Faktanya, kelas sortir ini hanya digunakan ketika semua inputnya adalah konstanta runtime (termasuk referensi @variable). Dari perspektif rencana eksekusi, itu berarti input ke operator Sortir harus Pemindaian Konstan operator, seperti contoh di bawah ini menunjukkan:

-- Regular Sortir pada fungsi skalar sistemSELECT X.i FROM ( SELECT @@TIMETICKS UNION ALL SELECT @@TOTAL_ERRORS UNION ALL SELECT @@TOTAL_READ UNION ALL SELECT @@TOTAL_WRITE) AS X (i)ORDER BY X.i; -- Distinct Sort pada literal konstanDENGAN X (i) AS( SELECT 3 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 2)SELECT DISTINCT X.iFROM XORDER BY X.i; -- Top N Urutkan variabel, konstanta, dan fungsiDECLARE @x integer =1, @y integer =2; PILIH ATAS (1) X.iFROM ( NILAI (@x), (@y), (123), (@@CONNECTIONS)) SEBAGAI X (i)ORDER OLEH X.i;

Rencana pelaksanaannya adalah:

Tumpukan panggilan khas selama penyortiran ditunjukkan di bawah ini. Perhatikan panggilan ke qsort_s di perpustakaan MSVCR100:

Ketiga rencana eksekusi yang ditampilkan di atas adalah jenis dalam memori menggunakan CQScanInMemSortNew dengan input yang cukup kecil untuk memori sortir yang akan di-cache. Informasi ini tidak diekspos secara default dalam rencana eksekusi, tetapi dapat diungkapkan menggunakan flag trace tidak berdokumen 8666. Saat flag tersebut aktif, properti tambahan muncul untuk operator Sort:

Buffer cache dibatasi hingga 62 baris dalam contoh ini seperti yang ditunjukkan di bawah ini:

-- Buffer cache dibatasi hingga 62 barisPILIH X.iFROM( VALUES (001),(002),(003),(004),(005),(006),(007),(008),(009 ),(010), (011),(012),(013),(014),(015),(016),(017),(018),(019),(020), (021), (022),(023),(024),(025),(026),(027),(028),(029),(030), (031),(032),(033),(034 ),(035),(036),(037),(038),(039),(040), (041),(042),(043),(044),(045),(046), (047),(048),(049),(050), (051),(052),(053),(054),(055),(056),(057),(058),(059 ),(060), (061),(062)--, (063)) SEBAGAI X (i)PESAN OLEH X.i;

Batalkan komentar item terakhir dalam skrip itu untuk melihat properti Sort cache buffer berubah dari 1 menjadi 0:

Ketika buffer tidak di-cache, pengurutan dalam memori harus mengalokasikan memori saat diinisialisasi dan sebagaimana diperlukan saat membaca baris dari inputnya. Ketika buffer cache dapat digunakan, pekerjaan alokasi memori ini dihindari.

Skrip berikut dapat digunakan untuk menunjukkan bahwa jumlah maksimum item untuk CQScanInMemSortNew quicksort dalam memori adalah 500:

PILIH X.iFROM( NILAI (001),(002),(003),(004),(005),(006),(007),(008),(009),(010), ( 011,(012),(013),(014),(015),(016),(017),(018),(019),(020), (021),(022),(023) ,(024),(025),(026),(027),(028),(029),(030), (031),(032),(033),(034),(035),( 036),(037),(038),(039),(040), (041),(042),(043),(044),(045),(046),(047),(048) ,(049),(050), (051),(052),(053),(054),(055),(056),(057),(058),(059),(060), ( 061),(062),(063),(064),(065),(066),(067),(068),(069),(070), (071),(072),(073) ,(074),(075),(076),(077),(078),(079),(080), (081),(082),(083),(084),(085),( 086),(087),(088),(089),(090), (091),(092),(093),(094),(095),(096),(097),(098) ,(099),(100), (101),(102),(103),(104),(105),(106),(107),(108),(109),(110), ( 111),(112),(113),(114),(115),(116),(117),(118),(119),(120), (121),(122),(123) ,(124),(125),(126),(127),(128),(129),(130), (131),(132),(133),(134),(135),( 136),(137),(138),(139),(140), (141),(142),(143),(144),(145),(146),(147),(148) ,(149),(150), (151) ,(152),(153),(154),(155),(156),(157),(158),(159),(160), (161),(162),(163),( 164),(165),(166),(167),(168),(169),(170), (171),(172),(173),(174),(175),(176) ,(177),(178),(179),(180), (181),(182),(183),(184),(185),(186),(187),(188),( 189),(190), (191),(192),(193),(194),(195),(196),(197),(198),(199),(200), (201) ,(202),(203),(204),(205),(206),(207),(208),(209),(210), (211),(212),(213),( 214),(215),(216),(217),(218),(219),(220), (221),(222),(223),(224),(225),(226) ,(227),(228),(229),(230),(231),(232),(233),(234),(235),(236),(237),(238),( 239),(240), (241),(242),(243),(244),(245),(246),(247),(248),(249),(250), (251) ,(252),(253),(254),(255),(256),(257),(258),(259),(260), (261),(262),(263),( 264),(265),(266),(267),(268),(269),(270), (271),(272),(273),(274),(275),(276) ,(277),(278),(279),(280), (281),(282),(283),(284),(285),(286),(287),(288),( 289),(290), (291),(292),(293),(294),(295),(296),(297),(298),(299),(300), (301) ,(302),(303),(304),(305),(306),(307),(30 8),(309),(310), (311),(312),(313),(314),(315),(316),(317),(318),(319),(320) , (321),(322),(323),(324),(325),(326),(327),(328),(329),(330), (331),(332),( 333),(334),(335),(336),(337),(338),(339),(340), (341),(342),(343),(344),(345) ,(346),(347),(348),(349),(350), (351),(352),(353),(354),(355),(356),(357),( 358),(359),(360), (361),(362),(363),(364),(365),(366),(367),(368),(369),(370) , (371),(372),(373),(374),(375),(376),(377),(378),(379),(380), (381),(382),( 383),(384),(385),(386),(387),(388),(389),(390), (391),(392),(393),(394),(395) ,(396),(397),(398),(399),(400), (401),(402),(403),(404),(405),(406),(407),( 408),(409),(410), (411),(412),(413),(414),(415),(416),(417),(418),(419),(420) , (421),(422),(423),(424),(425),(426),(427),(428),(429),(430), (431),(432),( 433),(434),(435),(436),(437),(438),(439),(440), (441),(442),(443),(444),(445) ,(446),(447),(448),(449),(450), (451),(452),(453),(454),(455),(456),(457),( 458),(459),(460), (461),(462),(463),(46 4),(465),(466),(467),(468),(469),(470), (471),(472),(473),(474),(475),(476) ,(477),(478),(479),(480), (481),(482),(483),(484),(485),(486),(487),(488),( 489),(490), (491),(492),(493),(494),(495),(496),(497),(498),(499),(500)--, ( 501)) SEBAGAI X (i)PESAN OLEH X.i;

Sekali lagi, batalkan komentar pada item terakhir untuk melihat InMemory Urutkan perubahan properti dari 1 ke 0. Jika ini terjadi, CQScanInMemSortNew diganti dengan CQScanSortNew (lihat bagian 1) atau CQScanTopSortNew (seksi 2). Non-CQScanInMemSortNew sort masih dapat dilakukan di memori, tentu saja, hanya menggunakan algoritma yang berbeda, dan diizinkan untuk tumpah ke tempdb jika perlu.

6. OLTP dalam Memori, prosedur tersimpan yang dikompilasi secara asli, Urutan N Teratas

Implementasi In-Memory OLTP (sebelumnya dengan nama kode Hekaton) yang dikompilasi secara asli prosedur tersimpan menggunakan antrian prioritas diikuti oleh qsort_s untuk Top N Sorts, ketika kondisi berikut terpenuhi:

  • Kueri berisi TOP (N) dengan klausa ORDER BY
  • Nilai N adalah konstanta literal (bukan variabel)
  • N memiliki nilai maksimum 8192; meskipun
  • Keberadaan gabungan atau agregasi dapat mengurangi nilai 8192 seperti yang didokumentasikan di sini

Kode berikut membuat tabel Hekaton yang berisi 4000 baris:

CREATE DATABASE InMemoryOLTP;GO-- Tambahkan filegroup yang dioptimalkan memoriALTER DATABASE InMemoryOLTPADD FILEGROUP InMemoryOLTPFileGroup CONTAINS MEMORY_OPTIMIZED_DATA;GO-- Tambahkan file (sesuaikan jalur jika perlu)ALTER DATABASE InMemoryOLTPADD FILE( NAME' CNC:NAME' FILE \Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\IMOLTP.hkf')TO FILEGROUP InMemoryOLTPFileGroup;GOUSE InMemoryOLTP;GOCREATE TABLE dbo.Test( col1 integer NOT NULL, col2 integer NOT NULL, col3 integer NOT NULL, CONSTRAINT PK_dbo_Test PRIMARY KEY NONCLUSTERED HASH (col1) WITH (BUCKET_COUNT =8192))WITH( MEMORY_OPTIMIZED =ON, DURABILITY =SCHEMA_ONLY);GO-- Tambahkan angka dari 1-4000 menggunakan- Itzik Ben-Gan's number generatorWITH L0 AS (SELECT 1 AS c UNION ALL SELECT 1), L1 AS (PILIH 1 AS c FROM L0 AS A CROSS JOIN L0 AS B), L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B), L3 AS (PILIH 1 AS c DARI L2 SEBAGAI LINTAS GABUNG L2 AS B), L4 AS (PILIH 1 AS c DARI L3 SEBAGAI LINTAS GABUNG L3 AS B), L5 AS (SELECT 1 AS c FROM L4 AS A CROSS GABUNG L4 AS B), Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)INSERT dbo.Test ( col1, col2, col3)SELECT N.n, ABS(CHECKSUM(NEWID())), ABS(CHECKSUM(NEWID()))FROM Nums AS NWHERE N.n ANTARA 1 DAN 4000;

Skrip berikutnya membuat Top N Sort yang sesuai dalam prosedur tersimpan yang dikompilasi secara native:

-- Dikompilasi secara native Top N Urutkan prosedur tersimpanCREATE PROCEDURE dbo.TestPWITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATIONASBEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL =SNAPSHOT, LANGUAGE =N'us_english') SELECT FROM (2) Tbocol2 .TEST AS T ORDER OLEH T.col2END;GOEXECUTE dbo.TestP;

Perkiraan rencana eksekusi adalah:

Tumpukan panggilan yang diambil selama eksekusi menunjukkan penyisipan ke antrian prioritas yang sedang berlangsung:

Setelah pembuatan antrean prioritas selesai, tumpukan panggilan berikutnya menunjukkan lintasan terakhir melalui quicksort pustaka standar:

xtp_p_* pustaka yang ditampilkan dalam tumpukan panggilan tersebut adalah dll yang dikompilasi secara asli untuk prosedur tersimpan, dengan kode sumber disimpan pada contoh SQL Server lokal. Kode sumber dibuat secara otomatis dari definisi prosedur tersimpan. Misalnya, file C untuk prosedur tersimpan asli ini berisi fragmen berikut:

Ini sedekat mungkin dengan akses ke kode sumber SQL Server.

7. OLTP dalam Memori yang dikompilasi secara asli, prosedur tersimpan Sort

Prosedur yang dikompilasi secara native saat ini tidak mendukung Distinct Sort, tetapi pengurutan umum non-distinct didukung, tanpa batasan ukuran set. Untuk mendemonstrasikan, pertama-tama kita akan menambahkan 6.000 baris ke tabel pengujian, sehingga total 10.000 baris:

DENGAN L0 AS (PILIH 1 AS c UNION ALL SELECT 1), L1 AS (PILIH 1 AS c FROM L0 AS A CROSS JOIN L0 AS B), L2 AS (PILIH 1 AS c FROM L1 AS A CROSS JOIN L1 AS B), L3 AS (PILIH 1 AS c DARI L2 SEBAGAI LINTAS GABUNG L2 AS B), L4 AS (PILIH 1 AS c DARI L3 SEBAGAI SALIB GABUNG L3 AS B), L5 AS (PILIH 1 AS c DARI L4 AS A CROSS JOIN L4 AS B), Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)INSERT dbo.Test (col1, col2, col3)SELECT N.n, ABS(CHECKSUM(NEWID()) ), ABS(CHECKSUM(NEWID()))FROM Nums AS NWHERE N.n ANTARA 4001 DAN 10.000;

Sekarang kita dapat menghapus prosedur pengujian sebelumnya (prosedur yang dikompilasi secara native saat ini tidak dapat diubah) dan membuat prosedur baru yang melakukan jenis 10.000 baris biasa (bukan top-n):

Tpre>DROP PROCEDURE dbo.TestP;GOCREATE PROCEDURE dbo.TestPWITH EXECUTE SEBAGAI PEMILIK, SCHEMABINDING, NATIVE_COMPILATIONASBEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL =SNAPSHOT, LANGUAGE =N'us_ENGlish') .col2END;GOEXECUTE dbo.TestP;

Perkiraan rencana eksekusi adalah:

Menelusuri eksekusi semacam ini menunjukkan bahwa itu dimulai dengan menghasilkan beberapa proses kecil yang diurutkan menggunakan quicksort perpustakaan standar lagi:

Setelah proses itu selesai, proses yang diurutkan akan digabungkan, menggunakan skema antrian prioritas:

Sekali lagi, kode sumber C untuk prosedur ini menunjukkan beberapa detail:

Ringkasan Bagian 2

  • CQScanInMemSortNew selalu merupakan quicksort dalam memori. Ini dibatasi hingga 500 baris dari Pemindaian Konstan, dan dapat menyimpan memori sortirnya untuk input kecil. Sortir dapat diidentifikasi sebagai CQScanInMemSortNew urutkan menggunakan properti rencana eksekusi yang diekspos oleh trace flag 8666.
  • Top N Sort terkompilasi asli Hekaton membutuhkan nilai literal konstan untuk N <=8192 dan mengurutkan menggunakan antrian prioritas diikuti dengan quicksort standar
  • Urutan Umum yang dikompilasi asli Hekaton dapat mengurutkan berapa pun jumlah baris, menggunakan quicksort perpustakaan standar untuk menghasilkan proses pengurutan, dan pengurutan gabungan antrian prioritas untuk menggabungkan proses. Itu tidak mendukung Distinct Sort.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 Data vertikal ke Horizontal

  2. Perbarui Langkah Pekerjaan untuk Pekerjaan Agen Server SQL (T-SQL)

  3. Apa tujuan dari tabel sistem master..spt_values ​​dan apa arti dari nilainya?

  4. Cara meringkas bidang waktu di SQL Server

  5. Tabel Pivot SQL Server dengan beberapa agregat kolom