สิ่งที่สามารถเพิ่มความเร็วคิวรีแบบสอบถาม SQL?


9

เมื่อทำการสอบถาม SQL นับ (รวม) สิ่งที่สามารถเพิ่มความเร็วเวลาการดำเนินการในระบบฐานข้อมูล 3 เหล่านี้? ฉันแน่ใจว่าหลายสิ่งหลายอย่างสามารถเร่งความเร็วได้ (ฮาร์ดแวร์สำหรับหนึ่งชิ้น) แต่ฉันเพิ่งเป็นสามเณร DBA ดังนั้นฉันแน่ใจว่าฉันจะได้รับคำตอบที่นี่ ฉันโยกย้ายประมาณ 157 ล้านแถวไปยังฐานข้อมูล SQL Server และแบบสอบถามนี้ใช้เวลานาน แต่ในฐานข้อมูล Netezza ต้นทางของฉันมันใช้เวลาไม่กี่วินาที

ตัวอย่างเช่น:

เนเตซซ่า 6:

SELECT COUNT(*) FROM DATABASENAME..MYTABLE

Oracle 11g:

SELECT COUNT(*) FROM MYTABLE

SQL Server 2012:

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

อาจดูคำถามนี้: stackoverflow.com/questions/11130448/sql-count-performance

1
คุณต้องการทำสิ่งนี้เพียงครั้งเดียวหรือทำซ้ำ ๆ ?
Jon Seigel

@JonSeigel เรากำลังทำการโหลดที่เพิ่มขึ้นและเรากำลังเปรียบเทียบระเบียนระหว่างระบบฐานข้อมูลในแต่ละวันเพื่อให้แน่ใจว่าจำนวนที่เพิ่มขึ้น ดังนั้นซ้ำแล้วซ้ำอีก
MacGyver

คำตอบ:


10

Netezza เป็นเครื่องมือที่ออกแบบมาเพื่อสแกนตารางขนาดใหญ่ได้อย่างยอดเยี่ยมดังนั้นนั่นเป็นเหตุผลว่าทำไมคุณถึงได้ผลลัพธ์ที่รวดเร็วบนระบบนั้น

สำหรับ SQL Server ของคุณคุณสามารถเพิ่มจำนวนแถวได้อย่างรวดเร็วโดยการสอบถามจาก sys.dm_db_partition_stats DMV

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;

ในสภาพแวดล้อมการทำธุรกรรมสูง DMV นี้ไม่รับประกันว่าจะถูกต้อง 100% แต่จากคำถามของคุณดูเหมือนว่าคุณกำลังทำการนับแถวเพื่อยืนยันแต่ละตารางหลังจากการย้ายข้อมูลดังนั้นแบบสอบถามนี้จึงเหมาะสำหรับคุณ


4
@ ทำไมล่ะ หากคุณวนดูตารางและดำเนินการ SELECT COUNT (*) ที่มีราคาแพงจากแต่ละรายการ - ผลลัพธ์ที่ได้มีความถูกต้องเพียงใดเมื่อคุณมาถึงตารางสุดท้าย
Aaron Bertrand

1
เพื่อความชัดเจนฟิลกล่าวว่า: "การใช้พจนานุกรมข้อมูลซึ่งไม่ได้ผลลัพธ์ที่แม่นยำ 100% เป็นคำแนะนำที่ไม่ดีในความคิดของฉันคำตอบควรได้รับการแก้ไขเพื่อลบคำแนะนำหรือลบออก - จำคน google สำหรับคำตอบดังกล่าว ตัดและวาง ... "ฉันยอมรับว่าข้อจำกัดความรับผิดชอบเป็นสิ่งสำคัญ (และมีบางกรณีที่ขอบซึ่งข้อมูลเมตาไม่ส่งกลับผลลัพธ์ที่สมเหตุสมผล) ฉันไม่เห็นด้วยว่าการใช้มุมมองข้อมูลเมตาโดยทั่วไปเป็นคำแนะนำที่ไม่ดี
Aaron Bertrand

5

