คำถามติดแท็ก postgresql

PostgreSQL ทุกรุ่น เพิ่มแท็กเฉพาะรุ่นเพิ่มเติมเช่น postgresql-11 หากบริบทนั้นสำคัญ

1
จำกัด อินพุตให้กับสตริงที่ต่างกันเล็กน้อย
สวัสดีฉันไม่สามารถรับข้อ จำกัด ในการทำงานตามที่ฉันคาดหวังใน postgreSQL จากภายใน pgadmin ฉันรันเคียวรี SQL ต่อไปนี้ -- Check: "TypeCheck" -- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck"; ALTER TABLE "ComLog" ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes'); COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes'; เมื่อดำเนินการนี้จะถูกแปลงเป็น -- Check: "TypeCheck" -- ALTER TABLE "ComLog" DROP CONSTRAINT …

2
ฟังก์ชันเดียวกันใน SELECT และ WHERE clause
คำถามเริ่มต้น: ฉันมีฟังก์ชั่นราคาแพงf(x, y)สองคอลัมน์ x และ y ในตารางฐานข้อมูลของฉัน ฉันต้องการที่จะดำเนินการค้นหาที่ให้ผลลัพธ์ของฟังก์ชั่นเป็นคอลัมน์และทำให้ข้อ จำกัด ในสิ่งที่ชอบ SELECT *, f(x, y) AS func FROM table_name WHERE func < 10; อย่างไรก็ตามสิ่งนี้ไม่ได้ผลดังนั้นฉันจะต้องเขียนบางอย่างเช่น SELECT *, f(x, y) AS func FROM table_name WHERE f(x, y) < 10; สิ่งนี้จะเรียกใช้ฟังก์ชั่นราคาแพงสองครั้งหรือไม่ วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

1
ข้อ จำกัด ของพาร์ติชันที่ไม่ได้ใช้สำหรับการรวมที่เกี่ยวข้องกับตารางที่แบ่งพาร์ติชันโดยการประทับเวลา
ฉันมีโครงสร้างตารางที่แบ่งพาร์ติชันเช่น: CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

