คุณจะพบการนับแถวสำหรับตารางทั้งหมดของคุณใน Postgres ได้อย่างไร


395

ฉันกำลังมองหาวิธีที่จะหาจำนวนแถวสำหรับตารางทั้งหมดของฉันใน Postgres ฉันรู้ว่าฉันสามารถทำสิ่งนี้ทีละตารางด้วย:

SELECT count(*) FROM table_name;

แต่ฉันต้องการเห็นจำนวนแถวสำหรับตารางทั้งหมดแล้วเรียงลำดับตามเพื่อให้ทราบว่าตารางทั้งหมดของฉันมีขนาดใหญ่เพียงใด

คำตอบ:


582

มีสามวิธีที่จะได้รับการนับประเภทนี้แต่ละคนมีการแลกเปลี่ยนของพวกเขาเอง

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

วิธีที่สองตั้งข้อสังเกตว่าตัวรวบรวมสถิติติดตามคร่าวๆว่ามีกี่แถวเป็น "สด" (ไม่ถูกลบหรือล้าสมัยจากการอัพเดตในภายหลัง) ได้ตลอดเวลา ค่านี้สามารถปิดได้เล็กน้อยภายใต้กิจกรรมหนัก แต่โดยทั่วไปแล้วเป็นการประเมินที่ดี:

SELECT schemaname,relname,n_live_tup 
  FROM pg_stat_user_tables 
  ORDER BY n_live_tup DESC;

นอกจากนี้ยังสามารถแสดงจำนวนแถวที่ตายแล้วซึ่งเป็นตัวเลขที่น่าสนใจในการตรวจสอบ

วิธีที่สามคือการบันทึกว่าคำสั่ง ANALYZE ของระบบซึ่งดำเนินการโดยกระบวนการ autovacuum เป็นประจำตั้งแต่ PostgreSQL 8.3 เพื่ออัปเดตสถิติของตาราง คุณสามารถคว้าสิ่งนี้ได้:

SELECT 
  nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' 
ORDER BY reltuples DESC;

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


2
เพื่อประโยชน์ในการทำสำเร็จโปรดเพิ่มสิ่งนี้สำหรับตัวเลือกแรก (ขอบคุณไปที่ @a_horse_with_no_name):with tbl as (SELECT table_schema,table_name FROM information_schema.tables where table_name not like 'pg_%' and table_schema in ('public')) select table_schema, table_name, (xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, table_name), false, true, '')))[1]::text::int as rows_n from tbl ORDER BY 3 DESC;
estani

1
@Greg Smith เวอร์ชั่นไหนที่แนะนำn_live_tup? ฐานข้อมูล Redshift ของฉันไม่มีคอลัมน์นั้น มันเป็นอนุพันธ์ของ Postgres 8.0.2
เลนซามูเอลแมคลีนผู้อาวุโส

1
ข้อความค้นหา 'วิธีที่สอง' (โดยใช้pg_stat_user_tables) ส่งกลับค่าศูนย์ส่วนใหญ่n_live_tupสำหรับฉันเพราะANALYZEไม่เคยทำงาน แทนที่จะทำงานANALYZEบนทุก schema / table และรอคำตอบตลอดไปก่อนอื่นฉันตรวจสอบผลลัพธ์โดยใช้ 'วิธีที่สาม' และหนึ่ง (ใช้pg_class) ส่งกลับจำนวนที่แม่นยำมาก
Brian D

@BrianD มันเป็นไปได้ที่จะดำเนินการวิเคราะห์ในระดับฐานข้อมูลโดยใช้ยูทิลิตี้
analyb เป็น

69

นี่คือวิธีการแก้ปัญหาที่ไม่ต้องการฟังก์ชั่นเพื่อให้ได้จำนวนที่แม่นยำสำหรับแต่ละตาราง:

select table_schema, 
       table_name, 
       (xpath('/row/cnt/text()', xml_count))[1]::text::int as row_count