นี่คือโซลูชัน SQL Server ที่ใช้COUNT_BIGภายในมุมมองที่จัดทำดัชนี สิ่งนี้จะช่วยให้คุณได้รับการนับจำนวนที่สอดคล้องกับธุรกรรมโดยไม่มีค่าใช้จ่ายในการสแกนตารางขนาดใหญ่หรือดัชนีและไม่จำเป็นต้องมีหน่วยความจำที่ต้องการ

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);

สิ่งนี้จะต้องมีการสแกนครั้งแรกครั้งเดียว (ไม่ต้องออกห่างจากสิ่งนี้) และเพิ่มค่าใช้จ่ายเล็กน้อยเพื่อจัดการกับข้อมูลตารางแบบส่วนเพิ่ม หากคุณกำลังทำการดำเนินการขนาดใหญ่ที่มีข้อมูลจำนวนมาก (เมื่อเทียบกับการดำเนินการขนาดเล็กจำนวนมาก) ฉันคิดว่าค่าใช้จ่ายในการเปลี่ยนแปลงควรน้อยมาก


@SQLKiwi: ทำไมการอ่านถูกบล็อกก่อนปี 2012 ข้อผิดพลาด SQL Server?
Jon Seigel

@JonSeigel - $ 0,05 ของฉัน: ดัชนีคลัสเตอร์ปกติบนตารางปกติที่สร้างออฟไลน์ใช้การล็อค Sch-M บนตาราง แน่นอนว่ามันไม่จำเป็นต้องใช้ในมุมมองแต่นี่หมายถึงการเปลี่ยนแปลงในการสร้างดัชนีเพื่อสร้างกรณีพิเศษสำหรับมุมมองที่จัดทำดัชนีซึ่งทำขึ้นสำหรับ SQL2012 แน่นอน IMHO
Fabricio Araujo

3

ใน Oracle สามารถใช้ดัชนีต้นไม้แบบไบนารีในคอลัมน์ NOT NULL เพื่อตอบ COUNT (*) ในกรณีส่วนใหญ่จะเร็วกว่าการสแกนแบบเต็มตารางเนื่องจากดัชนีมักจะเล็กกว่าตารางพื้นฐาน

อย่างไรก็ตามดัชนีต้นไม้ไบนารีปกติจะยังคงมีขนาดใหญ่ด้วย 157 Mrows หากตารางของคุณไม่ได้รับการอัปเดตพร้อมกัน (เช่นเฉพาะกระบวนการโหลดเป็นชุด) คุณอาจต้องการใช้ดัชนีบิตแมปแทน

ดัชนีบิตแมปขนาดเล็กที่สุดจะเป็นดังนี้:

CREATE BITMAP INDEX ix ON your_table(NULL);

รายการ Null ถูกนำเข้าบัญชีโดยดัชนีบิตแมป ดัชนีผลลัพธ์จะมีขนาดเล็ก (20-30 8k บล็อกต่อล้านแถว) เมื่อเทียบกับดัชนีต้นไม้ไบนารีปกติหรือตารางฐาน

แผนผลลัพธ์ควรแสดงการดำเนินการต่อไปนี้:

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

หากตารางของคุณอัปเดตพร้อมกันดัชนีบิตแมปที่มีค่าไม่ซ้ำกันจะเป็นประเด็นของการโต้แย้งและไม่ควรใช้


3

ใน Oracle แบบสอบถามแบบนับอย่างง่ายมักถูกเรียกใช้งานโดยการสแกนดัชนีแทนที่จะเป็นทั้งตาราง ดัชนีจะต้องเป็นดัชนีบิตแมปหรือกำหนดไว้ในคอลัมน์ที่มีข้อ จำกัด ไม่เป็นโมฆะ สำหรับการสืบค้นที่ซับซ้อนมากขึ้นซึ่งต้องการการสแกนแบบเต็มตารางคุณสามารถใช้การสืบค้นแบบขนาน

ในการเปิดใช้งานการสืบค้นแบบขนาน (จำเป็นต้องมี Enterprise Edition) คุณสามารถใช้คำแนะนำของเครื่องมือเพิ่มประสิทธิภาพ:

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

หรือเปิดใช้งานแบบสอบถามแบบขนานสำหรับแบบสอบถามทั้งหมดในตาราง:

alter table mytable parallel 12;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.