1
SQL Spec ต้องการ GROUP BY ใน EXISTS () หรือไม่
Microsoft อนุญาตให้ใช้ไวยากรณ์นี้ในขณะนี้ SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ขอให้สังเกตว่าไม่มีGROUP BYในEXISTSข้อเป็น ANSI SQL ที่ถูกต้อง หรือเป็นเพียงการเปิดเผยรายละเอียดการปฏิบัติ สำหรับการอ้างอิงไวยากรณ์เดียวกันนี้ไม่ได้รับอนุญาตใน PostgreSQL ข้อผิดพลาด: คอลัมน์ "tx" จะต้องปรากฏในกลุ่มตามข้อหรือจะใช้ในฟังก์ชั่นรวม แต่ไวยากรณ์นี้ได้รับอนุญาต .. SELECT * FROM ( …

10
วิธีสร้างซีรีย์ 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... ใน SQL มาตรฐานหรือ T-SQL
ด้วยตัวเลขสองตัวnและmฉันต้องการสร้างชุดของแบบฟอร์ม 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 และทำซ้ำmครั้ง ตัวอย่างเช่นสำหรับn = 3และm = 4ฉันต้องการลำดับหมายเลข 24 ต่อไปนี้: 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- ฉันรู้วิธีการบรรลุผลลัพธ์นี้ใน PostgreSQL โดยวิธีใดวิธีหนึ่งจากสองวิธี: …

2
PostgreSQL: ส่งผ่านตารางเป็นอาร์กิวเมนต์ในฟังก์ชัน
ฉันกำลังค้นพบTYPEใน PostgreSQL ฉันมีTABLE TYPEตารางที่ต้องเคารพ (อินเตอร์เฟส) ตัวอย่างเช่น: CREATE TYPE dataset AS( ChannelId INTEGER ,GranulityIdIn INTEGER ,GranulityId INTEGER ,TimeValue TIMESTAMP ,FloatValue FLOAT ,Status BIGINT ,QualityCodeId INTEGER ,DataArray FLOAT[] ,DataCount BIGINT ,Performance FLOAT ,StepCount INTEGER ,TableRegClass regclass ,Tags TEXT[] ,WeightedMean FLOAT ,MeanData FLOAT ,StdData FLOAT ,MinData FLOAT ,MaxData FLOAT ,MedianData FLOAT ,Percentiles FLOAT[] …

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

1
ผลลัพธ์ที่น่าแปลกใจสำหรับประเภทข้อมูลที่มีตัวแก้ไขประเภท
ในขณะที่พูดคุยโซลูชัน CTE แบบเรียกซ้ำสำหรับคำถามนี้: รับ 5 ค่าที่แตกต่างล่าสุดสำหรับแต่ละ ID @ypercubeพบข้อผิดพลาดที่น่าแปลกใจซึ่งทำให้เราตรวจสอบการจัดการกับตัวดัดแปลงประเภท เราพบพฤติกรรมที่น่าประหลาดใจ 1. Type cast ยังคงประเภทโมดิฟายเออร์ในบางบริบท แม้เมื่อสั่งไม่ให้ ตัวอย่างพื้นฐานที่สุด: SELECT 'vc8'::varchar(8)::varchar หนึ่งอาจคาดหวังvarchar(ไม่มีตัวดัดแปลง) อย่างน้อยฉันจะ แต่ผลลัพธ์คือvarchar(8)(พร้อมตัวดัดแปลง) กรณีที่เกี่ยวข้องจำนวนมากในซอด้านล่าง 2. การต่อข้อมูล Array สูญเสียโมดิฟายเออร์ในบริบทบางอย่าง โดยไม่จำเป็นต้องใช้ดังนั้นข้อผิดพลาดนี้อยู่ฝั่งตรงข้าม: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) นิพจน์แรกให้ผลvarchar(8)[]ตามที่คาดไว้ แต่ข้อที่ 2 หลังจากการต่อข้อมูลอื่นvarchar(8)จะถูกรดน้ำลงไปเพียงvarchar[](ไม่มีตัวปรับแต่ง) พฤติกรรมที่คล้ายกันจากarray_append()ตัวอย่างในซอด้านล่าง ทั้งหมดนี้ไม่สำคัญในบริบทส่วนใหญ่ Postgres จะไม่สูญเสียข้อมูลและเมื่อกำหนดให้กับคอลัมน์ค่าจะถูกบังคับให้เป็นประเภทที่ถูกต้องอย่างไรก็ตาม อย่างไรก็ตามการทำผิดในทิศทางตรงกันข้ามจะทำให้เกิดข้อยกเว้นที่น่าประหลาดใจ: 3. Recursive CTE ต้องการประเภทข้อมูลให้ตรงกัน รับตารางง่ายนี้ CREATE TABLE a ( …


1
ล็อคใน Postgres สำหรับชุด UPDATE / INSERT
ฉันมีสองตาราง หนึ่งคือตารางบันทึก; อีกอันประกอบด้วยรหัสคูปองที่สามารถใช้ได้ครั้งเดียวเท่านั้น ผู้ใช้ต้องสามารถแลกคูปองซึ่งจะแทรกแถวลงในตารางบันทึกและทำเครื่องหมายคูปองที่ใช้ (โดยอัปเดตusedคอลัมน์เป็นtrue) โดยธรรมชาติมีปัญหาสภาพการแข่งขัน / ความปลอดภัยที่เห็นได้ชัดที่นี่ ฉันเคยทำสิ่งที่คล้ายกันในอดีตในโลกของ mySQL ในโลกนั้นฉันจะล็อกทั้งสองตารางทั่วโลกทำตรรกะให้ปลอดภัยด้วยความรู้ที่ว่าสิ่งนี้จะเกิดขึ้นได้ครั้งละครั้งแล้วปลดล็อกตารางเมื่อฉันทำเสร็จแล้ว Postgres มีวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่? โดยเฉพาะอย่างยิ่งฉันกังวลว่าการล็อกนั้นเป็นแบบโกลบอล แต่ไม่จำเป็นต้องเป็น - ฉันแค่ต้องทำให้แน่ใจว่าไม่มีใครพยายามป้อนรหัสนั้นดังนั้นบางทีการล็อกระดับแถวอาจจะใช้งานได้

2
ทริกเกอร์ FOR FOR EACH STATEMENT จะเรียกใช้งานบ่อยแค่ไหนหากการดำเนินการเกิดจากข้อ จำกัด FK ที่มี CASCADE UPDATE
ผมเข้าใจว่าทริกเกอร์บนเสื้อตารางที่กำหนดไว้กับจะทำงานเมื่อตอนที่ผมดำเนินการFOR EACH STATEMENTUPDATE t ... ทีนี้เมื่อtถูกกำหนดด้วยFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADEและฉันอัพเดทแถว N แถวaนั่นจะทำให้ทริกเกอร์ถูกเรียกครั้งเดียวหรือครั้ง N หรือไม่? สิ่งที่แตกต่างกันคือการเปลี่ยนแปลงในตารางที่เรียงซ้อนกันโดยข้อ จำกัด FK เป็นแบบเดี่ยวUPDATEมากกว่าหรือมากกว่าแบบอนุกรมUPDATEหรือไม่?

1
สแน็ปช็อตการจัดเก็บข้อมูลสำหรับการสำรองข้อมูลที่สอดคล้องกันของ postgresql - ข้อมูลและปริมาณการบันทึกที่แตกต่างกัน
เรากำลังเรียกใช้ Linux VM จำนวนมากในสภาพแวดล้อมการจัดเก็บข้อมูลแบบ vmware / ที่ใช้ร่วมกันซึ่งแต่ละตัวใช้งานอินสแตนซ์ของตนเองของ postgreSQL (รวม 9.0 และ 9.3) ปัจจุบัน VM ทั้งหมดตั้งอยู่บนพาร์ติชัน / ไดรฟ์หนึ่งรูทและเราประสบความสำเร็จอย่างมาก (~ 8 ปี) โดยใช้สแนปชอตจากสตอเรจของโวลุ่ม VMFS พื้นฐานสำหรับกระบวนการสำรองข้อมูล / คืนค่า (และทำซ้ำไปยังไซต์ DR ของเรา) เนื่องจากสถาปัตยกรรมของที่เก็บข้อมูลของเรามันจะเป็นประโยชน์ในการแยก postgres ไฟล์ WAL ออกเป็นปริมาณที่ไม่แคชส่วนใหญ่เขียนเพื่อให้เราปั่นแคชน้อยลงในด้านการจัดเก็บ ด้วยที่จัดเก็บข้อมูลของเรา (Nimble Storage) เราสามารถกำหนดทั้งสองวอลุ่มให้กับกลุ่มการป้องกัน / สแน็ปช็อตเดียว แต่ฉันไม่สามารถล้วงข้อมูลจากผู้ขายของเราได้ว่าสแน็ปช็อตจะเกิดขึ้นในเวลาเดียวกันในทุกวอลุ่มในกลุ่มการป้องกัน - มีแนวโน้มที่จะเป็นไปได้ แต่มีโอกาสเสมอที่มิลลิวินาทีแยกกัน ด้วยเหตุนี้เราจึงทำการทดลองบางอย่างขณะที่เขียนข้อมูลไปยังฐานข้อมูลให้เร็วที่สุดโดยใช้ pg_bench หลังจากการทดลองเรากู้คืนไดรฟ์ข้อมูล snapshot ของเราและเริ่ม VM + …

2
วิธีรับบริบทข้อยกเว้นสำหรับข้อยกเว้นที่ยกขึ้นด้วยตนเองใน PL / pgSQL
ใน Postgres เราได้รับ "การติดตามสแต็ก" ของข้อยกเว้นโดยใช้รหัสนี้: EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; มันใช้งานได้ดีสำหรับข้อยกเว้น "ธรรมชาติ" แต่ถ้าเราใช้ข้อยกเว้น RAISE EXCEPTION 'This is an error!'; ... จากนั้นไม่มีการติดตามสแต็ก ตามรายการส่งเมล์นี่อาจเป็นการจงใจแม้ว่าฉันจะทำไม่ได้สำหรับชีวิตของฉันก็หาสาเหตุ มันทำให้ผมอยากจะคิดหาวิธีอื่นที่จะโยนยกเว้นอื่น ๆ RAISEกว่าการใช้ ฉันเพิ่งจะเห็นบางสิ่งบางอย่างที่ชัดเจนหรือไม่? ไม่มีใครมีเคล็ดลับสำหรับเรื่องนี้? มีข้อยกเว้นที่ฉันสามารถให้ Postgres ขว้างได้ซึ่งจะมีสตริงที่ฉันเลือกไว้ดังนั้นฉันจะได้รับไม่เพียง แต่สตริงของฉันในข้อความแสดงข้อผิดพลาด แต่การติดตามสแต็กเต็มเช่นกัน? นี่คือตัวอย่างเต็มรูปแบบ: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; …

3
ที่อยู่อีเมลไม่ซ้ำกันหรือคีย์หลัก?
ฉันเป็นมือใหม่ในฐานข้อมูล ฉันอ่านไปรอบ ๆ และพบว่าอาจไม่ใช่ความคิดที่ดีในการใช้ที่อยู่อีเมลเป็นคีย์หลักเนื่องจากการเปรียบเทียบสตริงช้าลงซึ่งส่งผลต่อประสิทธิภาพในการรวมที่ซับซ้อนและหากการเปลี่ยนแปลงอีเมลฉันต้องเปลี่ยนคีย์ต่างประเทศทั้งหมดที่ต้องใช้จำนวนมาก ของความพยายาม แต่ถ้าตารางผู้ใช้ของฉันต้องการให้ผู้ใช้ทุกคนมีที่อยู่อีเมลและที่อยู่อีเมลเหล่านั้นควรไม่ซ้ำกันจะเพิ่มดัชนีที่ไม่ซ้ำกันในคอลัมน์อีเมลให้เพียงพอหรือไม่ เนื่องจากฟิลด์เฉพาะของ afaik อนุญาตให้มีค่า Null ในขณะที่ฉันต้องการให้ผู้ใช้ทุกคนมีที่อยู่อีเมลไม่อนุญาตให้มีค่า Null มีบางอย่างที่ฉันหายไปที่นี่หรือไม่? หรือฉันคาดว่าจะทำให้คอลัมน์อีเมลไม่ซ้ำกันและตรวจสอบให้แน่ใจในระหว่างการตรวจสอบข้อมูลบนเซิร์ฟเวอร์ที่ผู้ใช้ป้อนที่อยู่อีเมลเพื่อให้ผู้ใช้ทุกคนมีหรือไม่

1
ตารางไม่ได้รับการดูด
เรากำลังใช้ Postgres 9.2 บน Windows เพื่อเก็บข้อมูลไทม์ความถี่ต่ำ: เราแทรกแถวประมาณ 2,000 แถวต่อวินาทีทุก ๆ 24 ชั่วโมง 7 วันต่อสัปดาห์โดยไม่มีการหยุดทำงาน มีการDELETEวิ่งบนโต๊ะทุก ๆ 10 นาทีเพื่อให้ความยาวของตารางเท่ากับจำนวนวันที่กำหนด สิ่งนี้จบลงที่ความมั่นคง 900 ล้านแถว (สำหรับผู้ที่สนใจ, SELECT, INSERT, DELETEมี performant ทั้งหมด) เช่นDELETEนี้ในขณะที่การลบแถวไม่ได้ทำให้พื้นที่ดิสก์ว่าง เพื่อที่เราจะต้องVACUUMวิ่ง ฉันสอบถามpg_stat_user_tablesและVACUUMดูเหมือนว่าจะไม่ได้ทำงาน สิ่งที่ฉันเข้าใจจากเอกสารต่าง ๆ ( http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html ): ดูเหมือนว่าเราจะเปิดเครื่องดูดฝุ่นอัตโนมัติและจะทำงานในตารางอื่น สูญญากาศอัตโนมัติไม่ทำงานFULLและไม่ควรใช้การล็อคแบบเอกสิทธิ์บนโต๊ะ ไม่มีใครมีความคิดใด ๆ ว่าทำไมสูญญากาศอัตโนมัติไม่ทำงาน นี่เป็นเพียงเพราะตารางไม่ว่างอย่างต่อเนื่องหรือไม่ และมันก็คุ้มค่าที่จะทำงานVACUUMหลังจากทุกอย่างDELETEในกรณีนี้ (ซึ่งทำงานทุก 10 นาที)? แก้ไข: การสืบค้นโดยใช้ SQL จากลิงก์ SO …

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