from (
  select table_name, table_schema, 
         query_to_xml(format('select count(*) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count
  from information_schema.tables
  where table_schema = 'public' --<< change here for the schema you want
) t

query_to_xmlจะเรียกใช้แบบสอบถาม SQL ที่ส่งผ่านและส่งคืน XML พร้อมผลลัพธ์ (จำนวนแถวสำหรับตารางนั้น) ด้านนอกxpath()จะดึงข้อมูลการนับจาก xml นั้นและแปลงเป็นตัวเลข

ตารางที่ได้มานั้นไม่จำเป็นจริงๆ แต่ทำให้xpath()เข้าใจง่ายขึ้นเล็กน้อย - ไม่เช่นนั้นทั้งหมดquery_to_xml()จะต้องถูกส่งผ่านไปยังxpath()ฟังก์ชัน


3
ฉลาดมาก. query_to_jsonb()มันน่าเสียดายที่ไม่มี
klin

@a_horse_with_no_name มันจะให้ปัญหาประสิทธิภาพการทำงานใด ๆ ในตารางที่ยุ่งและมีขนาดใหญ่ในขณะดำเนินการหรือไม่?
ขัดขวาง

@Spike: ปัญหาประสิทธิภาพเทียบกับอะไร คอขวดประสิทธิภาพที่สำคัญกำลังทำงานselect count(*)บนทุกตาราง
a_horse_with_no_name

@a_horse_with_no_name โดยดำเนินการกับฟังก์ชั่น x_path กับบันทึก 100 ล้านรายการ
ขัดขวาง

@Spike: xpath()ฟังก์ชั่นนี้จะใช้กับแถวเดี่ยวเท่านั้น - ผลลัพธ์ของcount(*)
a_horse_with_no_name

24

หากต้องการรับการประมาณดูคำตอบของ Greg Smithคำตอบของเกร็กสมิ

หากต้องการทราบจำนวนที่แน่นอนคำตอบอื่น ๆ จะได้รับการรบกวนด้วยปัญหาบางอย่างซึ่งบางคำอาจร้ายแรง (ดูด้านล่าง) นี่คือเวอร์ชั่นที่หวังว่าจะดีกว่า:

CREATE FUNCTION rowcount_all(schema_name text default 'public')
  RETURNS table(table_name text, cnt bigint) as
$$
declare
 table_name text;
begin
  for table_name in SELECT c.relname FROM pg_class c
    JOIN pg_namespace s ON (c.relnamespace=s.oid)
    WHERE c.relkind = 'r' AND s.nspname=schema_name
  LOOP
    RETURN QUERY EXECUTE format('select cast(%L as text),count(*) from %I.%I',
       table_name, schema_name, table_name);
  END LOOP;
end
$$ language plpgsql;

ใช้ชื่อสกีมาเป็นพารามิเตอร์หรือpublicหากไม่มีการกำหนดพารามิเตอร์

ในการทำงานกับรายการ schema ที่เฉพาะเจาะจงหรือรายการที่มาจากการสืบค้นโดยไม่ต้องแก้ไขฟังก์ชั่นสามารถเรียกใช้จากภายในแบบสอบถามเช่นนี้:

WITH rc(schema_name,tbl) AS (
  select s.n,rowcount_all(s.n) from (values ('schema1'),('schema2')) as s(n)
)
SELECT schema_name,(tbl).* FROM rc;

สิ่งนี้จะสร้างเอาต์พุต 3 คอลัมน์พร้อมกับสคีมาตารางและจำนวนแถว

ต่อไปนี้เป็นปัญหาในคำตอบอื่น ๆ ที่ฟังก์ชั่นนี้หลีกเลี่ยง:

  • ชื่อตารางและสคีมาไม่ควรถูกแทรกลงใน SQL ที่สามารถเรียกทำงานได้โดยไม่ต้องอ้างถึงไม่ว่าจะมีquote_identหรือมีformat()ฟังก์ชันที่ทันสมัยกว่าด้วย%Iสตริงรูปแบบ มิฉะนั้นผู้ประสงค์ร้ายบางคนอาจตั้งชื่อตารางของตนtablename;DROP TABLE other_tableซึ่งใช้ได้อย่างสมบูรณ์เป็นชื่อตาราง

  • แม้ว่าจะไม่มีปัญหาการฉีด SQL และตัวละครตลกชื่อตารางอาจมีอยู่ในตัวแปรที่แตกต่างกันไปตามตัวพิมพ์ใหญ่ - เล็ก ถ้าตารางการตั้งชื่อABCDและอีกคนหนึ่งabcdที่SELECT count(*) FROM...จะต้องใช้ชื่อที่อ้างมิฉะนั้นมันจะข้ามไปABCDและนับabcdเป็นครั้งที่สอง %Iรูปแบบไม่นี้โดยอัตโนมัติ

  • information_schema.tablesแสดงประเภทคอมโพสิตที่กำหนดเองเพิ่มเติมจากตารางแม้ว่า table_type คือ'BASE TABLE'(!) เป็นผลให้เราไม่สามารถพูดซ้ำไม่information_schema.tablesเช่นนั้นเราเสี่ยงselect count(*) from name_of_composite_typeที่จะมีและสิ่งนั้นจะล้มเหลว OTOH pg_class where relkind='r'ควรทำงานได้ดีอยู่เสมอ

  • ประเภทของ COUNT () เป็นไม่ได้bigint intตารางที่มีมากกว่า 2.15 พันล้านแถวอาจมีอยู่ (เรียกใช้การนับ (*) กับพวกเขาเป็นความคิดที่ไม่ดีแม้ว่า)

  • ไม่จำเป็นต้องสร้างชนิดถาวรเพื่อให้ฟังก์ชันส่งคืนชุดผลลัพธ์ที่มีหลายคอลัมน์ RETURNS TABLE(definition...)เป็นทางเลือกที่ดีกว่า


18

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

สิ่งที่ต้องการ:

SELECT relname, n_tup_ins - n_tup_del as rowcount FROM pg_stat_all_tables;

@mlissner: หากช่วงเวลาการตอบกลับอัตโนมัติของคุณยาวเกินไปหรือคุณยังไม่ได้เรียกใช้คู่มือANALYZEบนโต๊ะสถิติอาจหายไป มันเป็นคำถามของการโหลดฐานข้อมูลและวิธีการกำหนดค่าฐานข้อมูล (หากสถิติมีการปรับปรุงบ่อยขึ้นสถิติจะแม่นยำมากขึ้น แต่อาจลดประสิทธิภาพการทำงานของรันไทม์) ในที่สุดวิธีเดียวที่จะได้รับข้อมูลที่ถูกต้องคือการเรียกใช้select count(*) from tableสำหรับตารางทั้งหมด
ig0774

17

คำตอบที่ใช้งานได้จริงสำหรับผู้ที่พยายามประเมิน Heroku ที่พวกเขาต้องการและไม่สามารถรอตัวนับแถวช้าของ heroku เพื่อรีเฟรช:

โดยทั่วไปคุณต้องการที่จะทำงาน\dtในpsqlคัดลอกผลให้แก้ไขข้อความที่คุณชื่นชอบ (มันจะมีลักษณะเช่นนี้

 public | auth_group                     | table | axrsosvelhutvw
 public | auth_group_permissions         | table | axrsosvelhutvw
 public | auth_permission                | table | axrsosvelhutvw
 public | auth_user                      | table | axrsosvelhutvw
 public | auth_user_groups               | table | axrsosvelhutvw
 public | auth_user_user_permissions     | table | axrsosvelhutvw
 public | background_task                | table | axrsosvelhutvw
 public | django_admin_log               | table | axrsosvelhutvw
 public | django_content_type            | table | axrsosvelhutvw
 public | django_migrations              | table | axrsosvelhutvw
 public | django_session                 | table | axrsosvelhutvw
 public | exercises_assignment           | table | axrsosvelhutvw

) จากนั้นเรียกใช้การค้นหา regex และแทนที่เช่นนี้:

^[^|]*\|\s+([^|]*?)\s+\| table \|.*$

ถึง:

select '\1', count(*) from \1 union/g

ซึ่งจะให้สิ่งที่คล้ายกับคุณ:

select 'auth_group', count(*) from auth_group union
select 'auth_group_permissions', count(*) from auth_group_permissions union
select 'auth_permission', count(*) from auth_permission union
select 'auth_user', count(*) from auth_user union
select 'auth_user_groups', count(*) from auth_user_groups union
select 'auth_user_user_permissions', count(*) from auth_user_user_permissions union
select 'background_task', count(*) from background_task union
select 'django_admin_log', count(*) from django_admin_log union
select 'django_content_type', count(*) from django_content_type union
select 'django_migrations', count(*) from django_migrations union
select 'django_session', count(*) from django_session
;

(คุณจะต้องลบส่วนสุดท้ายunionและเพิ่มเครื่องหมายอัฒภาคที่ท้ายด้วยตนเอง)

เรียกใช้ในpsqlและคุณทำเสร็จแล้ว

            ?column?            | count
--------------------------------+-------
 auth_group_permissions         |     0
 auth_user_user_permissions     |     0
 django_session                 |  1306
 django_content_type            |    17
 auth_user_groups               |   162
 django_admin_log               |  9106
 django_migrations              |    19
[..]

ฉันชอบความคิดนี้
GuilPejon

ใน Atom ฉันต้องค้นหาใหม่และแทนที่ด้วยสิ่งนี้: select '$1', count(*) from $1 union/g
เชย

นอกจากนี้โพสต์บอกว่า: "คุณจะต้องลบสหภาพและเพิ่มเครื่องหมายอัฒภาคในตอนท้าย" นี่คือการพิมพ์ผิด คุณต้องลบ/g(Keep union) และเพิ่มเซมิโคลอน ( ;) หนึ่งอันที่ท้ายสุด อย่าลืมที่จะลบล่าสุดunionก่อนที่อัฒภาค
เชย

1
"อย่าลืมลบล่าสุดunionก่อนเครื่องหมายอัฒภาค" คือสิ่งที่ฉันหมายถึง :) เพิ่มคำว่า "สุดท้าย" เพื่อชี้แจง
Aur Saraf

10

ไม่แน่ใจว่าคำตอบในการทุบตีเป็นที่ยอมรับสำหรับคุณหรือไม่ แต่ FWIW ...

PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
            SELECT   table_name
            FROM     information_schema.tables
            WHERE    table_type='BASE TABLE'
            AND      table_schema='public'
            \""
TABLENAMES=$(export PGPASSWORD=test; eval "$PGCOMMAND")

for TABLENAME in $TABLENAMES; do
    PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
                SELECT   '$TABLENAME',
                         count(*) 
                FROM     $TABLENAME
                \""
    eval "$PGCOMMAND"
done

7
สาระสำคัญของมันเพียงแค่เดือดลงไปเหมือนกันselect count(*) from table_name;ใน OP!
Noach Magedman

8

ฉันมักจะไม่พึ่งพาสถิติโดยเฉพาะใน PostgreSQL

SELECT table_name, dsql2('select count(*) from '||table_name) as rownum
FROM information_schema.tables
WHERE table_type='BASE TABLE'
    AND table_schema='livescreen'
ORDER BY 2 DESC;
CREATE OR REPLACE FUNCTION dsql2(i_text text)
  RETURNS int AS
$BODY$
Declare
  v_val int;
BEGIN
  execute i_text into v_val;
  return v_val;
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

นี่เป็นสิ่งที่ดี แต่แบบสอบถามแรกควรมีสคีมาสำหรับค่า rownum ด้วย หากมีชื่อที่ขัดแย้งกันในสกีมาที่แตกต่างกันสิ่งนี้จะไม่ทำงานตามที่คาดไว้ ดังนั้นส่วนของแบบสอบถามนี้ควรมีลักษณะเหมือนdsql2('select count(*) from livescreen.'||table_name)หรือดีกว่าก็สามารถเปลี่ยนเป็นฟังก์ชันของตนเองได้
jakub-olczyk

6

ฉันจำ URL ไม่ได้จากที่รวบรวมไว้ แต่หวังว่าสิ่งนี้จะช่วยคุณได้:

CREATE TYPE table_count AS (table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT 
            c.relname
        FROM
            pg_catalog.pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
        WHERE 
            c.relkind = ''r''
            AND n.nspname = ''public'' 
        ORDER BY 1 
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.relname 
            LOOP 
            END LOOP; 

            r.table_name := t_name.relname; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

การดำเนินการselect count_em_all();ควรให้คุณนับจำนวนแถวของตารางทั้งหมดของคุณ


1
เป็นความคิดที่ดีที่จะพูดชื่อคอลัมน์ (เช่นquote_ident(t_name.relname)) เพื่อให้แน่ใจว่าสนับสนุนชื่อที่ผิดปกติ (ตัวอย่างเช่น "ชื่อคอลัมน์")
gorsky

หากต้องการวางภายหลัง: DROP FUNCTION count_em_all ();
Aalex Gabi

มีข้อผิดพลาด: เลือก count_em_all (); ข้อผิดพลาด: ข้อผิดพลาดทางไวยากรณ์ที่หรือใกล้กับ "กลุ่ม" บรรทัด 1: SELECT COUNT () AS "นับ" จากกลุ่ม ^ QUERY: SELECT COUNT () AS "นับ" จากกลุ่มบริบท: PL / pgSQL ฟังก์ชั่น count_em_all () ดำเนินการคำสั่ง
Aalex Gabi

ที่ดี! ในการเลือกและจัดเรียง - SELECT * FROM count_em_all() as r ORDER BY r.num_rows DESC;
Ken4scholars

6

Simple Two Steps:
(หมายเหตุ: ไม่จำเป็นต้องเปลี่ยนแปลงอะไรเลย - เพียงแค่คัดลอกแปะ)
1. สร้างฟังก์ชั่น

create function 
cnt_rows(schema text, tablename text) returns integer
as
$body$
declare
  result integer;
  query varchar;
begin
  query := 'SELECT count(1) FROM ' || schema || '.' || tablename;
  execute query into result;
  return result;
end;
$body$
language plpgsql;

2. เรียกใช้คิวรีนี้เพื่อรับจำนวนแถวสำหรับตารางทั้งหมด

select sum(cnt_rows) as total_no_of_rows from (select 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE') as subq;

หรือ

รับแถวนับตามตาราง

select
  table_schema,
  table_name, 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE'
order by 3 desc;

5

ฉันสร้างรูปแบบขนาดเล็กเพื่อรวมตารางทั้งหมดรวมถึงตารางที่ไม่ใช่แบบสาธารณะด้วย

CREATE TYPE table_count AS (table_schema TEXT,table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT table_schema,table_name
        FROM information_schema.tables
        where table_schema !=''pg_catalog''
          and table_schema !=''information_schema''
        ORDER BY 1,2
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.table_schema||''.''||t_name.table_name
            LOOP 
            END LOOP; 

            r.table_schema := t_name.table_schema;
            r.table_name := t_name.table_name; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

ใช้select count_em_all();เพื่อโทร

หวังว่าคุณจะพบว่ามีประโยชน์นี้ พอล


ข้อผิดพลาด: "r.table_schema" ไม่ใช่ตัวแปรที่รู้จัก
slashdottir

2

สิ่งนี้ใช้ได้สำหรับฉัน

เลือก schemaname, relname, n_live_tup จาก pg_stat_user_tables เรียงตาม n_live_tup DESC;


1

ฉันเหมือนดาเนียลVéritéของคำตอบ แต่เมื่อคุณไม่สามารถใช้คำสั่ง CREATE คุณสามารถใช้วิธีทุบตีหรือถ้าคุณเป็นผู้ใช้ windows หนึ่ง PowerShell หนึ่ง:

# You don't need this if you have pgpass.conf
$env:PGPASSWORD = "userpass"

# Get table list
$tables = & 'C:\Program Files\PostgreSQL\9.4\bin\psql.exe' -U user -w -d dbname -At -c "select table_name from information_schema.tables where table_type='BASE TABLE' AND table_schema='schema1'"

foreach ($table in $tables) {
    & 'C:\path_to_postresql\bin\psql.exe' -U root -w -d dbname -At -c "select '$table', count(*) from $table"
}

0

ฉันต้องการผลรวมจากทุกตาราง + รายการตารางที่มีจำนวน เล็กน้อยเช่นแผนภูมิประสิทธิภาพที่ใช้เวลาส่วนใหญ่

WITH results AS ( 
  SELECT nspname AS schemaname,relname,reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE 
      nspname NOT IN ('pg_catalog', 'information_schema') AND
      relkind='r'
     GROUP BY schemaname, relname, reltuples
)

SELECT * FROM results
UNION
SELECT 'all' AS schemaname, 'all' AS relname, SUM(reltuples) AS "reltuples" FROM results

ORDER BY reltuples DESC

แน่นอนคุณสามารถใส่LIMITประโยคในผลลัพธ์ในรุ่นนี้ด้วยเพื่อให้คุณได้รับnผู้กระทำผิดที่ใหญ่ที่สุดรวม

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

สิ่งนี้มีพื้นฐานมาจากhttps://stackoverflow.com/a/2611745/1548557ทำงานดังนั้นขอขอบคุณและขอขอบคุณสำหรับการใช้แบบสอบถามภายใน CTE

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